字节流和字符流的区别:
1.两者的组成不同:(这也直接影响我们后面读取数据时的方式不同)读数据方法https://blog.csdn.net/m0_64231944/article/details/124020398?spm=1001.2014.3001.5501
字节流的组成:字节流是由字节组成的。
字符流的组成:字符流是由字符组成的。
2.计算机对两者的处理方式不同:
字节流:主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本。
字符流:按虚拟机的encode来处理,也就是要进行字符集的转化。
注:Java里字符由两个字节组成. 1字符=2字节
实际上 我们可以理解为字符流=字节流+编码表,为什么可以这样理解呢,因为字节流读数据是默认采用了ASCII编码,而ASCll编码是主要针对一个字节代表一个字符的数据,而我们中文汉字是一个字符=两个字节,如果采用了ASCll编码读取汉字就会出现乱码,在字节流中我们没有办法改变采用其他编码种类,而字符流可以,它采用好似UTF编码,是支持中文的,我们还可以在字符流对象中设置采用别的编码种类,字符流就是在字节流的基础上增加了可以选择其他编码种类的功能。
字节流代码展示:
字符流主要构造方法:
/*
字符流主要构造方法:
public OutputStreamWriter(OutputStream out);//默认采用UTF-8编码
public OutputStreamWriter(OutputStream out , String charsetName);//需要自己设置编码种类String charsetName
public InputStreamReader(InputStream in);//默认采用UTF-8编码
public InputStreamReader(InputStream in , String charsetName);//需要自己设置编码种类String charsetName
*/
字符流代码演示,及其主要方法:
package io;
import javax.imageio.IIOException;
import java.io.*;
/*
IO流,字符流知识点总结:
*/
public class IoDemo01 {
public static void main(String[] args) throws IOException {
/*
字符流主要构造方法:
public OutputStreamWriter(OutputStream out);//默认采用UTF-8编码
public OutputStreamWriter(OutputStream out , String charsetName);//需要自己设置编码种类String charsetName
public InputStreamReader(InputStream in);//默认采用UTF-8编码
public InputStreamReader(InputStream in , String charsetName);//需要自己设置编码种类String charsetName
*/
//创建字符输出流对象
// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\mycode\\word.txt"));
// BufferedWriter osw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\mycode\\word.txt"));
BufferedWriter osw = new BufferedWriter(new FileWriter("D:\\mycode\\word.txt"));
//字符流写数据的五种方法
/*
void write(int c);写一个字符
void write(char[] chs);写一个字符数组
void write(char[] chs,int off,int len);写入字符数组的一部分
void write(String str);写一个字符串
void write(String str,int off,int len);写一个字符串的一部分
*/
osw.write(6);
osw.write("以梦为马,不负韶华");
osw.flush();//刷新流
osw.close();
//创建字符输入流对象
// InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\mycode\\word1.txt"));
// BufferedReader isr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\mycode\\word1.txt")));
BufferedReader isr = new BufferedReader(new FileReader("D:\\mycode\\word1.txt"));
//字符流读数据(一次读一个字符数组)
char[] chs = new char[2048];
int len = -1;
while ((len = isr.read(chs)) != -1) {
System.out.println(new String(chs, 0, len));
}
//字符流读数据(一次读一个字符)
int by;
while ((by = isr.read()) != -1) {
// System.out.println((char)by);//因为用的是println,所以输出一个字符进行换行操作一次
System.out.print((char) by);//用的是print,输出的结果在一行
}
isr.close();
}
}
fiush()方法知识详情:
flush() 方法是清空,即清空缓冲区数据,就是说,你用读写流的时候,其实数据是先被读到了内存中, 然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了, 因为还有一部分有可能留在内存这个缓冲区中.这时候如果你调用了, close方法关闭了读写流,那么这部分数据就会丢失,
所以应该再关闭读写流之前先flush(),首先得清空缓冲区的数据.
刷新就是将内存(缓冲区)中的数据(是一个字节数组)强制写到磁盘/浏览器/控制台/文件
如图:
从键盘输入的数据不会直接到磁盘,而是先被存到了缓冲区里,如果直接使用close()方法,会直接从红色箭头处截断,那么缓冲区里面的数据就会丢失,而flush()方法,会先将缓冲区里面的数据刷新到磁盘。所以关闭流之前需要先调用flush()方法。