InputStreamReader是Java将字节流转换为字符流的中间桥梁

InputStreamReader用于处理字节流与字符流之间的转换。在Java中,存在着字节流和字符流两种基本的输入输出流类型,字节流主要用于处理二进制数据,而字符流则主要用于处理文本数据。InputStreamReader就是将字节流转换为字符流的中间桥梁。

使用InputStreamReader,可以指定一个字符集用于将字节流解码为字符流。
例如,在读取一个文本文件时,可以使用FileInputStream来读取文件的字节流,然后再使用InputStreamReader将字节流转换为字符流,这样就可以按照字符的方式逐行读取文件内容了。

InputStreamReader 的字符编码取决于底层字节流使用的字符集。这是因为 `InputStreamReader` 将字节流解码为字符流,并且需要知道字节是如何编码为字符的。
当创建 `InputStreamReader` 时,可以使用构造函数参数指定字符集(例如 `UTF-8` 或 `GBK`)。如果未指定字符集,则 `InputStreamReader` 将使用系统默认字符集。
示例:
使用 UTF-8 字符集创建 `InputStreamReader`:
FileInputStream fileInputStream = new FileInputStream("input.txt");
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
注意:
* 如果字节流的字符集与 `InputStreamReader` 指定的字符集不匹配,则可能会导致乱码或字符损坏。
* 了解底层字节流使用的字符集非常重要,以便正确配置 `InputStreamReader`。

 BufferedReader是 Java 中一个用于从字符流中读取文本数据的缓冲字符输入流。它提供了比基本 `Reader` 类更方便和高效的读取操作。
用途:
* 从文本文件、字符串或其他字符数据源读取数据。
* 提供缓冲区,以提高从底层字符流读取数据的效率。
构造函数:
BufferedReader(Reader in)
其中,`in` 是要缓冲的字符流。
方法:
* read():读取下一个字符并返回它。
* read(char[] cbuf):将字符读入字符数组 `cbuf`。
* readLine():读取一行文本并返回它。
* skip(long n):跳过给定数量的字符。
* close():关闭底层字符流。
示例:
Reader reader = ...;
BufferedReader bufferedReader = new BufferedReader(reader);
String line = bufferedReader.readLine();

注意:
* `BufferedReader` 缓冲字符流,以提高读取性能。
* 它不执行任何字符编码转换。
* 它是一个包装类,在底层字符流之上提供更方便的读取操作。

import java.io.*;

public class EncodingExample {
    public static void main(String[] args) {
        try {
            // 创建 FileInputStream 以读取文件
            FileInputStream fileInputStream = new FileInputStream("input.txt");
            
            // 创建 InputStreamReader,并指定字符集为 UTF-8/ new InputStreamReader(fileInputStream, "UTF-8");
            // 如果 InputStreamReader 是用默认字符集创建的,那么 getEncoding() 方法可能会返回系统默认的字符集名称。
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
            
            // 获取当前字符流使用的字符集
            String encoding = inputStreamReader.getEncoding();
            System.out.println("当前字符流使用的字符集为:" + encoding+'\n');
            
            // 读取字符流中的内容
            int data;
            while ((data = inputStreamReader.read()) != -1) {
                // 在控制台打印读取的字符
                System.out.print((char) data);
            }
            
            // 关闭字符流
            inputStreamReader.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

import java.io.*;

public class FileInputOutputExample {
    public static void main(String[] args) {
        // 文件输入流示例,InputStreamReader 来将字节流转换为字符流,并指定了输入流的编码格式为 UTF-8
        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt"), "UTF-8"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 文件输出流示例
        try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8"))) {
            String content = "Hello, Java!";
            bw.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// InputStreamReader 提供了以下常用的方法:
// read():读取单个字符,返回读取的字符的 Unicode 编码值。如果已到达流的末尾,则返回 -1。
// read(char[] cbuf, int offset, int length):将字符读入数组中,从指定的偏移量开始存储,最多读取指定数量的字符。
// skip(long n):跳过并丢弃输入流中的 n 个字符。
// ready():判断此流是否已准备好被读取。
// close():关闭此流并释放与该流关联的所有系统资源。
// 除了以上方法,还有一些支持字符集编码转换的方法,例如:
// getEncoding():获取此流使用的字符集的名称。
// getDecoder():获取用于将字节转换为字符的解码器。

// getInputStream():获取用于读取字节的输入流。
// 等等。

// InputStreamReader 类有多个构造函数,用于创建从字节流到字符流的转换。
以下是其中一些常用的构造函数:
// InputStreamReader(InputStream in)
// 使用系统默认字符集将指定的输入流转换为字符输入流。
// InputStreamReader(InputStream in, String charsetName)
// 使用指定的字符集将指定的输入流转换为字符输入流。
// 例如:new InputStreamReader(new FileInputStream("input.txt"), "UTF-8") 将指定使用 UTF-8 编码读取文件。

// InputStreamReader(InputStream in, Charset cs)
// 使用指定的字符集将指定的输入流转换为字符输入流。
// 这些构造函数可以满足不同的需求,你可以根据具体的场景来选择合适的构造函数来创建 InputStreamReader 对象。

 ----------------

InputStreamReader分类目总结:

1. 类名:InputStreamReader
2. 继承关系:
   - 继承自:Reader类
   - 实现的接口:Closeable, AutoCloseable, Readable
3. 直接子类:FileReader
4. 功能概述:
   - 作用:将字节流转换为字符流的桥接器
   - 字符集:可以使用指定的字符集或默认字符集进行解码
   - 读取操作:每次调用read()方法可能导致从底层字节输入流中读取一个或多个字节
   - 提高效率:建议在BufferedReader中包装InputStreamReader以提高效率
5. 构造方法:
   - InputStreamReader(InputStream in)
   - InputStreamReader(InputStream in, String charsetName)
   - InputStreamReader(InputStream in, Charset cs)
   - InputStreamReader(InputStream in, CharsetDecoder dec)

6. 方法摘要:
   - getEncoding(): 返回字符编码名称
   - read(): 读取一个字符
   - read(char[] cbuf, int offset, int length): 将字符读入数组的一部分
   - ready(): 判断流是否可读取
7. 版本信息:
   - 开始版本:1.1
8. 异常:
   - UnsupportedEncodingException: 不支持指定的字符集
   - IOException: I/O错误异常
   - IndexOutOfBoundsException: 索引越界异常
9. 其他:
   - 可以通过构造方法指定字符集或使用默认字符集
   - 可以获取字符编码名称
   - 提供了读取字符和判断流是否就绪的方法
10. 适用范围:用于字节流到字符流的转换,是Java IO操作中的重要工具。

---------------

Java中的输入输出流类用于实现数据的输入和输出操作。
以下是一些常见的输入输出流类及其主要功能:

1. 字节流:
   - FileInputStream:从文件中读取字节流数据。
   - FileOutputStream:向文件中写入字节流数据。
   - BufferedInputStream:高效地读取字节流,通常与FileInputStream一起使用。
   - BufferedOutputStream:高效地写入字节流,通常与FileOutputStream一起使用。
   - ByteArrayInputStream:将字节数组包装成字节流。
   - ByteArrayOutputStream:将字节流数据写入到字节数组中。

2. 字符流:
   - FileReader:从文件中读取字符流数据。
   - FileWriter:向文件中写入字符流数据。
   - BufferedReader:高效地读取字符流,通常与FileReader一起使用。
   - BufferedWriter:高效地写入字符流,通常与FileWriter一起使用。
   - InputStreamReader:将字节流转换为字符流。
   - OutputStreamWriter:将字符流转换为字节流。

3. 对象流:
   - ObjectInputStream:读取对象的序列化数据。
   - ObjectOutputStream:将对象序列化为字节流。

4. 数据流:
   - DataInputStream:从输入流中读取基本数据类型。
   - DataOutputStream:将基本数据类型写入到输出流中。

5. 缓冲流:
   - BufferedInputStream:提供缓冲功能的字节输入流。
   - BufferedOutputStream:提供缓冲功能的字节输出流。
   - BufferedReader:提供缓冲功能的字符输入流。
   - BufferedWriter:提供缓冲功能的字符输出流。

这些输入输出流类提供了不同的功能和特性,可以根据具体需求选择合适的类来进行数据的输入和输出操作。在使用这些类时,需要注意异常处理和及时关闭流,以确保程序的稳定性和资源的正确释放。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.File;

public class FileProcessor {
    public static void main(String[] args) {
        String sourceFilePath = "txttestA.txt";
        String destinationFilePath = "txttestB.txt";
        int bufferSize = 98192; //1118192Byte=1.066391MB 缓冲区大小,可以根据需要进行调整

        File file = new File(sourceFilePath);
        long fileSizeBytes = file.length();
        double fileSizeMB = (double) fileSizeBytes / (1024 * 1024); // 转换为MB
        System.out.println("文件txttestA.txt大小: " + fileSizeMB + " MB");
        long startTime = System.currentTimeMillis();

        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFilePath), bufferSize);
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destinationFilePath), bufferSize)) {

            byte[] buffer = new byte[bufferSize];
            int bytesRead;
            while ((bytesRead = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }
            //BufferedOutputStream的write(byte[] buffer, int offset, int length)
            // 刷新缓冲区,确保所有数据都被写入到输出流中
            bos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime;

        System.out.println("读写过程所用的时间:" + elapsedTime + "毫秒");
    }
}

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值