06 字符流的使用

1 一次读取一个字符

(1) 字节流读取中文输出会存在什么问题? 

● 会出现乱码、内存溢出。

(2) 读取中文输出,哪个流更适合,为什么?

● 字符流更合适,最小单位是按照单个字符读取的。(缺点:性能较慢 )

文件字符输入流:Reader

● 作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。

构造器 说明
public FileReader(File file) 创建文件字符输入流管道与源文件对象接通
public FileReader(String pathname) 创建字符输入流管道与源文件路径接通
方法名称 说明
public int read( ) 每次读取一个字符返回,没有则返回-1
public int read(char[] buffer) 每次读取一个字符数组返回,返回读取的个数,没有则返回-1

【案例】

public class FileReaderDemo01 {
    public static void main(String[] args) throws Exception {
        //目标:每次读取一个字符
        //1.创建一个字符输入流管道与源文件接通
        Reader fr = new FileReader("file-io-app\\src\\date06.txt");

        //2.读取一个字符返回,没有则返回-1
//        int code = fr.read();         //每次读取的是字符编号
//        System.out.println((char)code);    //墙
//
//        int code2 = fr.read();
//        System.out.println((char)code2);   //里
        
        //3.使用循环读取字符
        int code;
        while((code=fr.read()) != -1){
            System.out.print((char)code);
        }
    }
}

运行结果:

墙里秋千墙外道,墙外行人,墙里佳人笑。
笑声不闻声渐消,多情却被无情恼。

 

2 一次读取一个字符数组

文件字符输入流:FileReader

● 作用:以内存为基准,把磁盘文件中的数据以字符形式读取到内存中去。

● 读取性能得到提升

方法名称 说明
public int read( ) 每次读取一个字符返回,没有则返回-1
public int read(char[] buffer) 每次读取一个字符数组返回,返回读取的个数,没有则返回-1

【案例】

public class FileReaderDemo02 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字符输入流与源文件接通
        Reader fr = new FileReader("file-io-app\\src\\data07.txt");

        //2.用循环,每次读取一个字符数组的数据     1024 + 1024 + 8
        char[] buffer = new char[1024];   // 1k字符
        int len;
        while((len = fr.read(buffer)) != -1){
            String rs = new String(buffer,0,len);
            System.out.println(rs);
        }
    }
}

运行结果:

虞美人 —— 李煜
春花秋月何时了?往事知多少。小楼昨夜又东风,故国不堪回首月明中。
雕栏玉砌应犹在,只是朱颜改。问君能有几多愁?恰似一江春水向东流。

 

3 文件字符输出流

文件字符输出流:FileWriter

作用:以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流。

构造器 说明
public FileWriter(File file) 创建字符输出流管道与源文件对象接通
public FileWriter(File file, boolean append) 创建字符输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath) 创建字符输出流管道与源文件路径接通
public FileWriter(String filepath, boolean append) 创建字符输出流管道与源文件路径接通,可追加数据

常用API

方法名称 说明
void write(int c) 写一个字符
void write(char[] cbuf) 写入一个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的一部本
void write(String str) 写一个字符串
void write(String str, int off, int len) 写如一个字符串的一部分

流的关闭于刷新

方法名称 说明
flush( ) 刷新流,还可以继续写数据
close( ) 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

【案例】

public class FileWriterDemo03 {
    public static void main(String[] args) throws IOException {
        //1.创建一个字符输出流管道于目标文件接通
        FileWriter fw = new FileWriter("file-io-app\\src\\out08.txt");  //覆盖管道,每次启动都会清空文件之前的数据
        //FileWriter fw = new FileWriter("file-io-app\\src\\out08.txt",true);    //可追加

        //2. public void write(int c) :写一个字符出去
        fw.write(99);
        fw.write('a');
        fw.write('叶');
        fw.write("\r\n");    //换行

        //3. public void write(String c) :写一个字符串出去
        fw.write("abc我是中国人");
        fw.write("\r\n");    //换行

        //4. public void write(char[] buffer) :写一个字符数组出去
        char[] chars = "abc我是中国人".toCharArray();    //转为字符数组
        fw.write(chars);
        fw.write("\r\n");

        //5. public void write(String c,int pos,int len) :写字符串的一部分出去
        fw.write("abc我是中国人",0,5);
        fw.write("\r\n");

        //6. public void write(char[] buffer ,int pos ,int len):写字符数组的一部分出去
        fw.write(chars, 3, 5);
        fw.write("\r\n"); // 换行.

        //fw.flush();   //刷新后流可以继续使用
        fw.close();     //关闭包含刷新,关闭后流不能使用
    }
}

运行结果(out08.txt):

ca叶
abc我是中国人
abc我是中国人
abc我是
我是中国人

 

posted @   白森  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2022-05-13 电商数据仓库系统
点击右上角即可分享
微信分享提示