咦咦咦,各位小可爱,我是你们的好伙伴------bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
js
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
在Java开发中,输入输出流是非常重要的一个部分。而InputStreamReader类则是常用于将字节流转换为字符流的类,可以帮助程序员处理输入输出流时的一些问题。
摘要
InputStreamReader
类是Java中的一个字符流类,它用来将字节流转换为字符流,以便更容易的进行处理。在输入流中,InputStreamReader
类可以将一个字节输入流转换为字符输入流。在输出流中,InputStreamReader
类可以将一个字符输出流转换为字节输出流。这个类的作用是在不同的输入输出流之间转换数据类型,解决了数据类型不匹配的问题。
InputStreamReader
类
概述
InputStreamReader
类是Java.io
包下的一个类,它可以将字节流转换为字符流。InputStreamReader
类提供了多个构造函数,可以通过指定不同的编码方式来将字节流转换为字符流。在使用InputStreamReader
时,需要注意输入流的字符编码和输出流的字符编码应该保持一致,否则会出现乱码的情况。
源代码解析
InputStreamReader类的关键代码如下所示:
java
public class InputStreamReader extends Reader {
private final StreamDecoder sd;
...
public InputStreamReader(InputStream in) {
super(in);
try {
sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
...
public String getEncoding() {
return sd.getEncoding();
}
...
}
从源代码可以看到,在InputStreamReader类的构造函数中,调用了StreamDecoder的forInputStreamReader()
方法,将字节流转换为字符流。在这个过程中,我们可以通过getEncoding()
方法来获取字符编码,以便更好的进行字节流和字符流之间的转换。
应用场景案例
下面将介绍InputStreamReader类在实际开发中的应用场景案例。
例1:读取网络资源
java
//读取网络资源
public static void testReadURL() throws IOException {
URL url = new URL("http://www.baidu.com");
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
isr.close();
in.close();
}
这个示例演示了如何通过InputStreamReader类从网络中读取资源。在这个例子中,我们首先使用URL类打开一个连接,然后再从连接中获取字节输入流,接着将字节输入流转换为字符输入流,最后使用缓冲字符流来读取数据,并输出到控制台上。
案例演示结果如下:
例2:读取本地文件
java
public static void testReadFile() throws IOException {
FileInputStream fis = new FileInputStream("./template/fileTest.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
isr.close();
fis.close();
}
public static void main(String[] args) throws IOException {
testReadFile();
}
这个示例演示了如何使用InputStreamReader
类从本地文件中读取资源。在这个例子中,我们首先使用FileInputStream
类打开一个本地文件,然后再从文件中获取字节输入流,接着将字节输入流使用"UTF-8"编码方式转换为字符输入流,最后使用缓冲字符流来读取数据,并输出到控制台上。
案例演示结果如下:
优缺点分析
InputStreamReader类的优点在于可以将字节流转换为字符流,方便程序员进行字符处理。同时,也提供了多种编码方式来进行转换,可以适应不同的字符编码需求。
缺点在于需要注意输入流和输出流的字符编码应该保持一致,否则会出现乱码的情况。
类代码方法介绍
构造方法
InputStreamReader(InputStream in)
:创建一个使用默认字符集的InputStreamReader对象。InputStreamReader(InputStream in, Charset charset)
:创建一个使用指定字符集的InputStreamReader对象。InputStreamReader(InputStream in, CharsetDecoder dec)
:创建一个使用指定字符集解码器的InputStreamReader对象。InputStreamReader(InputStream in, String charsetName)
:创建一个使用指定字符集名称的InputStreamReader对象。InputStreamReader(InputStream in, CharsetDecoder dec, int minCharBufferSize)
:创建一个使用指定字符集解码器和最小字符缓冲区大小的InputStreamReader对象。
方法
int read() throws IOException
:读取一个字符并返回。int read(char cbuf[]) throws IOException
:读取字符到缓冲区中,并返回字符个数。int read(char cbuf[], int offset, int length) throws IOException
:读取指定长度的字符到缓冲区中,并返回字符个数。boolean ready() throws IOException
:检查此流是否准备好读取。boolean markSupported()
:判断此流是否支持mark和reset方法。void mark(int readAheadLimit) throws IOException
:标记此流的当前读取位置。void reset() throws IOException
:将此流的读取位置重置为标记位置。long skip(long n) throws IOException
:跳过n个字符的读取。String getEncoding()
:获取此流使用的字符编码名称。void close() throws IOException
:关闭此流并释放与之关联的所有系统资源。
测试用例
下面给出了InputStreamReader类的一个测试用例。
用例代码演示
java
package com.example.javase.io.reader.inputStreamReader;
import java.io.*;
/**
* @author bug菌
* @version 1.0
* @date 2023/10/19 10:37
*/
public class InputStreamReaderTest {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("./template/fileTest.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();
System.out.println("line:" + line);
br.close();
isr.close();
fis.close();
}
}
测试结果
根据如上测试用例本地测试结果如下,仅供参考:
可以看到测试用例结合InputStreamReader类的使用,成功将fileTest.txt文件的内容读取并控制台输出。
用例代码解析
如上测试代码给同学们演示了如何使用 InputStreamReader 类从文件中读取文本数据。具体来说,测试用例实现步骤非常简单,首先创建了一个 FileInputStream 对象来打开文件,然后将该对象传递给 InputStreamReader 构造函数,以及用于指定文本编码的字符串 "UTF-8"。最后,它使用 BufferedReader 对象读取一行文本,然后关闭所有打开的流,这点一定是需要注意的,经常会被忽视。(该程序假定文本文件是 UTF-8 编码。)
不关IO流会当如何?
针对该问题,我来给大家普及一下,若只使用IO流而不关闭流,会有如何影响,同学们请看:
-
浪费资源:打开的文件句柄或网络连接等资源不会被释放,会一直占用系统资源,导致系统资源的浪费。
-
内存泄漏:如果没有关闭流,内存中就会留下未释放的缓存,可能会导致内存泄漏。
-
数据丢失:如果没有关闭流或刷新缓存,部分数据可能不会被写入到文件或网络中,导致数据丢失。
-
程序异常:长时间未关闭流可能会导致程序异常或崩溃,尤其是在多线程程序中,需要确保及时关闭流来避免程序异常。
因此,在Java中,使用完IO流后应该及时关闭流以释放资源、避免内存泄漏和数据丢失等问题。可以使用try-finally
块或try-with-resources
语句块来确保及时关闭流。
全文小结
在本文中,我们依次介绍了InputStreamReader类的定义、作用、源代码解析、应用场景案例、优缺点分析、类代码方法介绍以及测试用例,希望可以帮助同学们更好的理解InputStreamReader类,以便于更快速的掌握它,吃透它。
总结
InputStreamReader类是Java中的一个字符流类,用于将字节流转换为字符流。在Java的输入输出流处理中,是非常重要的一部分。在使用InputStreamReader类时,需要注意输入流和输出流的字符编码应该保持一致,否则会出现乱码的情况。
附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
📣关于我
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。