FileReader、FileWriter

前面说了文件字节输入流,现在来看看文件字符输入流。

1.FileReader

FileReader是文件字符输入流,用于读取硬盘数据到内存,只能处理简单的文本文件。

(1)如何new对象?

package com.dh.io;

import java.io.FileNotFoundException;
import java.io.FileReader;

public class FileReader01 {

    public static void main(String[] args) {

        try {
            //创建文件字符流对象
            FileReader fr = new FileReader("C:\\Users\\DH\\Desktop\\test.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

(2)如何读取数据?

准备一个txt文件:文件内容为abcdef。

  • int read()

    读取一个字符,返回值为读取的数据,读取完了数据到文件的末尾,值为-1。

package com.dh.io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReader01 {
    public static void main(String[] args) {

        FileReader fr = null;
        try {
            fr = new FileReader("C:\\Users\\DH\\Desktop\\test.txt");
            int i = 0;
            while ((i = fr.read())!=-1){
                System.out.println(i);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

结果:

97
98
99
100
101
102
  • int read(char[] c)

    每次读取c.length个字符,返回值为读取数据的字符个数,没有数据的读取返回-1。

package com.dh.io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReader02 {

    public static void main(String[] args) {

        FileReader fr = null;
        try {
            fr = new FileReader("C:\\Users\\DH\\Desktop\\test.txt");
            int i = 0;
            char[] chars = new char[1025*524];
            while ((i = fr.read(chars))!=-1){
                System.out.println(new String(chars,0,i));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

结果:

abcdef

2.FileWriter

FileReader是文件字符输出流,用于将内存中的数据写入硬盘,只能处理简单的文本文件。

(1)如何new对象?

package com.dh.io;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriter01 {

    public static void main(String[] args) {
        
        FileWriter fw = null;
        try {
            fw = new FileWriter("C:\\Users\\DH\\Desktop\\test.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(2)如何写数据?

  • void write(char[] c)

    package com.dh.io;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class FileWriter01 {
    
        public static void main(String[] args) {
    
            FileWriter fw = null;
            try {
                fw = new FileWriter("C:\\Users\\DH\\Desktop\\test.txt");
                char[] chars = {'c','h','i','n','a'};
                fw.write(chars);
                fw.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fw != null){
                    try {
                        fw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    结果:原先的abcdef已经不见了,只剩下新写入的china,所以,会先清空原文件内容再写入。

  • void write(char[] c,int off,int len)

    fr = new FileReader("C:\\Users\\DH\\Desktop\\test.txt");
    fw = new FileWriter("D:\\test.txt");
    char[] chars = new char[1024*512];
    int readCount = 0;
    while ((readCount = fr.read(chars))!=-1){
        fw.write(chars,0,readCount);
    }
    fw.flush();
    

    指定写的数据长度为char[]中前readCount个。

  • void write(String s)

    只需要将char[]改成字符串即可,也会先清空原文件内容再写入。

  • void append(char c)

  • 往文件中写入一个字符,也会先清空原文件内容再写入。

如果不想清空文件再写入,就在构造方法中再添加一个append参数,设置值为true。

3.复制文本文件

实现一边读一边写的文件复制操作:

package com.dh.io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopy02 {

    public static void main(String[] args) {
        FileReader fr = null;
        FileWriter fw = null;
        try {
            fr = new FileReader("C:\\Users\\DH\\Desktop\\test.txt");
            fw = new FileWriter("D:\\test.txt");
            char[] chars = new char[1024*512];
            int readCount = 0;
            while ((readCount = fr.read(chars))!=-1){
                fw.write(chars,0,readCount);
            }
            fw.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(fw != null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

由于本文和上一篇内容大同小异,所以本文写的较为简略,如果直接看到这篇文章,觉得很多地方没有写明白的,可以看一下上篇哟~

posted @ 2021-01-27 23:10  deng-hui  阅读(311)  评论(0编辑  收藏  举报