[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 }

 

转载于:https://www.cnblogs.com/ID-qingxin/p/10631642.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值