《Java基础详解I/O流二 》

字符流

常用字符编码:(jdk api)
  • ISO-8859-1
  • UTF-8
  • GB2312
  • GBK
Reader父类:(jdk api)

1.用于读取字符流的抽象类。 子类必须实现的唯一方法是read(char [],int,int)和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。

2.InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYExiLT8-1620960708178)(F:\日常文件\JavaDocment\图片\image-20210513170030737.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5kWk8pMC-1620960708181)(F:\日常文件\JavaDocment\图片\image-20210513170606346.png)]

FileReader: (jdk api)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wYgnl7iA-1620960708182)(F:\日常文件\JavaDocment\图片\image-20210513170705221.png)]

1.用于写入字符流的抽象类。 子类必须实现的唯一方法是write(char [],int,int),flush()和close()。 然而,大多数子类将覆盖这里定义的一些方法,以便提供更高的效率,附加的功能或两者。

2.OutputStreamWrite:r是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

每次调用write()方法都会使编码转换器在给定字符上被调用。 所得到的字节在写入底层输出流之前累积在缓冲区中。 可以指定此缓冲区的大小,但是默认情况下它大部分用于大多数目的。 请注意,传递给write()方法的字符不会缓冲。

3.为了最大的效率,请考虑在BufferedWriter中包装一个OutputStreamWriter,以避免频繁的转换器调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YsFgvo7w-1620960708185)(F:\日常文件\JavaDocment\图片\image-20210513170006265.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mhnU3UUS-1620960708186)(F:\日常文件\JavaDocment\图片\image-20210513170952287.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9l3aL3jV-1620960708187)(F:\日常文件\JavaDocment\图片\image-20210513171032683.png)]

FilterWriter:(jdk api)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BlYXo72D-1620960708188)(F:\日常文件\JavaDocment\图片\image-20210513171058280.png)]

File类字符流测试代码:
public static void main(String[] args)throws  Exception {
    //创建实例化
    FileReader fileReader = new FileReader("F:\\inputStream.txt");
    FileWriter fileWriter = new FileWriter("F:\\outputStream.txt");
   // 创建缓冲区
    BufferedReader bufferedReader= new BufferedReader(fileReader);
    BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    int data=0;
    //读取文件
    while ((data=bufferedReader.read())!=-1){
        //写入到outputStream
        bufferedWriter.write(data);
        //刷新
        bufferedWriter.flush();
    }
    bufferedReader.close();
    bufferedWriter.close();

}
转换流I/O
inputStreamReader:(jdk api)
public class InputStreamReader
extends Reader

InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

每个调用InputStreamReader的read()方法之一可能会导致从底层字节输入流读取一个或多个字节。 为了使字节有效地转换为字符,可以从底层流读取比满足当前读取操作所需的更多字节。

为了最大的效率,请考虑在BufferedReader中包装一个InputStreamReader。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9rHx09r-1620960708188)(F:\日常文件\JavaDocment\图片\image-20210514092204022.png)]

OutputStreamWriter:(jdk api)
public class OutputStreamWriter
extends Writer

OutputStreamWriter是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

每次调用write()方法都会使编码转换器在给定字符上被调用。 所得到的字节在写入底层输出流之前累积在缓冲区中。 可以指定此缓冲区的大小,但是默认情况下它大部分用于大多数目的。 请注意,传递给write()方法的字符不会缓冲。

为了最大的效率,请考虑在BufferedWriter中包装一个OutputStreamWriter,以避免频繁的转换器调用。 例如:

  Writer out
   = new BufferedWriter(new OutputStreamWriter(System.out)); 

代理对是由两个char值的序列表示的字符 :“\ uD800”到“\ uDBFF”范围内的代理,后跟“\ uDC00”到“\ uDFFF”范围内的代理。

一个畸形的替代元素是一个高替代品,其后没有高替代品的低替代品或低替代品。

这个类总是用字符集的默认替换序列替换格式不正确的代理元素和不可映射的字符序列 。 当需要对编码过程进行更多控制时,应使用CharsetEncoder类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YFkRbBxI-1620960708189)(F:\日常文件\JavaDocment\图片\image-20210514092512889.png)]

public class inputStreamReader {
    //转换流
    /**
     * 使用InputStreamReader流,并指定自定义编码(例:utf-8)
     */
    public static void main(String[] args)throws Exception {
        FileInputStream  fileInputStream= new FileInputStream("F:\\inputStream.txt");
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"utf-8");
        //读取文件
        int data =0;
        byte[] byt = new byte[1024];
        while ((data=inputStreamReader.read())!=-1){
            System.out.print((char)data);

        }
        //关闭
        inputStreamReader.close();
    }

看完如果对你有帮助,感谢点赞支持!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值