Java操作文件简谈

来源:互联网 发布:java loader.getparent 编辑:程序博客网 时间:2024/06/16 22:54
传说很久以前的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()), 还能提高读取速度. 例如:

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();但是文件中却有内容, 这就说明正常的关闭流是可以自动刷新缓冲区的. 所以, 一般情况下都尽可能地在必要的地方关闭文件流.

0 0