字节流和字符流
- 区别:
- 读写单位:顾名思义,字节流以字节(byte)为读写单位,而字符流以字符为读写单位,根据码表映射字符,一次可能读入多个字符。
- 处理对象:字节流可以处理所有类型的数据(包括图片等),而字符流只能处理字符类型的纯文本数据。
- 字节流:一次写入或读出8位二进制。
- 字符流:一次写入或读出至少8位二进制。不同的字符所占的字节是不同的。
ASCII码:
一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。
UTF-8编码:
一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码:
一个英文等于两个字节,一个中文(含繁体)等于两个字节。
1、字节流
使用字节缓冲区
1、 将数据写到TXT中
OutputStream fos = new FileOutputStream("d:" + File.separator + "test.txt");
String str = "你好,世界";
fos.write(str.getBytes("UTF-8")); //将字符串变成字节byte数组,使用UTF-8编码
fos.close();
2、 将TXT导入到内存
InputStream fis = new FileInputStream("d:" + File.separator + "test.txt");
byte[] buf = new byte[1024];
int len; //用于记录读取的数据个数
String myStr = "";
while((len = fis.read(buf)) != -1) //将内容读到byte数组中,同时返回个数,若为-1,则内容读到底
{
myStr += new String(buf, 0, len, "UTF-8");
}
2、字符流
使用字符缓冲区
1、 将数据写到TXT中
Writer fw = new FileWriter("d:" + File.separator + "test.txt");
fw.write(str);
fw.close();
2、 将TXT导入内存中
Reader fr = new FileReader("d:" + File.separator + "test.txt");
char[] buf2 = new char[1024];
int len2;
String myStr2 = "";
while((len2 = fr.read(buf)) != -1)
{
myStr2 += new String(buf2, 0, len2); //将缓冲区buf2数组中的0到len2字符串读出
}
System.out.println(myStr2);
不使用字符缓冲区
1、 将数据写到TXT中
PrintWriter pw = new PrintWriter("d:" + File.separator + "test.txt", "UTF-8");
pw.write(str);
pw.close();
2、 将TXT导入内存中
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("d:" + File.separator + "test.txt"), "UTF-8"));
String myStr3 = br.readLine();
br.close();
System.out.println(myStr3);
3、缓冲流
1、 将数据写到TXT中
Writer fw = new FileWriter("d:\\1.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("OK!!");
bw.close();
System.out.println("写入成功!!");
2、 将TXT导入内存中
Reader fr = new FileReader("d:\\1.txt");
BufferedReader br = new BufferedReader(fr);
String line;
while((line=br.readLine()) != null) //读取一行
{
System.out.println(line);
}
br.close();
提示:
FileOutputStream 是 OutputStream 的直接子类
FileInputStream 也是 OutputStream 的直接子类
而 FileWriter 并不直接是 Writer 的子类,而是 OutputStreamWriter 的之类
而 FileReader 并不直接是 Reader 的子类,而是 InputStreamReader 的之类
所以,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入/输出流的。
PS : 所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
结论:只要是处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。