[19/03/31-星期日] IO技术_四大抽象类_字符流( 字符输入流 Reader、 字符输出流 Writer )(含字符缓冲类)
一、概念
Reader
Reader用于读取的字符流抽象类,数据单位为字符。
int read(): 读取一个字符的数据,并将字符的值作为int类型返回(0-65535之间的一个值,即Unicode值)。如果未读出字符则返回-1(返回值为-1表示读取结束)。
void close() : 关闭流对象,释放相关系统资源。
1 /*字符输入流 Reader 仅用于字符(不算管中文还是英文)文件,不适合图片等 2 *字节流 FileInputStream 对应 字符流 FileReader 3 *字节流 FileOutputStream 对应字符流 FileWriter 4 * 字节流:图片 音乐 电影 文字 优先选用 5 * 字符流好处可以对中文字符进行有效处理,要处理中文是优先选字符流 6 1)字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元(2个字节)。 7 2)字节流默认不使用缓冲区;字符流使用缓冲区。 8 3)字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元; 9 字符流通常处理文本数据,它支持写入及读取Unicode码元。 10 4)底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。 11 字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,为向IO设备写入或读取字符串提供了一点点方便。 12 13 跟字节流差不多,但是这里的每一滴水是一个占16位的字符(char型变量是2个字节,16位的) 14 15 FileReader与字节流FileInputStream相似的方法 16 int read() 从字节流/字符流中读取单个字符,返回所读取的字节/字符数据 17 int read(type[] b/char c) 借助数组,从输入流中最多读取b.length()个字节或c.length()个字符的数据,将其存在字节数组b/ 18 字符数组c ,返回实际读取的字节/字符数 19 int read(type[] b/char c,int off,int len) 从字节/字符流中最多读取len个字节或字符的数据,将它们存在字节数组b/字符数组c 20 中,但不是从数组下标0开始的而是从数组下标off位置开始存储,存储长度为len 21 */ 22 package cn.sxt.test; 23 24 import java.io.File; 25 import java.io.FileReader; 26 import java.io.IOException; 27 import java.io.Reader; 28 29 public class Test_0330_Reader { 30 public static void main(String[] args) throws IOException { 31 //1、获取源文件 32 File file=new File("src.txt"); 33 //2、选择流 34 Reader reader=new FileReader(file); 35 36 //整合第一步和第二步更加简单 37 //FileReader reader2=new FileReader("src.txt"); 38 39 //3、进行操作 char:字符型16位占2个字节 40 char datas[]=new char[30];//开辟字符数组,接收读取的数据 41 42 //Reader类的read()方法:返回类型为int,作为整数读取的字符(占两个字节共16位)范围在 (0-65535),若已到流的末尾,返回 -1 43 //read()方法会将读取到的数据保存到开辟好的char型数组中,然后返回读取的字符长度,由于开辟的数组很大,内容无法全部填充 44 //在输出时将部分字符数组转换成字符串后输出。 45 int len=reader.read(datas,0,datas.length); //开始 取水滴,每个水滴是一个字符 46 for (int i=0;i<datas.length ;i++) { 47 System.out.printf("datas[%d]=%c;"+"\n",i,datas[i]); 48 } 49 50 51 String msg=new String(datas,0,len);//字符转字符串输出,和字节输出时一样的 52 System.out.println(msg); 53 54 //4、关闭流文件 55 reader.close(); 56 57 } 58 59 }
· Writer
Writer用于写入的字符流抽象类,数据单位为字符。
void write(int n): 向输出流中写入一个字符。
void close() : 关闭输出流对象,释放相关系统资源。
1 /* 2 *输出字符流 Writer 3 *字节流 FileOutputStream 对应字符流 FileWriter 4 *二者共同类似的方法 5 * 6 *void write(int c); 将指定的字节/字符输出到输出流中 其中c在字节流中代指字节 在字符流中代指字符 7 *void write(byte[]/char[] buf) 借助字节/字符数组完成输出 8 *void write(byte[]/char[] buf,int off,int len) 将字节/字符数组buf从off位置开始长度为len的字节/字符输出到输出流中 9 * 10 *字符流直接以字符为操作单位,所以Writer相对于字节流还多了2个方法 11 *void write(String str) 将字符串str包含的字符输出到指定的输出流中 12 *void write(String str,int off ,int len) 将字符串str从off的位置开始长度为len的字符输出到指定输出流中 13 * 14 */ 15 package cn.sxt.test; 16 17 import java.io.File; 18 import java.io.FileWriter; 19 import java.io.IOException; 20 import java.io.Writer; 21 22 public class Test_0330_Writer { 23 public static void main(String[] args) throws IOException { 24 /*File file=new File("des.txt"); 25 Writer writer=new FileWriter(file,true); 26 27 String src="1949中华人民共和国ABC"; 28 writer.write(src); 29 writer.close(); 30 */ 31 32 //\r是回车符 \n是换行符 "\r\n" 在一起是windows平台的换行符 单独“\n”是 linux平台换行符。 Java跨平台无所谓了 33 FileWriter fWriter =new FileWriter("poem.txt"); 34 fWriter.write("锦瑟-李商隐\n"); 35 fWriter.write("锦瑟无端五十弦,一弦一柱思华年。\r"); 36 fWriter.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。\n"); 37 fWriter.write("沧海月明珠有泪,蓝田日暖玉生烟。\r\n"); 38 fWriter.write("此情可待成追忆,只是当时已惘然。\r"); 39 40 fWriter.close(); 41 42 43 } 44 45 }
二、字符缓冲类
1 /**学习换缓冲字符类,是Reader和Writer类的亲儿子类 2 *缓冲字符流 BufferedReader/BufferedWriter 与 InputStreamReader/ OutputStreamWriter类平级 3 * 是前面常用的FileReader和FileWriter(文件字符类)的亲叔叔类 4 *关系:---------->1、BufferedReader/BufferedWriter(今天学习重点) 5 *Reader/Writer-->2、InputStreamReader/ OutputStreamWriter---》》2-1:FileReader和FileWriter(前边用过,文件字符类) 6 *--------------->3、 7 */ 8 package cn.sxt.test; 9 10 import java.io.BufferedReader; 11 import java.io.BufferedWriter; 12 import java.io.FileReader; 13 import java.io.FileWriter; 14 import java.io.IOException; 15 16 public class Test_0330_BufferedChar { 17 public static void main(String[] args) throws IOException { 18 FileReader file=new FileReader("TuLongDao.txt"); 19 FileWriter file2=new FileWriter("TuLongDao_copy.txt"); 20 21 BufferedReader src=new BufferedReader(file); 22 BufferedWriter dest=new BufferedWriter(file2); 23 24 //1、带字符缓冲数组的 25 long a=System.currentTimeMillis(); 26 String temp=null;//readLine()方法是BufferedReader特有的方法,可以对文本文件按行读取 27 while ((temp=src.readLine())!=null) { //返回值是一个字符串对象,即文本中的一行内容 28 //将读取的一行字符串写入文件中 29 dest.write(temp); 30 //下次写入之前先换行,否则会在上一行后边继续追加,而不是另起一行 31 dest.newLine(); 32 } 33 long b=System.currentTimeMillis(); 34 System.out.println("使用IO自带的字符缓冲类花费:"+(b-a)+"毫秒"); 35 36 src.close(); 37 dest.close(); 38 //2、不带文件缓冲数组的 39 FileReader file3=new FileReader("TuLongDao.txt"); 40 FileWriter file4=new FileWriter("TuLongDao_copy2.txt"); 41 42 long c=System.currentTimeMillis(); 43 int len=0;//一个一个字符复制 44 while ((len = file3.read()) != -1) { 45 file4.write(len); 46 } 47 long d=System.currentTimeMillis(); 48 System.out.println("不使用IO自带的字符缓冲类花费:"+(d-c)+"毫秒"); 49 file3.close(); 50 file4.close(); 51 52 } 53 54 55 }