【Java篇】有关字节、字符流的知识你还记得吗?
字节流
InputStream / OutputStream类
字节流是以字节为单位进行读取的数据流。常用来处理二进制数据的输入输出,如键盘输入、网络通信。但字节流不能正确显示 Unicode 字符。
输入流
InputStream in = new InputStream(socket.getIntputStream()); // 创建输入对象 int len = in.available(); // 读取输入对象长度 char c = (char)in.read(); // 读取输入字节 byte[] b = new byte[len]; // 连续读取输入字节 in.read(b); in.close(); // 关闭输入对象
输出流
OutputStream out = new OutputStream(socket.getOutputStream()); // 创建输出对象 byte[] b = {1,2,3}; // 导入输出字节 out.write(b); out.flush(); // 刷新输出对象,输出字节 out.close(); // 关闭输出对象,输出字节
字符流
Reader / Writer类
字符流是以字符为单位进行读取的数据流。只能用于处理文本数据。且所有文本数据,即经过 Unicode 编码的数据都必须以字符流的形式呈现。
我们在 Java 程序中处理数据往往需要用到字符流,但在通信中却需要使用字节流。这就需要进行数据格式转化。
InputStreamReader 类
Reader 类子类。将字节流数据转换成字符流,常用于读取控制台输入或读取网络通信。可指定编码方式,否则使用 IDE 默认编码方式。
// 读取键盘输入 InputStreamReader in = new InputStreamReader(System.in); // 读取套接字通信,并指定编码格式 InputStreamReader in = new InputStreamReader(socket.getInputStream(), "UTF-8");
OutputStreamWriter 类
Writer 类子类。将字符流数据转换成字节流,常用于发送网络通信。
// 数据转化为字节流发送 OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
字节流和字符流的区别
1.两者的组成不同:(这也直接影响我们后面读取数据时的方式不同)
字节流的组成:字节流是由字节组成的。 字符流的组成:字符流是由字符组成的。 2.计算机对两者的处理方式不同:
字节流:主要用在处理二进制数据,它是按字节来处理的但实际中很多的数据是文本。 字符流:按虚拟机的encode来处理,也就是要进行字符集的转化。
注:Java里字符由两个字节组成. 1字符=2字节
实际上 我们可以理解为字符流=字节流+编码表,为什么可以这样理解呢,因为字节流读数据是默认采用了ASCII编码,而ASCll编码是主要针对一个字节代表一个字符的数据,而我们中文汉字是一个字符=两个字节,如果采用了ASCll编码读取汉字就会出现乱码,在字节流中我们没有办法改变采用其他编码种类,而字符流可以,它采用好似UTF编码,是支持中文的,我们还可以在字符流对象中设置采用别的编码种类,字符流就是在字节流的基础上增加了可以选择其他编码种类的功能。