下班了,不想回去,小结一下。。。
传说很久以前的Java是不支持对文本文件的处理的,后来为了弥补这个遗憾而新引入了Reader和Writer两个抽象类。最常用的就是Writer中的write(char[] ch,int off,int length)/flush()/close()以及Reader中的read(char[] ch,int off,int length)和close()方法都是抽象方法。子类分别实现他们。例如:FileReader和FileWriter类。
简单的读取文本文件的内容可以这样实现:
- import java.io.FileReader;
- public class Test {
- public static void main(String[] args) {
- try {
- FileReader fr = new FileReader("d://java.txt");
- int ch = 0;
- while ((ch = fr.read()) != -1) {
- System.out.print((char) ch+""); }
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("操作文件时候出问题了");
- }
- }
- }
但是这样读出来的文件是按照字符读出来的,阅读起来不方便,可以增加判定条件,改为:
- import java.io.FileReader;
- public class Test {
- public static void main(String[] args) {
- try {
- FileReader fr = new FileReader("d://java.txt");
- int ch = 0;
- while ((ch = fr.read()) != -1) {
- System.out.print((char) ch+"");
- if(ch == 0){
- System.out.println();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("操作文件时候出问题了");
- }
- }
- }
其中,read方法返回读取到的下个字符,但是在上面的代码中实现按行读取还得做判断,岂不是很麻烦,所以,我们可以使用BufferedReader对Reader来进行封装,这样不仅可以按行读取文本内容(readLine()),还能提高读取速度。例如:
- <pre class="brush:java;gutter:true;">
- import java.io.BufferedReader;
- import java.io.FileInputStream;
- import java.io.InputStreamReader;
- public class Test {
- public static void main(String[] args) {
- try {
- BufferedReader br =
- new BufferedReader(new InputStreamReader(new FileInputStream("d://java.txt")));
- String data = "";
- while((data = br.readLine()) != null){
- System.out.println(data);
- }
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("操作文件时候出问题了");
- }
- }
- }
Reader是读取文件内容,那么很理所应当的Writer就是要向文件中写内容,但是在写文件的过程中,需要注意缓冲区的问题,这个是为了提高效率,但是在某些情况下可能会导致缓冲区未能正常刷新(例如下面的例子),这样就需要我们主动调用flush()方法刷新缓冲区:
- import java.io.FileWriter;
- public class Test {
- public static void main(String[] args) {
- try {
- FileWriter fw = new FileWriter("d://c.txt");
- String data = "hello,Mr Shu!!!!";
- fw.write(data, 0, data.length());
- // fw.flush();
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("操作文件时候出问题了");
- }
- }
- }
上面的代码执行后,c.txt中并没有数据,那是因为缓冲区未能正常刷新,可以去掉上面的fw.flush();前的注视。
再看下面的程序:
- import java.io.FileWriter;
- public class Test {
- public static void main(String[] args) {
- FileWriter fw = null;
- try {
- fw = new FileWriter("d://c.txt");
- String data = "hello,Mr Shu!!!!";
- fw.write(data, 0, data.length());
- // fw.flush();
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("操作文件时候出问题了");
- } finally {
- try{
- fw.close();
- }catch(Exception ex){
- ex.printStackTrace();
- System.out.println("系统好像出问题了");
- }
- }
- }
- }
注释掉了fw.flush();但是文件中却有内容,这就说明正常的关闭流是可以自动刷新缓冲区的。所以,一般情况下都尽可能地在必要的地方关闭文件流。
未完待续…………
转载于:https://blog.51cto.com/hanbin/879813