Java基础 第四节 第十三课

举报
我是小白呀iamarookie 发表于 2021/09/10 01:33:16 2021/09/10
1.4k+ 0 0
【摘要】 字符流 概述字符输入流 (Reader)FileReader 类构造方法读取字符数据读取数据使用字符数组读取 字符输出流 (writter)FileWriter 类构造方法基本写出数据关...

概述

当使用字节流读取文本文件时, 可能会有一个小问题. 就是遇到中文字符时, 可能不会显示完整的字符, 那是因为一个中文字符可能占用多个字节存储. 所以 Java 提供一些字符流类, 以字符为单位读写数据, 专门用于处理文本文件.

字符输入流 (Reader)

java.io.Reader抽象类是表示用于读取字符流的所有类的超类, 可以读取字符信息到内存中. 它定义了字符输入流的基本功能方法.

  • public void close(): 关闭此流并释放与此流相关联的任何系统资源
  • public int read(): 从输入流读取一个字符
  • public int read(char[] cbuf): 从输入流中读取一些字符,

FileReader 类

java.io.FileReader类是读取字符文件的便利类. 构造时使用系统默认的字符编码和默认字节缓冲流.

  1. 字符编码: 字节与字符的对应规则. Windows 系统的中文编码默认是 GBK 编写表. idea 中 UTF-8
  2. 字节缓冲区: 一个字节数组, 用来临时存储字节数据

构造方法

FileReader(File file): 创建一个新的 FileReader, 给定要读取的 File 对象.

FileReader(String fileName):创建一个新的 FileReader, 给定要读取的文件的名称

当你创建一个流对象时, 必须传入一个文件路径. 类似于 FileInputStream. 代码展示:

读取字符数据

读取数据

读取数据: read 方法, 每次可以读取一个字符的数据, 提升为 int 类型, 读取到文件尾, 返回 -1. 循环读取, 代码使用演示:

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

public class Test {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileReader fr = new FileReader("read.txt");
        // 定义变量, 保存数据
        int b;
        // 循环读取
        while ((b = fr.read()) != -1){
            System.out.println((char)b);
        }
        // 关闭资源
        fr.close();
    }
}

输出结果:
程
序
员

  
 

使用字符数组读取

使用字符数组读取: read(char[] cbuf), 每次读取 b 的长度个字符到数组中, 返回读取到的有效字符个数. 读取到末尾时, 返回 -1. 代码展示:

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

public class Test {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileReader fr = new FileReader("read.txt");
        // 定义变量, 保存有效字符个数
        int len;
        // 定义字符数组, 作为装字符数据的容器
        char[] cbuf = new char[2];
        // 循环读取
        while ((len = fr.read(cbuf))!= -1) {
            System.out.println(cbuf);
        }
        // 关闭资源
        fr.close();
    }
}

输出结果:
程序
员序

  
 

获取有效的字符改进, 代码使用演示:

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

public class Test {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileReader fr = new FileReader("read.txt");
        // 定义变量, 保存有效字符个数
        int len;
        // 定义字符数组, 所谓装字符数据的容器
        char[] cbuf = new char[2];
        // 循环读取
        while ((len = fr.read(cbuf)) != -1){
            System.out.println(new String(cbuf,0,len));
        }
        // 关闭资源
        fr.close();
    }
}

输出结果:
程序
员

  
 

字符输出流 (writter)

java.io.Writer抽象类是用于写出字符流的所有类的超类, 将指定的字符信息写出到目的地. 它的定义了字节输出流的基本共性功能方法.

  • void write(int c): 写入单个字符
  • ```void write(char[] cbuf)````: 写入字符数组
  • abstract void write(char[] cbuf, int off, int len): 写入字符数组的某一部分, off 字符串的开始 索引, len 写的字符个数.
  • void flush(): 刷新该流的缓冲
  • void close(): 关闭此流, 但要先刷新它

FileWriter 类

```java.io.FileWriter``类是写出字符到文件的便利类. 构造时使用系统默认的字符编码和默认字节缓冲区.

构造方法

  • FileWriter(File file): 创建一个新的 FileWriter, 给定要读取的 FIle 对象
  • FileWriter(String fileName): 创建一个新的 FileWriter, 给定要读取的文件的名称

当你创建一个流对象时, 必须传入一个文件路径, 类似于 FileOutputStream. 代码展示:

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

public class Test18 {
    public static void main(String[] args) throws IOException {
        // 使用文File对象创建流对象
        File file = new File("read.txt");
        FileWriter fw1 = new FileWriter(file);

        // 使用文件名称创建流对象
        FileWriter fw2 = new FileWriter("read.txt");
    }
}

  
 

基本写出数据

写出字符: write(int b)方法, 每次可以写出一个字符数据. 代码展示:

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

public class Test {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("read.txt");
        // 写出数据
        fw.write(97); // 写出第1个字符
        fw.write('b'); // 写出第2个字符
        fw.write('C'); // 写出第3个字符
        fw.write(30000); // 写出第4个字符, 中文编码表中30000对应一个汉字。
        /*
        注意: 关闭资源时,与FileOutputStream不同
        如果不关闭, 数据只是保存到缓冲区, 并未保存到文件
        */
        fw.close();

    }
}

输出结果:
abC田

  
 

注:

  • 虽然参数为 int 类型四个字节, 但是只会保留一个字符的信息写出
  • 未调用 close 方法, 数据只是保存到了缓冲区, 并未写出到文件中

关闭和刷新

因为内置缓冲区的原因, 如果不关闭输出流, 无法写出文字到文件中. 但是关闭的流对象, 是无法继续写出数据的. 如果我们既想写出数据, 又想继续使用流, 就需要 flush 方法了.

  • flush: 刷新缓冲区, 流对象可以继续使用
  • close: 先刷新缓冲区, 然后通知系统释放资源. 流对象不可以再被使用了.

代码展示:

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

public class Test {
    public static void main(String[] args) throws IOException {
        // 使用文件名创建流对象
        FileWriter fw = new FileWriter("read.txt");
        // 写出数据, 通过flush
        fw.write("刷");  // 写出第一个字符
        fw.flush();
        fw.write("新");
        fw.flush();

        // 写出数据, 通过clsoe
        fw.write("关");
        fw.close();
        fw.write("闭");  // 继续写出第2个字符, 报错java.io.IOException: Stream closed
    }
}

输出结果:
刷新关

  
 

注: 即便是 flush 方法写出了数据, 操作的最后还是要调用 close 方法, 释放系统资源.

写出其他数据

写出字符数组

写出字符数组: write(char[] cbuf)和```write(char[] cbuf, int off, int len), 每次可以写出字符数组中的数据, 用法类似 FileOutputStream. 代码展示:

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

public class Test {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("read.txt");
        // 字符串转换为字符数组
        char[] chars = "我是小白".toCharArray();

        // 写出字符数组
        fw.write(chars);  // 程序员

        // 写出从索引2开始, 2个字符. 索引2是"程", 两个字符, 也就是"程序"
        fw.write(chars,2,2);  // 程序

        // 关闭资源
        fw.close();
    }
}

输出结果:
我是小白小白

  
 

写出字符串

写出字符串: write(String str)write(String str, int off, int len), 每次可以写出字符串中的数据, 更为方便. 代码展示:

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

public class Test22 {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("read.txt");
        // 字符串
        String msg = "程序员";
        // 写出字符数组
        fw.write(msg);  //程序员
        // 写出从索引2开始, 2个字符. 索引2是"程", 两个字符, 也就是"程序"
        fw.write(msg,0,2);  // 程序
        // 关闭资源
        fw.close();
    }
}

输出结果:
我是小白小白

  
 

编写和换行

编辑和换行: 操作类似于 FileOutputStream.

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

public class Test23 {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象, 可以续写数据
        FileWriter fw = new FileWriter("fw.txt",true);
        // 写出字符串
        fw.write("你好");
        // 写出换行
        fw.write("\r\n");
        // 写出字符串
        fw.write("程序员");
        // 关闭资源
        fw.close();
    }
}

输出结果:
你好
程序员

  
 

注: 字符流, 只能操作文本文件, 不能操作图片, 视频等非文本文件. 当我们单纯读取或者写文本文件时, 使用字符流, 其他情况使用字节流.

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/110418954

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。