java I/O———转换流

1.转换流的基本使用

现在为止已经知道了两种数据流:字节流和字符流。实际上这两种流是可以进行互相转换处理的。

  1. OutputStreamWriter:将字节输出流变为字符输出流(Writer对于文字的输出要比OutputStream方便)
  2. InputStreamReader:将字节输入流变为字符输入流(InputStream读取的是字节,不方便中文的处理)

要想知道这两个类的实际意义,我们首先来看这两个类的继承关系以及构造方法:

public class OutputStreamWriter extends Writer
public OutputStreamWriter(OutputStream out)
public class InputStreamReader extends Reader
public InputStreamReader(InputStream in)

范例:观察字节流与字符流的转换

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class TestOutputStreamWriter {
    public static void main(String[] args) throws Exception{
        File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
            + File.separator + "hello.txt");
        if (!file.getParentFile().exists()) { // 必须保证父目录存在
            file.getParentFile().mkdirs() ; // 创建多级父目录
        }
        OutputStream output = new FileOutputStream(file) ;
        Writer out = new OutputStreamWriter(output) ; // 字节流转为字符流
        String msg = "你好 world" ;
        out.write(msg) ;
        out.close();
    }
}

这种操作在实际开发中并没有什么意义,我们主要用它来分析FileOutputStream、FileInputStream、FileWriter、FileReader之间的继承关系。

在这里插入图片描述

从整个继承结构来讲,发现所有字符流处理的时候是经过转换后得来的。

2.文件拷贝(重要)

linux下文件拷贝命令:“cp 源文件路径 目标文件路径”

现在希望通过程序来实现这样的操作。即,建立一个CopyFile程序类,这个类通过初始化参数接收源文件与目标文件路径。

分析:

  1. 要想实现数据的拷贝肯定是要通过流的方式来完成,对于流有两类,由于要拷贝的内容不一定是文字数据,所以次此处我们采用字节流。
  2. 在进行拷贝的时候需要确定模式:a.在程序中开辟一个数组,该数组长度为文件长度,将所有数据一次性读取到该数组中随后进行输出保存。b.采用同边读边写的方式完成。

范例:初期模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个时候的确成功执行了,但是这个代码有两个问题:

  1. 在开发里尽量不要去使用do…while,尽量去使用while。
  2. 拷贝的速度特别慢

范例:解决do…while

     while((temp = inputStream.read()) !=-1 ) { // 判断这个读取后的字节(保存在temp)中是否为-1,如果不是表示有内容
outputStream.write(temp) ;
}

以上的方式还是针对于一个字节的方式完成的,如果文件太大,这种做法实在太慢。

范例:解决读取慢的问题

如果要想解决读取慢的问题,那么就要一次性读取多个字节内容

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个程序最为核心的部分就是:

在这里插入图片描述

这也是以后用到最多的代码(后续在文件上传之中都是这种模式)
如果现在要求你处理的数据都在InputStream里面,就采用以上的模型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章