目录

InputStream(输入字节流)和OutputStream(输出字节流)

Reader(字符输入流)与Writer(字符输出流)

Print 流


我们通过对File类的学习, 了解到File类并不能去操作文件的内容,可以操作文件内容的则是以下这些实现类,现在来一一介绍

InputStream(输入字节流)和OutputStream(输出字节流)

      在谈这两个类之前,我们先来聊聊,什么是输入和输出呢 , 简单理解的话,我们编写的程序就相当于一个中转站, 首先将一个文件的内容输入进来, 然后再通过中转站将内容输出到另一个文件上,那么在这个基础之上呢 , 我们将要介绍的inputStream与OutputStream就相当于两段传输的管道, 起到传输字节的作用,如下图

java 把流写入文件内容 java文件流输入输出_javase

需要注意的是, InputStream与OutputStream是抽象类

最终的实现类我们用的是 FileInputStream 与 FileOutputStream , 先看示例,完整代码如下

FileInputStream in = null;    //字节输入流
BufferedInputStream bin = null;  //高效字节缓冲流
FileOutputStream out = null;  //字节输出流
BufferedOutputStream bout = null;  //高效字节输出流
try {
    in = new FileInputStream("D:\\demo\\www.txt");
    bin = new BufferedInputStream(in);   //用缓冲流包装包装
    out = new FileOutputStream("D:\\demo\\eee.txt");
    bout = new BufferedOutputStream(out);
    //定义一个缓冲数组,一次读入1024个字节
    byte[] bytes = new byte[1024];
    //length为实际读入byte[]数组的字节个数
    int length = 0;
    //read()方法读完之后会返回-1
    while ((length = bin.read(bytes))!=-1){
          //写出
          bout.write(bytes,0,length);
    }
} catch (FileNotFoundException e) {  //处理编译期异常
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
// 关闭管道
    try {
       if (bin != null){
          bin.close();
       }
       if (bout != null){
          bout.flush();  //刷新缓冲区
          bout.close();
       }
    }catch (IOException e){
       e.printStackTrace();
    }
}

原文件 : 

java 把流写入文件内容 java文件流输入输出_javase_02

执行后目标文件 : 

java 把流写入文件内容 java文件流输入输出_java_03

       需要注意的几点是, 如果我们输出的目标文件不存在的话,那么java是会去自动创建这个文件的,但是不能创建文件夹 , 并且在上述代码中,采用了缓冲数组和高效缓冲流(BufferedInputStream与BufferedOutputStream)的做法 , 这样做的好处是大大提升了效率

高效缓冲流的底层做法其实也是提供了缓存数组

      试想,原本的字节流一次读一个字节,然后将它写出去,每次读一个效率未免太低,所以我们采用了缓冲数组的做法, 让它一次读入一定数量的字节,然后再去处理它,这样提升了效率

Reader(字符输入流)与Writer(字符输出流)

     有了字节流, 那么也会有字符流, 顾名知义, 字节流每次会读入一个字节,而字符流每次则会读入一个字符, 采用utf-8的编码规范 , 一个英文字母就是一个字节, 一个汉字则是三个字节, 但它们都是一个字符, 字符流每次会读入一个完整的字符

另外,这两个类也是抽象类, 我们实现用的是FileReader与FileWriter这两个实现类

代码如下:

FileReader in = null;
        FileWriter out = null;
        BufferedReader bin = null;
        BufferedWriter bout = null;
        try {
            in = new FileReader("D:\\demo\\www.txt");
            bin = new BufferedReader(in);
            // 构造方法中将append属性设置为:true 不会替换原来的文件内容
            out = new FileWriter("D:\\demo\\eee.txt",true);
            bout = new BufferedWriter(out);
            String str = null;
            while ((str = bin.readLine()) != null){
                bout.write(str);
                bout.newLine(); //换行
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                bin.close();
                bout.flush();
                bout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

 上述代码可将以下文件完整的输出到另一文件中

java 把流写入文件内容 java文件流输入输出_开发语言_04

字符流为何能辨别我们读入的是一个正确的字符呢 , FileReader类继承了 InputStreamReader类,这个类又称为转换流, 它是字节流到字符流之间的桥梁

Print 流

这里我们主要介绍PrintWriter流(字符打印流) , 我们一般在javaEE程序中用到 , 例 :

try {
    PrintWriter out = new PrintWriter("D:\\demo\\asd.html");
    out.println("<a href=''>超链接</a>");  //超链接标签, html语言
    out.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

结果 : 

java 把流写入文件内容 java文件流输入输出_java 把流写入文件内容_05