1、File类
Java文件类以抽象的方式代表文件名和目录路径名。
该类主要用于文件和目录的创建、文件的查找和文件的删除等。
File对象代表磁盘中实际存在的文件和目录,通过创建File对象指定了我们操作的对象。
通过以下构造方法创建一个File对象:

通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。

File(File parent, String child);

通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。

File(String pathname)

根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

File(String parent, String child)

通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。

File(URI uri)

其他操作方法详情参考:
https://www.runoob.com/java/java-file.html

2、FileWriter类

FileWriter 类从 OutputStreamWriter 类继承而来。该类按字符向流中写入数据。指定操作对象,并向对象按字符写入数据。

可以通过以下几种构造方法创建需要的对象:

在给出 File 对象的情况下构造一个 FileWriter 对象。

FileWriter(File file)

在给出 File 对象的情况下构造一个 FileWriter 对象。

FileWriter(File file, boolean append)

参数:

  • file:要写入数据的 File 对象
  • append:如果 append 参数为 true,则将字节写入文件末尾处,相当于追加信息。如果 append 参数为 false,则写入文件开始处。

更详细描述地址:https://www.runoob.com/java/java-filewriter.html

3、FileReader类

FileReader类从InputStreamReader类继承而来。该类按字符读取流中数据。

可以通过以下几种构造方法创建需要的对象。

在给定从中读取数据的 File 的情况下创建一个新 FileReader。

FileReader(File file)

在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。

FileReader(FileDescriptor fd)

在给定从中读取数据的文件名的情况下创建一个新 FileReader。

FileReader(String fileName)

详细地址:
https://www.runoob.com/java/java-filereader.html

4、BufferedReader和BufferedWriter

为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。BufferedReader用于加快读取字符的速度,BufferedWriter用于加快写入的速度

BufferedReader和BufferedWriter类各拥有8192个字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。

BufferedReader
BufferedReader是为了提供读的效率而设计的一个包装类,它可以包装字符流。可以从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

构造方法
方法 描述
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
成员方法
方法 描述
int read() 读取单个字符。
int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
String readLine() 读取一个文本行。
long skip(long n) 跳过字符。
boolean ready() 判断此流是否已准备好被读取。
void close() 关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit) 标记流中的当前位置。
boolean markSupported() 判断此流是否支持 mark() 操作(它一定支持)。
void reset() 将流重置到最新的标记。
读取文件实例
读取文件: 一个字符一个字符的读取

5、总结
File指定操作的对象。
FileReader和FileWriter按字符读取写入数据。
BufferedReader和BufferedWriter,引入了缓冲机制,进行字符批量的读写。

public void testCopy() throws IOException {

        File testfile = new File("d:/files/test.txt");
        File destfile = new File("d:/files/dest.txt");

        BufferedWriter out1 = new BufferedWriter(new FileWriter(testfile));
        out1.write("string to be copied,字符串已经被复制了\n");
        out1.close();

        InputStream   in = new FileInputStream(testfile);
        OutputStream out = new FileOutputStream(destfile);

        byte[] buf = new byte[1024];

        int length;
        while((length=in.read(buf)) > 0){//从源里面读取数据,并返回实际读取的字节数

            System.out.println("读取了多少个字节:"+length);//如果buf数组未填充满,未填充的数据为null并且会写入到文件中
            if(length < 1024){
               byte[] realbuf= new byte[length];
               System.arraycopy(buf,0,realbuf,0,length);
               out.write(realbuf);
            }else{
                out.write(buf);//往目标对写数据
            }


        }

        in.close();
        out.close();

        BufferedReader in1  = new BufferedReader(new FileReader(destfile));
        String str;

        while((str=in1.readLine())!=null){
            System.out.println(str);
        }

        in1.close();//为了释放相关联的所有资源

    }

六、下图是一个描述输入流和输出流的类层次图。

java stream写入文件 java file stream_数据