package com.i; import java.io.*; public class Test_buffer { /** * 字节缓冲区流:缓冲区的构造方法只是为字节流提供了一个缓冲区,底层还是由字节流来完成读写 * BufferedOutputStream: * BufferedInputStream: * * 构造方法: * public BufferedOutputStream(OutputStream out, * int size) * 创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。 * * 底层代码如下: * public BufferedOutputStream(OutputStream out) { * this(out, 8192); * } * * */ public static void main(String[] args) throws FileNotFoundException { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bb.txt")); BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bb.txt")); } }
编码解码概述图:
package com.i; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.Arrays; public class Test_liu { /** * 字节流读取数据可能出现的问题: * 汉字占两个字节。一个字节一个字节读取在控制台输出会无法识别出这是个汉字。 * * 文件的复制一个一个字节复制却可以得到汉字的原因:计算机底层会根据字节进行拼接,得到汉字。 * * 汉字的存储规则:第一个字节一定是负数,第二个可能是负数也可能是正数,大部分情况下是负数。 * * 编码表:看图 * * String的编码和解码: * 不加参数使用的是平台自己的编码格式 * 编码:byte[] bys = str.getBytes(StandardCharsets.ISO_8859_1); * 解码:new String(bys,StandardCharsets.UTF_8) * * 转换流中的解码和编码问题: * 转换流其实就是一个字符流。 * 转换流=字节流+编码表 * * 输入输出流使用方法: * OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("aa.txt"),“US_ASCII”); * InputStreamReader isr = new InputStreamReader(new FileInputStream("aa.txt"),"UTF-8"); * */ public static void main(String[] args) throws IOException { // String str = "你好啊"; // byte[] bys = str.getBytes(StandardCharsets.UTF_8); // // System.out.println(Arrays.toString(bys)); String str = "你好"; //[-28, -67, -96, -27, -91, -67] 说明平台默认的编码格式是UTF-8 // byte[] bys = str.getBytes(); //[63, 63] // byte[] bys = str.getBytes(StandardCharsets.ISO_8859_1); // System.out.println(Arrays.toString(bys)); // System.out.println(new String(bys,StandardCharsets.UTF_8)); //不使用默认UTF-8写入为乱码 // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("aa.txt"),StandardCharsets.US_ASCII); // osw.write("你好2"); //使用对应编码读数据 InputStreamReader isr = new InputStreamReader(new FileInputStream("aa.txt"),"UTF-8"); // int in; while(-1 != (in = isr.read()) ){ System.out.println("----------------------------"); System.out.println((char)in); } // osw.close(); isr.close(); } }
-----------字符流
package com.i; import java.io.*; public class Test_writer { /** *字符流写入的方法: * osw.write(97); * osw.write('b'); * osw.write(new char[]{'a', 'b', 'c', 'd', 'e'}); * osw.write(new char[]{'a','b','c','d','e'},1,3); * osw.write("abcde"); * osw.write("abcde",0,3); * * 字符流需要刷新的大概原因:一般字符占两个字节,无法判断最后一个字符是否只写了一半,系统不会对文件进行刷新,需要手动刷新。 * osw.flush(); * * osw.close();关闭字符流里默认调用了flush(); * * 字符流读数据的两种方法(主要目的复习): * int i; * // while(-1!=(i=isr.read())){ * // System.out.print((char)i); * // } * char[] cs = new char[1024]; * int len; * while(-1 != (len = isr.read(cs))){ * System.out.print(new String(cs,0,len)); * } */ public static void main(String[] args) throws IOException { // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("abb.txt")); // osw.write(97); // osw.write('b'); // osw.write(new char[]{'a', 'b', 'c', 'd', 'e'}); // osw.write(new char[]{'a','b','c','d','e'},1,3); // osw.write("abcde"); // osw.write("abcde",0,3); // osw.flush(); // osw.close(); InputStreamReader isr = new InputStreamReader(new FileInputStream("src/Test/Test_Students_Test.java")); // int i; // while(-1!=(i=isr.read())){ // System.out.print((char)i); // } char[] cs = new char[1024]; int len; while(-1 != (len = isr.read(cs))){ System.out.print(new String(cs,0,len)); } isr.close(); } }
----字符流缓冲区
package com.i; import java.io.*; public class Test_zfbuffer { /** * 字符缓冲区流: * BufferedReader br = new BufferedReader(new FileReader("")); * BufferedWriter bw = new BufferedWriter(new FileWriter("")); * * 字符流缓冲区的特殊功能: * BufferedWriter:new Line();//根据操作系统自动加上换行 * for (int i=0;i<3;i++){ * // bw.write("Hello"+i); * // bw.newLine();//根据操作系统自动加上换行 * // bw.flush();//一般写一行刷新一下,方便确认数据 * // } * * public String readLine() * throws IOException * 读一行文字。 一行被视为由换行符('\ n'),回车符('\ r')中的任何一个或随后的换行符终止。 * 结果 * 包含行的内容的字符串,不包括任何行终止字符,如果已达到流的末尾,则为null */ public static void main(String[] args) throws IOException { // BufferedWriter bw = new BufferedWriter(new FileWriter("aa.txt")); // // for (int i=0;i<3;i++){ // bw.write("Hello"+i); // bw.newLine();//根据操作系统自动加上换行 // bw.flush();//一般写一行刷新一下,方便确认数据 // } // // bw.close(); BufferedReader br = new BufferedReader(new FileReader("aa.txt")); String str; while((str = br.readLine()) != null){ System.out.println(str);// } br.close(); } }