JavaIO流之字符流
字符流
Reader
InputStreamReader
- FileReader:专门用于处理文件的字符读取流对象。
Writer
OutputStreamWriter
- FileWriter:专门用于处理文件的字符写入流对象
Reader中的常见的方法
1. int read():
- 读取一个字符。返回的是读到的那个字符。如果读到流的末尾,返回-1.
2. int read(char[]):
- 将读到的字符存入指定的数组中,返回的是读到的字符个数,也就是往数组里装的元素的个数。如果读到流的末尾,返回-1.
3. close():
- 读取字符其实用的是window系统的功能,就希望使用完毕后,进行资源的释放。
Writer中的常见的方法
- write(ch): 将一个字符写入到流中。
- write(char[]): 将一个字符数组写入到流中。
- write(String): 将一个字符串写入到流中。
- flush():刷新流,将流中的数据刷新到目的地中,流还存在。
- close():关闭资源:在关闭前会先调用flush(),刷新流中的数据去目的地。然流关闭。
FileWriter
该类没有特有的方法。只有自己的构造函数。
该类特点在于:
- 用于处理文本文件。
- 该类中有默认的编码表,
- 该类中有临时缓冲。
构造函数:在写入流对象初始化时,必须要有一个存储数据的目的地。
FileWriter(String filename): 该构造函数做了什么事情呢?
- 调用系统资源。
- 在指定位置,创建一个文件。
注意:如果该文件已存在,将会被覆盖。
FileWriter(String filename,boolean append):
- 该构造函数:当传入的boolean类型值为true时,会在指定文件末尾处进行数据的续写。
FileReader
- 用于读取文本文件的流对象。
- 用于关联文本文件。
构造函数:在读取流对象初始化的时候,必须要指定一个被读取的文件。
- 如果该文件不存在会发生FileNotFoundException.
FileReader(String filename);
- 对于读取或者写入流对象的构造函数,以及读写方法,还有刷新关闭功能都会抛出IOException或其子类。
- 所以都要进行处理,或者throws抛出,或者try、catch处理。
例子
将文本数据存储到一个文件:
import java.io.*; public class TestFileWriter1 { public static void main(String[] args){ FileWriter fw=null; try{ fw=new FileWriter("D:\JAVA练习代码\123.txt"); fw.write("abcdec"); fw.flush(); fw.write("kkkk"); }catch(IOException e){ System.out.println(e.toString()); } finally{ if(fw!=null) try{ fw.close(); }catch (IOException e) { System.out.println("close"+e.toString()); } } } }
另一个小细节:
当指定绝对路径时,定义目录分隔符有两种方式:
- 反斜线 但是一定要写两个。\ new FileWriter("c:\cai.txt");
- 斜线 / 写一个即可。 new FileWriter("c:/cai.txt");
读一个字符就存入字符数组里,读完1Kb再打印。
import java.io.*; public class TestFileReader1 { public static void main(String[] args){ FileReader fr=null; try{ fr=new FileReader("D:\JAVA练习代码\abc.txt"); char[]buf=new char[1024]; //该长度通常都是1024的整数倍 int len=0; while((len=fr.read(buf))!=-1){ System.out.println(new String(buf,0,len)); } }catch(IOException e){ System.out.println(e); } finally{ if(fr!=null){ try{ fr.close(); }catch(IOException e){ System.out.println("close"+e); } } } } }
字符流的缓冲区:
- 缓冲区的出现提高了对流的操作效率。
原理:其实就是将数组进行封装。
对应的对象:
BufferedWriter:
特有方法:
newLine():跨平台的换行符。
BufferedReader:
特有方法:
readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。
- 使用缓冲区对象时,要明确缓冲的存在是为了增强流的功能而存在,所以在简历缓冲区对象时,要现有流对象存在。
- 其实缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行了临时存储,为了提高操作数据的效率。
代码上的体现:
写入缓冲区对象:
//建立缓冲区对象必须把流对象作为参数传递给缓冲区的构造函数。 BufferedWriter bw=new BufferedWriter(new FileWriter(“abc.txt”)); bw.write("abce");//将数据写入到了缓冲区。 bw.flush();//对缓冲区的数据进行刷新。将数据刷到目的地中。 bw.close();//关闭缓冲区,其实关闭的是被包装在内部的流对象。 读取缓冲区对象: BufferedReader br=new BufferedReader(new FileReader("abc.txt")); String s=null;
import java.io.*; public class TestBufferStream { public static void main(String[] args){ try{ BufferedWriter bw=new BufferedWriter(new FileWriter("D:\Java练习代码\abc.txt")); BufferedReader br=new BufferedReader(new FileReader("D:\Java练习代码\abc.txt")); String s=null; for(int i=1;i<=100;i++){ s=String.valueOf(Math.random()); bw.write(s); bw.newLine(); } bw.flush(); while((s=br.readLine())!=null){ System.out.println(s); } bw.close(); br.close(); }catch (IOException e){ e.printStackTrace(); } } }