字符流:顾名思义操作(读、写)字符的流对象
字符流的体系:
1、Reader
|--BufferedReader:从字符输入流中读取文本到缓冲区,便于有效读取字符,数组,和行
|--LineNumberReader:有行号(setLineNumber(int) 、getLineNumber())
|--InputStreamReader:字节流到字符流
|--FileReader:将字符文件数据读取到缓冲区中
2、Writer
|--BufferedWriter:将文本写入字符输出流到缓冲区,便于有效写入单个字符,数组和字符串。
|--OutputStreamWriter:字节流到字符流
|--FileWriter:将缓冲区数据写入字符文件
一、FileReader和FileWriter
FileReader原理:将指定的文本文件读到内存中
FileWriter原理:把内存中字符数据写入到实体设备上(落地)。
以文本文件Copy为例:
1 private static final int BUFFER_SIZE = 1024; 2 3 public static void main(String[] args) { 4 fileCopy(); 5 } 6 7 private static void fileCopy() { 8 FileReader fr=null; 9 FileWriter fw=null; 10 try { 11 /* 12 * 1、必须要明确被读取的文件,一定要确认文件时存在的。 13 */ 14 fr=new FileReader("demo.txt"); 15 /* 16 * 2、明确copy目的地 17 * 如果文件不存在,自动创建 如果文件存在,会覆盖(删除再创建) 18 */ 19 fw=new FileWriter("CopyDemo2.txt"); 20 21 //方式一:一个字符读取 22 // int ch=0; 23 // while((ch=fr.read())!=-1) { 24 // fw.write(ch); 25 // } 26 27 //方式二:先把读取数据放入固定缓存中,然后把固定缓存写到硬盘 28 //创建一个临时容器,用于缓存读取到的字符 29 char[] buff=new char[BUFFER_SIZE]; 30 //记录读取到的字符数(其实就时向数组中装的字符个数) 31 int len=0; 32 while((len=fr.read(buff))!=-1) { 33 /* 34 * 把内容存储器读到内容全部写入到输出流中 35 * 此时没有写入实体设备中(这里指硬盘) 36 */ 37 fw.write(buff,0,len); 38 } 39 40 } catch (IOException e) { 41 throw new RuntimeException(); 42 }finally { 43 if(fr!=null) 44 try { 45 fr.close(); 46 } catch (IOException e) { 47 48 throw new RuntimeException(); 49 } 50 if(fw!=null) 51 try { 52 fw.close();//先刷新,将输出流中数据写到实体设备中,关闭系统资源, 53 } catch (IOException e) { 54 throw new RuntimeException(); 55 } 56 } 57 }
分析:
二、BufferedReader和BufferedWriter
BufferedReader和BufferedWriter其实就是Reader和Writer的装饰类,主要目的是为了提高读写效率。
Copy文本文件实例:
1 private static void fileCopy() { 2 BufferedReader br = null; 3 BufferedWriter bw = null; 4 try { 5 /* 6 * 1、必须要明确被读取的文件,一定要确认文件时存在的。 7 */ 8 FileReader fr = new FileReader("demo.txt"); 9 br = new BufferedReader(fr); 10 /* 11 * 2、明确copy目的地 如果文件不存在,自动创建 如果文件存在,会覆盖(删除再创建) 12 */ 13 FileWriter fw = new FileWriter("CopyDemo2.txt"); 14 bw = new BufferedWriter(fw); 15 /* 16 String len = null; 17 while ((len = br.readLine()) != null) 18 { 19 bw.write(len); 20 bw.newLine();//会在文本文件最后多一个空行,没想到解决方法 21 bw.flush();//防止程序非正常停止 22 } 23 */ 24 /* 25 int len = 0; 26 while ((len = br.read()) != -1) { 27 bw.write(len); 28 bw.flush();//防止程序非正常停止 29 } 30 */ 31 32 char[] buff=new char[1024]; 33 int len = 0; 34 while ((len = br.read(buff)) != -1) { 35 bw.write(buff,0,len); 36 bw.flush();//防止程序非正常停止 37 } 38 39 40 } catch (IOException e) { 41 throw new RuntimeException(); 42 } finally { 43 if (br != null) 44 try { 45 br.close(); 46 } catch (IOException e) { 47 48 throw new RuntimeException(); 49 } 50 if (bw != null) 51 try { 52 bw.close();// 先刷新,将输出流中数据写到实体设备中,关闭系统资源, 53 } catch (IOException e) { 54 throw new RuntimeException(); 55 } 56 } 57 }