IO(输入输出)-字符流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011897110/article/details/78744551

字符流定义及基本用法

如果希望在程序中操作字符。为此JDK提供了Reader和Writer。其中Reader是字符输入流,用于从某个源设备读取字符,Writer是字符流出流,用于向某个目标设备写入字符。Reader和Writer作为字符流的顶级父类,也有许多子类。

这里写图片描述

Reader子类

这里写图片描述

Witer子类

字符流操作文件

如果想从文件中直接读取字符便可以使用字符输入流FileReader,通过此流可以从关联的文件 中读取一个或者一组字符。

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

public class IOTest01 {
        private static FileReader fr;
        public static void main(String[] args) {
//      System.out.println(fr.toString().length());
        try {
                /* 创建一个FileReader对象用来读取文件中的字符 */
                fr = new FileReader("src/In.txt");

                int len;    //定义一个变量用于记录读取的字符。

                /* 循环判断是否读到文件的末尾 */
                while ((len = fr.read()) != -1){
                        System.out.print((char)len);
                }

        } catch (Exception e) {
                e.printStackTrace();
        }finally{
                try {
                        if(fr != null){     //如果fr不为空就关闭
                                fr.close();
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
        }
}

如果要向文件中写入字符就需要使用FileWriter类。

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

public class IOTest02 {

        public static void main(String[] args) throws IOException {

                /* 创建一个FileWriter对象用于向文件中写入数据 */
                FileWriter fw = new FileWriter("src/Out.txt");

                String str = "周林";  

                fw.write("\r\n");   //将输出语句换行
                fw.write(str);      //将字符数据写入到文本文件中

                if(fw != null){
                        fw.close();     //关闭
                }
        }
}

字符流提供了带缓冲区的包装流,分别是BufferedReader和BufferedWriter。并且分别对输入/输出流进行包装。

public class IOTest03 {

    public static void main(String[] args) throws IOException {

        /* 创建一个缓冲对象对FileReader进行包装 */
        BufferedReader br = new BufferedReader(new FileReader("src/In.txt"));
        /* 创建一个缓冲对象对FileWriter进行包装 */
        BufferedWriter bw = new BufferedWriter(new FileWriter("src/O.txt"));

        String src;

        long startTime = System.currentTimeMillis();

        /* readLine():每次读取一行文本,判断是否到文件末尾  */
        while ((src = br.readLine()) != null ){
            bw.write(src);
            bw.newLine();   //写入一个换行符,该方法会根据不同的操作系统生成相应的换行符。
        }
        long endTime = System.currentTimeMillis();

        System.out.println((endTime - startTime)+"毫秒");


        if(bw != null){
            bw.close();     //关闭
        }
        if(bw != null){
            bw.close();     //关闭
        }
    }
}

LineNumberReader

Java程序在编译或运行期间经常会出现一些错误,在错误在通常会报告出错的行号,为了方便查找错误,需要在代码中加入行号。JDK提供了一个可以跟踪行号的输入流——LineNumberReader,它是BufferedReader的直接子类。
案例:为文件加上行号。

public class IOTest04 {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("src/In.txt");
        FileWriter fileWriter = new FileWriter("src/O.txt");

        /* 包装 */
        LineNumberReader lnr = new LineNumberReader(fileReader);

        lnr.setLineNumber(0);       //设置读取文件的起始行号

        String len = null;

        while( (len = lnr.readLine() ) != null){
            /* 将行号写入到文件中 */
            fileWriter.write(lnr.getLineNumber()+":"+len);
            fileWriter.write("\r\n");       //写入换行
        }
        lnr.close();
        fileWriter.close();
    }
}

转换流

JKD中提供了两个类可以将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter。
注意:在使用转换流时,只能针对操作文本文件的字节流进行转换,如果字节流操作的是一张图片,此时转换为字符流就会造成数据丢失。

public class IOTest05 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("src/In.txt");
        InputStreamReader isr = new InputStreamReader(fis); //将字节输入流转换成字符输入流
        BufferedReader br = new BufferedReader(isr);    //对字符流对象进行包装

        FileOutputStream fos = new FileOutputStream("src/Out.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos);   //将字符输出流转换成字符输出流
        BufferedWriter bw = new BufferedWriter(osw);    //对字符流对象进行包装

        String len = null;

        while( (len = br.readLine() ) != null) {
            bw.write(len);
            bw.write("\r\n");
        }

        br.close();
        bw.close();
        }
}

猜你喜欢

转载自blog.csdn.net/u011897110/article/details/78744551