FileReader&FileWriter用法示例

使用FileReader读取文本文件内容

使用Throws方式

void test1() throws IOException {
    File file = new File("dir/1.txt");

    if (!file.exists()) {
        throw new IOException("File not found");
    }

    FileReader fileReader = new FileReader(file);

    int data = 0;
    while ((data = fileReader.read()) > -1) {
        System.out.print((char) data);
    }

    fileReader.close();
}

使用try……catch……方法

void test2 ()
{
    FileReader fileReader = null;
    try {
        fileReader = new FileReader("dir/1.txt");

        int data;
        while ((data = fileReader.read()) > -1) {
            System.out.print((char) data);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fileReader != null) {
            try {
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

一次只读入一个字符效率太低,我们来一次读入多个字符。

void test3 ()
{
    FileReader fileReader = null;
    try {
        fileReader = new FileReader("dir/1.txt");

        char[] datas = new char[1024];
        int num;
        while ((num = fileReader.read(datas)) > -1) {
            //                 方式一:
            //                for (int i=0; i<num; i++) {
            //                    System.out.print(datas[i]);
            //                }
            // 方式二
            String str = new String(datas, 0, num);
            System.out.print(str);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fileReader != null) {
            try {
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

使用FileWriter向文件写内容

使用FileWriter操作一个文本文件时,若该文件不存在,则会创建该文件。

void test4 ()
{
    FileWriter fileWriter = null;
    try {
        // 使用覆盖方式写入文件
        // fileWriter = new FileWriter("dir/2.txt");
        // 追加方式写入
        fileWriter = new FileWriter("dir/2.txt", true);

        fileWriter.append('h');  // 写入字符
        fileWriter.append("ello"); // 写入字符串
        fileWriter.append(" java.\n"); // 写入字符串
        fileWriter.append("hello c++\n"); // 写入字符串
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fileWriter != null) {
            try {
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

try-with-resources

上述的代码中关闭资源太过繁琐,这个问题我们用jdk7的新特性:try-with-resources来修改下

try (FileWriter fileWriter = new FileWriter("dir/2.txt", true)){
    fileWriter.append('h');  // 写入字符
    fileWriter.append("ello"); // 写入字符串
    fileWriter.append(" java.\n"); // 写入字符串
    fileWriter.append("hello c++\n"); // 写入字符串
} catch (IOException e) {
    e.printStackTrace();
}

写在try括号里的资源会被自动关闭,所以就不用写finally了。

练习

使用FileReader以及FileWriter完成文本文件复制的功能。

@Test
void test6 ()
{
    try (
        FileReader fileReader = new FileReader("dir/1.txt");
        FileWriter fileWriter = new FileWriter("dir/3.txt");
    ) {
        char[] chars = new char[1024];
        int len;

        while ((len = fileReader.read(chars)) > -1) {
            fileWriter.write(chars, 0, len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Posted in: IO