JAVA字节流、字符流、缓冲流、转换流、内存流、字符编码( 六 )


  • ByteArrayInputStream:把数据从程序输出到内存中;
  • ByteArrayOutputStream:把数据从内存读取到程序中;
代码案例如下:
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;/** * 面向字节的数组流/内存流 */public class ByteArrayDemo {public static void main(String[] args) throws Exception {String content = "dfjdslkfjdlsfjld";// 字节数组输出流:程序 -> 内存ByteArrayOutputStream bas = new ByteArrayOutputStream();bas.write(content.getBytes());// 缓存字节区byte[] data = https://www.isolves.com/it/cxkf/yy/JAVA/2020-05-03/bas.toByteArray();// 字节数组输入流:内存 -> 程序ByteArrayInputStream bai = new ByteArrayInputStream(data);byte[] buffer = new byte[1024];int len = -1;while ((len = bai.read(buffer)) != -1) {String line = new String(buffer, 0, len);System.out.println(line);}// 关闭流bas.close();bai.close();}} 
面向字符的数组流/内存流 , CharArrayReader和CharArrayWriter , 该“流”会把数据暂存到内存中 , 以便实时读写 , 读写时使用的字符类型(char[]);
代码案例如下:
import java.io.CharArrayReader;import java.io.CharArrayWriter;/** * 面向字符的数组流/内存流 */public class CharArrayDemo {public static void main(String[] args) throws Exception {// 字符数组输出流CharArrayWriter writer = new CharArrayWriter();writer.write("这世界很美好");char[] data = https://www.isolves.com/it/cxkf/yy/JAVA/2020-05-03/writer.toCharArray();// 字符数组输入流CharArrayReader reader = new CharArrayReader(data);char[] buffer = new char[1024];int len = -1;while ((len = reader.read(buffer)) != -1) {String line = new String(buffer, 0, len);System.out.println(line);}// 关闭流writer.close();reader.close();}} 
面向字符串的内存流 , StringReader/StringWriter , 把数据临时存储到字符串中 , 也同样是在内存中 , 但数据的类型是字符串;
案例代码如下:
import java.io.StringReader;import java.io.StringWriter;/** * 面向字符串的内存流 */public class StringWriterReaderDemo {public static void main(String[] args) throws Exception {// 字符串输出流StringWriter stringWriter = new StringWriter();stringWriter.write("这世界很美好");stringWriter.write("社会也很美好");System.out.println(stringWriter.toString());// 字符串输入流StringReader stringReader = new StringReader(stringWriter.toString());char[] buffer = new char[1024];int len = -1;while ((len = stringReader.read(buffer)) != -1) {String line = new String(buffer, 0, len);System.out.println(line);}// 关闭流stringReader.close();stringWriter.close();}} 
合并流合并流 , SequenceInputStream:能够将2个或者以上的InputStream合并成一个单一的InputStream , 进而进行合并操作;
import java.io.FileInputStream;import java.io.InputStream;import java.io.SequenceInputStream;/** * 合并流 */public class SequenceInputStreamDemo {public static void main(String[] args) throws Exception {// 创建输入队列流SequenceInputStream seqIn = new SequenceInputStream(new FileInputStream("stream1.txt"),new FileInputStream("stream2.txt"),new FileInputStream("stream3.txt"));byte[] buffer = new byte[1024];int len = -1;while ((len = seqIn.read(buffer)) != -1) {String line = new String(buffer, 0, len);System.out.println(line);}seqIn.close();}} 
字符编码字符编码的发展历程:
阶段1:计算机只认识数字0和1 , 计算机里的一切数据都是以数字来表示;因为英文符号有限 , 所以规定使用的字节的最高位是0 , 每一个字节都是以0~127之间的数字来表示 , 比如:A对应65 , a对应97..这就是美国标准信息交换码-ASCII;
阶段2:随着计算机在全球的普及 , 很多国家和地区都把自己的字符引入了计算机中 , 比如汉字;但是ASCII中的一个字节能表示数字范围太小 , 不能包含所有的中文汉字 , 所以就规定使用两个字节来表示一个汉字;
所以决定 , 原有的ASCII字符的编码保持不变 , 仍然使用一个字节表示;为了区别一个中文字符与两个ASCII码字符:
  • 中文字符的每个字节最高位规定为1(中文的二进制是负数) , 这个规范就是GB2312编码;
  • 后来在GB2312的基础上增加了更多的中文字符 , 比如简体中文 , GBK应运而生;
阶段3:新的问题产生了 , 在中国是认识汉字的 , 支持GBK编码 , 但是如果把GBK编码的汉字传递给其他国家 , 该国家的编码表中没有收录该汉字的字符 , 故不能正常显示 , 很容易就出现了乱码 。


推荐阅读