java字节流读取字符

java字节流读取一个字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.*;

public class MyTest
{

public static void main(String args[])
{

File f = new File("E:\\text.txt");
try
{
FileInputStream fis = new FileInputStream(f);
System.out.println((char)fis.read());
}
catch(Exception e){}
}
}

java字节流读取多个字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.*;

public class MyTest
{

public static void main(String args[])
{

File f1 = new File("E:\\text.txt");
byte[] b = new byte[1024];//利用byte将字节保存起来,然后利用String一起输出。

try
{
FileInputStream fis = new FileInputStream(f1);

int len = fis.available();
for (int i = 0; i < len; i++)
{
fis.read(b);
}
System.out.print(new String(b));
fis.close();//这句省掉也可以,close的作用是关闭流以及有flush的作用。字符流的输出就需要用到这个了
}
catch(Exception e){}
}
}

上面在“读取多个字符”的时候用到了int len = fis.available();
available()的值并不是fis的长度,而是剩下字节的长度。所以每次读取都会减少,但在第一次读的时候,是整个fis的长度。这里利用一个临时的int将其保存起来用作for循环的判断。

另外,在txt文本中输入汉字时,打印的文字出现了乱码的现象。然后,在学校的机子上写字符流的时候没出现乱码,曾误以为这是字符流和字节流的区别之一。后来,到自己的机子上写字符流的时候居然也出现了乱码,困惑了很久,在网上查了一下,于是改了eclipse的工程文本格式为utf-8,没啥效果。也用了在代码里设置文件为“utf-8”,依然没用。后来意识到是不是txt的格式问题,于是另存为的时候改为了utf-8格式,然后就OK了。哎,也是记事本的坑啊!这才意识到上次在学校机子上试的文本格式(直接用的桌面上的一个txt,而不是自己创建的)可能是“utf-8”或者unicode格式的!
好吧,这也是偷懒的下场。

java字节流复制大文件

这里用字节流复制一个50M的rar压缩文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.*;

public class MyTest
{

public static void main(String args[])
{

File f1 = new File("G:\\AndroidCode.rar");
File f2 = new File("G:\\AndroidCode2.rar");
try
{
FileInputStream fis = new FileInputStream(f1);
FileOutputStream fos = new FileOutputStream(f2);
byte[] b = new byte[1024];//用2的N次方,效率会高一点
//每次fis.available()是文件的字节大小,这里是50M(50兆字节(mb)=52428800字节(b))
int len = fis.available()/1024 + 1;
for (int i = 0; i < len; i++)
{
fis.read(b);
fos.write(b);
}
// int size = fis.read(b);
// fos.write(b, 0, size);
//这两句是由于len+1,如果文件最后一次循环,不足1024B,那么依旧会写入1024,这就造成了空间的浪费。
//而这两句的处理就是对最后一次循环的处理,比如,如果只多出50B,那么就写50B。
//但是,我感觉没太大必要,除非你一次写入的几百兆的;而且我复制的时候,还和没加一样,都多出来一些空间
}
catch(Exception e){}
}
}

说一下子字节的转换吧。
1MB = 1024KB
1KB = 1024B
1B = 8b(B是byte字节;b是bit位)
1个字 = 2个字节

关于字节和字符:
字节(Byte):计算机中存储数据的单元,是一个很具体的存储空间。 0x01, 0x45, 0xFA, …… 1个字节等于8位二进制。
字符: 人们使用的记号,抽象意义上的一个符号。 ‘1’, ‘中’, ‘a’, ‘$’, ‘¥’, ……

由于不同编码所指定的标准是不同的,所以字符和字节的关系因根据不同语言所使用的具体编码来确定。
比如:按照ANSI编码标准,标点符号、数字、大小写字母都占一个字节,汉字占2个字节。按照UNICODE标准所有字符都占2个字节。

Java当中字符是采用Unicode编码标准;但这是在jvm中的,程序的编码还得看IDE的具体编码设置。