博客信息

IO流之字符流(概述、FileWriter、FileReader)

发布时间:『 2019-06-11 04:59』  博客类别:java基础  阅读(625)


概述

IO流是用来处理设备之间的数据传输;

Java对数据的操作时通过流的方式;

Java用于操作流的对象都在IO包中

流按操作数据分为两种:字节流与字符流

流按流向分为:输入流、输出流;

 

IO流常用基类

字节流的抽象基类:

InputStreamOutputStream

 

字符流的抽象基类:

ReaderWriter

 

注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀

如:InputStream的子类FileInputStream

Reader的子类FileReader


FileWriter

先学习一下字符流的特点

 

既然IO流是用于操作数据的,

那么数据的最常见体现形式是:文件

 

那么先以操作文件为主来演示

package com.javaxl.io.characterStream;

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

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-06 21:51
 *
 * 需求:在硬盘上,创建一个文件并写入一些文件数据。
 *      在已存在的文件上续写字符串?
 *
 * 找到一个专门用于操作文件的writer子类对象,FileWriter。
 * 后缀名是父类名,前缀名是该流对象的功能;
 */
public class FileWriterDemo {
    public static void main(String[] args) throws IOException {
//        创建一个FileWriter对象,对该对象一被初始化就必须明确被操作的对象
//        而且该文件会被创建到指定目录下,如果该目录下已有同名文件,则被覆盖;
//        其实该步就是在明确数据要存放的目的地
//        FileWriter fw = new FileWriter("FileWriterDemo.txt");

//        传递一个true参数,代表不覆盖已有的文件,并在已有文件的末尾处进行数据续写
        FileWriter fw = new FileWriter("FileWriterDemo.txt",true);


//        调用write方法,将字符串写入到流中
        fw.write("eeeee");

//        刷新流对象中的缓冲中的数据
//        将数据刷到目的地中
//        fw.flush();

//        关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据;
//        将数据刷到目的地中;
//        和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭;
        fw.close();
    }
}


异常的处理方式

package com.javaxl.io.characterStream;

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

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-06 21:51
 *
 * 需求:在硬盘上,创建一个文件并写入一些文件数据。
 *
 * 找到一个专门用于操作文件的writer子类对象,FileWriter。
 * 后缀名是父类名,前缀名是该流对象的功能;
 */
public class FileWriterDemo2 {
    public static void main(String[] args) {
        FileWriter fw = null;
        try {
            fw = new FileWriter("FileWriterDemo.txt");
            fw.write("abcde");
        } catch (IOException e) {
            System.out.println("catch:"+e);
        }finally {
            if(fw !=null) {
                try {
                    fw.close();
                } catch (IOException e) {
                    System.out.println(e);
                }
            }
        }

    }
}


FileReader

读取指定文件的字符串

 

读取方式一:

package com.javaxl.io.characterStream;

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

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-06 22:24
 */
public class FileReaderDemo {
    public static void main(String[] args) throws IOException {
//        创建一个文件读取流对象,和指定名称的文件相关联;
//        要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException;
        FileReader fr = new FileReader("FileWriterDemo.txt");
        
//        调用读取流对象的read方法;
//        read():一次读一个字节,而且会自动往下读;
        int read = 0;
        while((read = fr.read())!=-1){
            System.out.println((char)read);
        }
        fr.close();
    }
}


图解代码

小李飞刀_IO流



上面读取效率太低,一次只能读取一个字符

 

读取方式二:

package com.javaxl.io.characterStream;

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

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-06 22:24
 */
public class FileReaderDemo2 {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("FileWriterDemo.txt");
//        定义一个字符数组,用于存储读到字符
//        该read(char[])返回的是读到字符个数
        char[] cbuf = new char[1024];
        int len = 0;
        while((len = fr.read(cbuf))!=-1){
            System.out.println(new String(cbuf, 0, len));
        }
        fr.close();

    }
}


图解代码

小李飞刀_IO流



小练习

 

C盘一个文本文件复制到D

 

 

复制的原理:

其实就是将C盘下的文件数据存储到D盘的一个文件夹中;

 

步骤:

1、在D盘创建一个文件,用于存储C盘文件中的数据;

2、定义读取流和C盘文件关联;

3、通过不断的读写完成数据传输;

4、关闭资源

package com.javaxl.io.characterStream;

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

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-08 7:09
 */
public class Demo1 {
    public static void main(String[] args) throws IOException {
//        copy_1();
        copy_2();
    }

    /**
     * 读一个字符写一个字符的方式
     *
     * @throws IOException
     */
    private static void copy_1() throws IOException {
        //创建目的地
        FileReader fileReader = new FileReader("C:\\Demo2.java");
        //与已有文件关联
        FileWriter fileWriter = new FileWriter("D:\\Demo2.java");
        int ch = 0;
        while ((ch = fileReader.read()) != -1) {
            fileWriter.write(ch);
            fileWriter.flush();
        }
        fileReader.close();
        fileWriter.close();
    }

    private static void copy_2() throws IOException {
        //创建目的地
        FileReader fileReader = new FileReader("C:\\Demo2.java");
        //与已有文件关联
        FileWriter fileWriter = new FileWriter("D:\\Demo2.java");
        char[] cbuf = new char[1024];
        int len = 0;
        while ((len = fileReader.read(cbuf)) != -1) {
            fileWriter.write(new String(cbuf, 0, len));
            fileWriter.flush();
        }
        fileReader.close();
        fileWriter.close();
    }
}


图解文件复制过程


小李飞刀_IO流




关键字:     Java基础       IO流       字符流  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有