字符流Reader和Writer(三)下

简介: 字符流Reader和Writer(三)

三. Reader和Writer的应用: 文件复制


文件复制,实际上就是将 Reader ,Writer 结合起来使用, 两者共同使用同一个 字符数组, Reader将读出的内容批量写入到字符数组里面, Writer 将字符数组批量写入到文件里面


三.一 文件复制方法


  /**
     *
     * @param src
     * @param desc
     * @return 复制文本的文件。
     * 如果是复制图片的话, 不会报错,但不会写入数据,打开图片会报错。 大小仍然有。
     */
    public static boolean copyStr(String src,String desc) throws Exception{
        //定义两个文件
        File srcFile=new File(src);
        File descFile=new File(desc);
        if(!srcFile.exists()||!srcFile.isFile()){
            throw new RuntimeException("源文件不存在或者源文件是目录");
        }
        Reader reader=new FileReader(srcFile);
        Writer writer=new FileWriter(descFile);
        // 1M 1M 进行复制
        char[] chars=new char[1024];
        int len=-1;
        while((len=reader.read(chars))!=-1){
            writer.write(chars,0,len);
        }
        writer.flush();
        writer.close();
        reader.close();
        return true;
    }


三.二 文件复制测试


 @Test
    public void copyStrTest(){
        //复制普通文件
        String src="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"rz.txt";
        String desc="E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"rzNewcopy.txt";
        try {
            CopyUtils.copyStr(src,desc);
            System.out.println("文件复制成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


运行程序,查看文件系统:


20200617122419593.png

文件复制成功。


注意,此种方式不能复制二进制图片。 可以复制成功,但打开图片会报错,因为没有往图片里面写入数据。


四. InputStreamReader 和 OutputStreamWriter


给你一个文件或者是文件的路径, 我们可以构造出 字节流, FileInputStream和 FileOutputStream , 也可以构造出字符流 FileReader和FileWriter, 可以采用字节流,也可以采用字符流的方式操作文件的内容。 但是,字节方式操作可能会造成中文乱码, 字符方式不会产生中文乱码。 然而,除了文件,还有其他的输入源,或者输出源, 如内存,或者控制台,显示器。 是的,可以将控制台看成输入源,显示器看成输出源,内存既可以是输入源,也可以是输出源。 我们常用的 System.in, System.out 实际上就是 InputStream, OutputStream.


那么,在控制台输入时,因为采用的是字节读取,那么很可能造成乱码, 而字符方式不会造成乱码。 如果我们想解决键盘输入乱码的问题,只要将字节流转换成字符流就可以了。 那么,如何将字节流转换成字符流呢? 幸运地是, JDK 提供了这种转换。


InputStreamReader 将字节输入流转换成字符输入流, OutputStreamWriter 将字节输出流转换成字符输出流。


由于 InputStreamReader 继承了 Reader, 所以具有Reader 类的方法


public class InputStreamReader extends Reader {
}


由于 OutputStreamWriter 继承了 Writer, 所以具有Writer 类的方法


public class OutputStreamWriter extends Writer {
}


四.一 OutputStreamWriter


rz.txt 文件以前的内容是:


20200617122429489.png


四.一.一 方法


四.一.一.一 构造方法


image.png


四.一.一.二 其他方法


参照其父类 Writer 中的方法。


四.一.二 演示


    @Test
    public void writeTest() throws Exception{
        //有一个文件
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"rz.txt");
        OutputStream outputStream=new FileOutputStream(file,true);
        //解决乱码问题和方便写入
        //转换成了 writer
        OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream);
        //写入内容
         outputStreamWriter.append("\r\n").append((char)65);
        //写入内容
        outputStreamWriter.write("\r\n你好啊,两个蝴蝶飞");
        outputStreamWriter.close();
        outputStream.close();
    }


运行程序, rz.txt 文件的新内容是:


20200617122440575.png


四.二 InputStreamReader


四.二.一 方法


四.二.一.一 构造方法


image.png


四.二.一.二 其他方法


参照其父类 Reader 接口中的方法


四.二.二 演示


 @Test
    public void readTest() throws Exception{
        File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc"
                +File.separator+"rz.txt");
        InputStream inputStream=new FileInputStream(file);
        //由字节流转换成字符流
        InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
        char[] chars=new char[1024];
        int len=-1;
        StringBuilder sb=new StringBuilder();
        while((len=inputStreamReader.read(chars))!=-1){
            String temp=new String(chars,0,len);
            sb.append(temp);
        }
        System.out.println("读出内容:"+sb.toString());
        inputStreamReader.close();
        inputStream.close();
    }


运行程序,控制台打印输出:


20200617122446797.png


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
6月前
File操作-FileReader(FileWriter)/BufferedReader(Writer)
File操作-FileReader(FileWriter)/BufferedReader(Writer)
26 0
|
6月前
File操作-InputStreamReader/Writer(转换器)
File操作-InputStreamReader/Writer(转换器)
27 1
|
9月前
FileReader和FileWriter流
FileReader和FileWriter流
29 0
|
10月前
|
存储 编解码 缓存
InputStream、OutputStream、Reader、Writer的基本概念和使用方法
InputStream、OutputStream、Reader、Writer的基本概念和使用方法
95 0
|
11月前
|
存储 缓存 Java
【Java I/O 流】字符输入输出流:Reader 和 Writer
前面我们已经学会了字节流的使用,本篇开始介绍字符流。字符输入输出流是所有字符流的超类,学会了它们的方法,也基本上掌握了其子类的使用了。
79 0
|
Java 程序员
JAVA:文本文件读写使用Reader/Writer,二进制文件使用InputStream/OutputStream
JAVA:文本文件读写使用Reader/Writer,二进制文件使用InputStream/OutputStream
64 0
|
缓存 Java
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
110 0
|
存储 Java
【J2SE快速进阶】——IO流的四个基本抽象类InputStream、OutputStream、Reader、Writer
上文中对java.io包中的四个抽象类及其关系简单了解了一下,这里进一步对它们及其子类进一步总结一下。 在上篇博客末尾,贴出了Java中的整个IO家族,之后小编又重修改了一下,在之前的基础上,标识出了节点流与处理流(绿色为节点流,黄色为处理流)。
【J2SE快速进阶】——IO流的四个基本抽象类InputStream、OutputStream、Reader、Writer