IO框架(六)字符流、文件字符流

IO框架(六)字符流、文件字符流

引言

如果在txt文件里的汉字用输入流FileInputStream读出会出现乱码,因为txt里的汉字是utf-8格式的,一个汉字是3个字节,但是FileInputStream里的read方法是一个字节一个字节的读,所以是乱码,所以这时就要用到字符流了

字符流的内容

  • 字符流(抽象类):
    • Reader(抽象类):字符输入流
    • Writer(抽象类):字符输出流
  • 字符流的子类:
    • 文件字符流:
      • FileReader(子类)
      • FileWriter(子类)

Reader(抽象类)

方法

  • public int read(){} //
    
  • public int read(char[] c){} //
    
  • public int read(char[] b,int off,int len){} //
    
  • Modifier and Type Method and Description
    abstract void close() 关闭流并释放与之相关联的任何系统资源。
    void mark(int readAheadLimit) 标记流中的当前位置。
    boolean markSupported() 告诉这个流是否支持mark()操作。
    int read() 读一个字符
    int read(char[] cbuf) 将字符读入数组。
    abstract int read(char[] cbuf, int off, int len) 将字符读入数组的一部分。
    int read(CharBuffer target) 尝试将字符读入指定的字符缓冲区。
    boolean ready() 告诉这个流是否准备好被读取。
    void reset() 重置流。
    long skip(long n) 跳过字符

Writer(抽象类)

方法

  • public void write(int n){} //
    
  • public void write(String str){} //
    
  • public void write(char[] c){} //
    
  • Modifier and Type Method and Description
    Writer append(char c) 将指定的字符附加到此作者。
    Writer append(CharSequence csq) 将指定的字符序列附加到此作者。
    Writer append(CharSequence csq, int start, int end) 将指定字符序列的子序列附加到此作者。
    abstract void close() 关闭流,先刷新。
    abstract void flush() 刷新流。
    void write(char[] cbuf) 写入一个字符数组。
    abstract void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
    void write(int c) 写一个字符
    void write(String str) 写一个字符串
    void write(String str, int off, int len) 写一个字符串的一部分。

FileReader(子类)

部分方法

  • public int read(char[] c) //从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1
    

举例1

public class Demo01 {
    public static void main(String[] args) throws Exception{
        FileReader fr = new FileReader("D:\\aaa.txt");
        //读取
        //单个字符读取
        System.out.println("--------------单个字符读取--------------");
        int data=0;
        while ((data=fr.read())!=-1){
            System.out.println((char) data);
        }
        fr.close();
    }
}
//输出:
--------------单个字符读取--------------
史
小
鹏

举例2

public class Demo02 {
        public static void main(String[] args) throws Exception{
            FileReader fr = new FileReader("D:\\aaa.txt");
            //读取
            //单个字符读取
            System.out.println("--------------单个字符读取--------------");
            char[] b=new char[1024];
            int count=0;
            while ((count=fr.read(b))!=-1){
                System.out.println(new String(b,0,count));
            }
            fr.close();
        }
}
//输出:
--------------单个字符读取--------------
史小鹏

FileWriter(子类)

部分方法

  • public int write(String str) //一次写多个字符,将b数组中所有字符,写入输出流
    

举例1

public class Demo03 {
    public static void main(String[] args) throws Exception{
        FileWriter fw = new FileWriter("D:\\练习1.txt");
        //写入
        for(int i=0;i<10;i++){
            //写入缓冲区
            fw.write("java练习\n");
            //写入文件中
            fw.flush();
        }
        fw.close();
    }
}

字符流实现复制文件

注意:

  • 使用FileReader和FileWriter只能复制文本文件不能复制图片二进制文件

  • 原因:

    因为图片不是字符,将图片转为字符存储会形成乱码,而将图片再次输出只会将乱码输出

实现:

public class Demo04 {
    public static void main(String[] args) throws Exception{
        FileReader fr = new FileReader("D:\\练习1.txt");
        FileWriter fw = new FileWriter("D:\\练习2.txt");
        //读写
        int data=0;
        while ((data=fr.read())!=-1) {
            fw.write(data);//这里运行一次之后光标在最后,所有再次循环会接着往后写,而重新创建输出流会让光标从最开始起步,形成覆盖,这里是继续往后写用的同一个输出流,所以会继续往后写
            fw.flush();
        }
        fr.close();
        fw.close();
    }
}
posted @   史小鹏  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示