Chp20-IO2-字符流

Chp20-IO2-字符流

操作char|String类型的数据

流对象的创建方式与路径的书写和字节流一致

输入流

  • Reader: 抽象父类
  • FileReader: 字符输入节点流, 是Reader的子类

常用方法

  1. int read(): 读取一个字符, 读取到达末尾返回-1
  2. int read(char[] ): 尝试读取一个数组的数据至数组中, 返回实际读取个数, 读取到达末尾返回-1
package com.by.test;

import java.io.FileReader;

public class Test_FR {
    public static void main(String[] args) {
        try (
                FileReader fr=new FileReader("file/a.txt")
                ) {
            //循环读取文件所有内容-read()
            while (true) {
                int n = fr.read();
                if (n == -1) {
                    break;
                }
                System.out.println((char) n);
            }
            //循环读取文件所有内容-read(char[] )
            while (true) {
                char[] cs = new char[3];
                int n = fr.read(cs);
                if (n == -1) {
                    break;
                }
                //遍历数组输出
                for (char c : cs) {
                    System.out.print(c);
                }
            }

        } catch (Exception e) {
            System.out.println("未知异常!");
            e.printStackTrace();
        }
    }
}

输出流

  • Writer: 抽象父类
  • FileWriter: 字符输出节点流, Writer的子类

常用方法

  1. write(int ): 写入一个字符
  2. write(String ): 写入一个字符串
package com.by.test;

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

public class Test_FW {
    public static void main(String[] args) {
        try (
                FileWriter fw=new FileWriter("file/a.txt")
                ) {
            //写入单个字符
            fw.write(65);
            fw.write(66);
            fw.write(67);
            //写入一个字符串
            fw.write("这是一个字符串");

            System.out.println("写入成功!");
        } catch (Exception e) {
            System.out.println("未知异常!");
            e.printStackTrace();
        }
    }
}

缓冲过滤流

输入缓冲过滤流

BufferedReader br=new BufferedReader(fr对象);
常用方法
  1. String readLine(): 读取一行的内容, 读取到达末尾返回null
package com.by.test;

import java.io.BufferedReader;
import java.io.FileReader;

public class Test_BR {
    public static void main(String[] args) {
        try (
                FileReader fr=new FileReader("file/a.txt");
                //添加缓冲过滤流
                BufferedReader br=new BufferedReader(fr)
                ) {
           //循环读取所有内容
            while (true) {
                //接收本次读取内容
                String str = br.readLine();
                //判断读取是否到达末尾
                if (str == null) {
                    break;
                }
                //输出查看本次读取内容
                System.out.println(str);
            }

        } catch (Exception e) {
            System.out.println("未知异常!");
            e.printStackTrace();
        }
    }
}

输出缓冲过滤流

PrintWriter pw=new PrintWriter(fw对象);

BufferdWriter中的方法不够实用, 更推荐使用拥有众多独有方法的PrintWriter

常用方法
  1. print(值): 向目标文件写入一个数据, 默认不换行
  2. println(值): 向目标文件写入一个数据, 默认换行
  3. println(): 向目标文件写入一个空行
package com.by.test;

import java.io.FileWriter;
import java.io.PipedWriter;
import java.io.PrintWriter;

public class Test_PW {
    public static void main(String[] args) {
        try (
                FileWriter fw=new FileWriter("file/a.txt");
                //添加缓冲过滤流
                PrintWriter pw=new PrintWriter(fw)
                ) {
            pw.print("abcd");
            pw.print("ABCD");
            pw.println();
            pw.println();
            pw.println("abcd");
            pw.println("ABCD");

            System.out.println("写入成功!");
        } catch (Exception e) {
            System.out.println("未知异常!");
            e.printStackTrace();
        }
    }
}
  1. 如何理解输出语句?

    System是类库中的一个系统类, out为该类中的一个静态属性, 属性类型为PrintStream标准输出流对象类型, print()&println()是该流中的方法

  1. PrintWriter和PrintStream中的方法有什么区别?
    • PrintWriter是通过方法将数据写入到目标文件
    • PrintStream是通过方法将数据写入到内部控制台

字符编码集:

编码: 将原内容转换为数字的过程

解码: 将数字转换为原内容的过程

  • 特点: 不同的编码集编解码的方式不同

常见的编码集:

  1. GBK: 简体中文
  2. Big5: 繁体中文
  3. ASC||: 美式编码
  4. ISO-8859-1: 西欧
  5. Unicode:
    • UTF-16: java默认编码集, 所有内容同一占用2个字节
    • UTF-8: 行业标准. 占用字节大小由内容大小而定, 可以为1-3个字节

桥转换流

作用为将字节流转换为字符流并设置转换过程中的编码集

输入:
InputStreamReader isr=new InputStreamReader(fis对象,"编码集");
输出:
OutputStreamWriter osw=new OutputStreamWriter(fos对象,"编码集");

为了方便使用, 通常会为桥转换流添加缓冲过滤流, 方便使用缓冲过滤流中的独有方法

使用

当对同一文件进行读写操作时, 必须保证读写时的编码集保持一致, 否则会乱码

package com.by.test;

import java.io.*;

/**
 * 桥转换流-先写后读演示
 */
public class Test {
    public static void main(String[] args) {
        try (
                //输出桥转换流-以GBK的编码方式往b.txt中写入数据
                OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("file/b.txt"), "GBK");
                //输入桥转换流-以GBK的编码方式读取b.txt中的内容
                InputStreamReader isr=new InputStreamReader(new FileInputStream("file/b.txt"),"GBK");
                //添加缓冲过滤流
                PrintWriter pw=new PrintWriter(osw);
                BufferedReader br=new BufferedReader(isr)
        ) {
            //先写
            pw.println("一二三四五");
            pw.println("上山打老虎");
            pw.println("...");

            //强刷缓冲区
            pw.flush();
            //后读
            while (true) {
                String str = br.readLine();
                if (str == null) {
                    break;
                }
                System.out.println(str);
            }

        } catch (Exception e) {
            System.out.println("未知异常!");
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值