深入探索Java字符流:解锁IO类库的字符处理

 简介

java将流按照读写单位划分为字节流与字符流.

java.io.InputStream和OutputStream是所有字节流的超类

而java.io.Reader和Writer则是所有字符流的超类,它们和字节流的超类是平级关系.

Reader和Writer是两个抽象类,里面规定了所有字符流都必须具备的读写字符的相关方法.

字符流最小读写单位为字符(char),但是底层实际还是读写字节,只是字符与字节的转换工作由字符 流完成. 字符流都是高级

字符流的父类

java.io.Writer 所有字符输入流的超类

void write(int c):写出一个字符,写出给定int值”低16”位表示的字符。
void write(char[] chs):将给定字符数组中所有字符写出。
void write(String str):将给定的字符串写出
void write(char[] chs,int offset,int len):将给定的字符数组中从offset处开始连续的
len个字符写出

java.io.Reader 所有字符输出流的超类 

int read():读取一个字符,返回的int值“低16”位有效。当返回值为-1时表达流读取到了末尾。
int read(char[] chs):从该流中读取一个字符数组的length个字符并存入该数组,返回值为实际
读取到的字符量。当返回值为-1时表达流读取到了末尾。

了解即可,接下来深入的学习比较常用的缓冲字符输出流

缓冲字符输出流 

 缓冲字符输出流-java.io.PrintWriter

常用构造器

PrintWriter(String filename) :可以直接对给定路径的文件进行写操作

PrintWriter(File file):可以直接对File表示的文件进行写操作 

PrintWriter(OutputStream out):将PW链接在给定的字节流上(构造方法内部会自行完成转换流等流连接)

PrintWriter(Writer writer):将PW链接在其它字符流上

PrintWriter(OutputStream out,boolean autoflush)

PrintWriter(Writer writer,boolean autoflush) 上述两个构造器可以在链接到流上的同时传入第二个参数,如果该值为true则开启了自动行刷新功能。(谨慎开启,会降低性能)

 代码实例

自行完成转换流等流连接

import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

public class PWDemo1 {
    public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
        PrintWriter pw=new PrintWriter("pw.txt", "UTF-8");
        pw.println("你好");
        pw.println("再见");
        pw.close();
    }
}

手动流链接 

        PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("pw2.txt"))));
        pw.println("b");
        pw.println("再见");
        pw.close();

简易记事本 (应用)

        PrintWriter pw = new PrintWriter(
                new BufferedWriter(
                    new OutputStreamWriter(
                        new FileOutputStream("note2.txt", true), StandardCharsets.UTF_8)),true);
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要写入记事本中的内容:");
        String data = sc.nextLine();
        while (!"exit".equals(data)) {
            pw.println(data);
            System.out.println("请继续输入");
            data = sc.nextLine();
        }
        pw.close();
        System.out.println("输入结束");

缓冲字符输入流-java.io.BufferedReader

内部原理 

缓冲字符输入流内部维护一个默认8192长度的char数组,总是以块读取文本数据保证读取效率。 缓冲输入流提供了一个按行读取文本数据的方法 

String readLine() 返回一行字符串。方法内部会连续扫描若干个字符,直到遇到换行符为止,将换行符之前的内容以一个字符串 形式返回。 返回的字符串中不含有最后的换行符。 返回值有三种情况:

1:正常一行内容

2:空字符串。当读取了一个空行时(这一行只有一个换行符)。

3:null。当流读取到了末尾时。      

当我们第一次调用readLine()时,流并不是只读取了一行字符串,而是先进行块读操作(一次性读取8192个 字符并转入到内部的char数组中),然后扫描内部的char数组,然后将第一行字符串返回。第二次调用后再继 续扫描后去的内容以此类推。   

代码实例 

        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("./src/main/java/io/BRDemo.java")));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();

 输出文件目录内的文件内容(应用)

    public static void main(String[] args) throws IOException {
        File dir = new File("./src/main/java/io");
        File[] files = dir.listFiles();
        int num = 0;
        for (File f : files) {
            printFile(f);
        }
    }

    public static void printFile(File file) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();
    }

 

 

 

 

 

 

 

 

 

 

 

 

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值