欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IO基础(字符流)

程序员文章站 2024-03-07 09:20:08
...

IO基础(字符流)

一、字符流

字符流类都是以Reader/Writer结尾

二、常用的字符流类的继承关系

IO基础(字符流)

三、字符流 FileReader 和 FileWriter

FileReader:
如果要从文件中读取内容,可以直接使用 FileReader 子类。
FileReader 是用于读取字符流。 要读取原始字节流,考虑使用 FileInputStream 。

构造方法:
FileReader(File file) 创建一个新的 FileReader ,给出 File 读取。
FileReader(String fileName) 创建一个新的 FileReader ,给定要读取的文件的名称

FileWriter
如果是向文件中写入内容,应该使用 FileWriter 子类 FileWriter 是用于写入字符流。
要编写原始字节流,考虑使用 FileOutputStream

构造方法:
FileWriter(File file) 给一个File对象构造一个FileWriter对象。
FileWriter(String fileName) 构造一个给定文件名的FileWriter对象

代码如下:

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

public class Test03 {
    public static void main(String[] args) throws IOException {
        //创建输入流对象     
        FileReader fr = new FileReader("E:\\bit\\bitSrc.java");
        //创建输出流对象     
        FileWriter fw = new FileWriter("E:\\bit\\bitCopy.java");
        //读写数据      
        int ch;
        while ((ch = fr.read()) != -1) {
            fw.write(ch);
        }        
        //释放资源      
        fw.close();
        fr.close();
    }
}

四、字符缓冲流 BufferedReader 和 BufferedWriter

为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。 BufferedReader 用于加快读取字符的速度, BufferedWriter 用于加快写入的速度。
BufferedReader 和 BufferedWriter 类各拥有 8192个 字符的缓冲区。当 BufferedReader在 读取文 本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()方法,会先从缓冲区中 进行读取。如果缓冲区数据不足,才会再从文件中读取,使用 BufferedWriter 时,写入的数据并不会 先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。

字符缓冲流特有功能
BufferedWriter:
●void newLine():写一行行分隔符,行分隔符字符串由系统属性定义

BufferedReader:
●public String readLine():读一行文字。 结果包含行的内容的字符串, 不包括任何行终止字符,如果流
的结尾已经到达,则为null

构造方法:
BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入 流。
BufferedReader(Reader in, int sz) 创建使用指定大小的输入缓冲区的缓冲字符输入 流。

BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区

测试代码如下:

import java.io.*;

public class FileWrite {
    public static void main(String[] args) throws IOException {
        FileReader reader = new FileReader("C:\\my_java\\aaa.txt");
        BufferedReader bReader = new BufferedReader(reader);
        FileWriter writer = new FileWriter("C:\\my_java\\abc.txt");
        BufferedWriter bWriter = new BufferedWriter(writer);
        String content;     //readLine一行一行的读取
        while ((content = bReader.readLine()) != null) {
            //\r\n换行
            bWriter.write(content + "\r\n");
        }
        reader.close();
        bReader.close();
        bWriter.close();
        writer.close();
    }
}

五、 字符字节转换流(InputStreamReader/OutputStreamWriter)

1、InputStreamReader 是Reader的子类,将输入的字节流转换成字符流。
InputStreamReader 是从字节流到字符流的桥:它读取字节,并使用指定的 charset 将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

InputStreamReader构造方法:
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in,Charset cs) 创建一个使用给定字符集的 InputStreamReader

测试代码如下:

import java.io.*;

public class TestDemo {
    public static void main(String[] args) throws IOException {
        // 创建字节流对象 System.in 代表从控制台输入  
        InputStream in = System.in;
        // 创建字符流对象      
        BufferedWriter bw = null;
        BufferedReader br = null;
        try {
            // 实例化字符流对象 通过 InputStreamReader 将字节输入流转化成字符输入流    
            br = new BufferedReader(new InputStreamReader(in));
            //br = new BufferedReader(new InputStreamReader(in,"GBK"));    
            bw = new BufferedWriter(new FileWriter("a.txt"));
            // 定义读取数据的行        
            String line = null;
            // 读取数据          
            while ((line = br.readLine()) != null) {
                // 如果输入的是"exit"就退出        
                if ("exit".equals(line)) {
                    break;
                }// 将数据写入文件    
                bw.write(line);
                // 写入新的一行            
                bw.newLine();
                // 刷新数据缓冲  
                bw.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源        
            if (bw != null)
                bw.close();
            if (br != null) br.close();
        }
    }
}

2、OutputStreamWriter 是Writer的子类,将输出的字符流转换成字节流
OutputStreamWriter 是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节 charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

OutputStreamWriter构造方法:
OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out,Charset cs) 创建一个使用给定字符集的 OutputStreamWriter

测试代码如下:

import java.io.*;

public class TestDemo1 {
    public static void main(String[] args) throws IOException { // 定义字节输出流的对象System.out  
        OutputStream out = System.out;
        // 定义字符流的对象      
        BufferedReader br = null;
        BufferedWriter bw = null;
        //通过OutputStreamWriter将字符转流换为字节流对象  
        bw = new BufferedWriter(new OutputStreamWriter(out));
        //bw = new BufferedWriter(new OutputStreamWriter(out,"GBK"));    
        br = new BufferedReader(new FileReader("a.txt"));
        // 定义读取行的字符串        
        String line = null;
        // 读取数据
        while ((line = br.readLine()) != null) {
            // 输出到控制台    
            bw.write(line);
            // 新的一行  
            bw.newLine();
            // 刷新缓冲
            bw.flush();
        }
    }
}