InputStream、InputStreamReader和Reader的关系

InputStream:得到的是字节输入流,InputStream.read("filename")之后,得到字节流

Reader:读取的是字符流

InputStreamReader:从字节到字符的桥梁。InputStreamReader(InputStream.read("filename"));

reader.read(InputStreamReader(InputStream in));便可从字节变为字符,打印显示了。

java.io.Reader 和 java.io.InputStream 组成了Java 输入类。

Reader 用于读入16位字符,也就是Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。

Reader支持16位的Unicode字符输出,

InputStream支持8位的字符输出。

Reader和InputStream分别是I/O库提供的两套平行独立的等级机构,

1byte = 8bits

InputStream、OutputStream是用来处理8位元的流,

Reader、Writer是用来处理16位元的流。

而在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer。

值得说明的是,在这两种等级机构下,还有一道桥梁InputStreamReader、OutputStreamWriter负责进行InputStream到Reader的适配和由OutputStream到Writer的适配。

在 Java中,有不同类型的 Reader 输入流对应于不同的数据源:

FileReader 用于从文件输入; CharArrayReader 用于从程序中的字符数组输入; StringReader 用于从程序中的字符串输入; PipedReader 用于读取从另一个线程中的 PipedWriter 写入管道的数据。

相应的也有不同类型的 InputStream 输入流对应于不同的数据源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。

另外,还有两种没有对应 Reader 类型的 InputStream 输入流: Socket 用于套接字; URLConnection 用于 URL 连接。 这两个类使用 getInputStream() 来读取数据。

相应的,java.io.Writer 和 java.io.OutputStream 也有类似的区别。

关于InputStream.read(byte[] b)和InputStream.read(byte[] b,int off,int len)这两个方法都是用来从流里读取多个字节的,有经验的程序员就会发现,这两个方法经常 读取不到自己想要读取的个数的字节。比如第一个方法,程序员往往希望程序能读取到b.length个字节,而实际情况是,系统往往读取不了这么多。仔细阅读Java的API说明就发现了,这个方法 并不保证能读取这么多个字节,它只能保证最多读取这么多个字节(最少1个)。因此,如果要让程序读取count个字节,最好用以下代码:
  byte[] b = new byte[count];
  int readCount = 0; // 已经成功读取的字节的个数
  while (readCount < count) {
   readCount += in.read(bytes, readCount, count - readCount);
  }
      用这段代码可以保证读取count个字节,除非中途遇到IO异常或者到了数据流的结尾(EOFException)

时间: 2024-12-23 14:58:20

InputStream、InputStreamReader和Reader的关系的相关文章

InputStream,InputStreamReader和Reader的关系

InputStream:得到的是字节输入流,InputStream.read("filename")之后,得到字节流 Reader:读取的是字符流 InputStreamReader:从字节到字符的桥梁.InputStreamReader(InputStream.read("filename")); reader.read(InputStreamReader(InputStream in));便可从字节变为字符,打印显示了. java.io.Reader 和 jav

inputstream,inputstreamreader,与reader的关系

InputStream:得到的是字节输入流,InputStream.read("filename")之后,得到字节流 Reader:读取的是字符流 InputStreamReader:从字节到字符的桥梁.InputStreamReader(InputStream.read("filename")); reader.read(InputStreamReader(InputStream in));便可从字节变为字符,打印显示了. java.io.Reader 和 jav

InputStream,String和Reader之间的转换

1.String –> InputStreamInputStrem is = new ByteArrayInputStream(str.getBytes());orByteArrayInputStream stream= new ByteArrayInputStream(str.getBytes());  2.InputStream–>String inputStream input; StringBuffer out = new StringBuffer();     byte[] b =

JAVA IO InputStream InputStreamReader BufferedReader

InputStream.OutputStream 处理字节流的抽象类,InputStream能从來源处读取一個一個byte,所以是最低级的.InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等 InputStreamReader  OutputStreamWriter 处理字符流的抽象类,是字节流通向字符流的桥梁,它将字节流转换为字符流.它以较高级的方式,一次读取一个一个字符. BufferedReader BufferedWriter B

Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和区别

一.Java读取和存储文件数据流 Java读取文件,实际是将文件中的字节流转换成字符流输出到屏幕的过程 这里面涉及到两个类:InputStreamReader和OutputStreamWriter InputStreamReader:将字节流转换成字符流 OutputStreamWriter:将字符流转换成字节流 InputStreamReader继承Reader类 OutputStreamWriter继承Writer类 二.BufferedReader/FileReader/InputStre

Reader字符输入流和InputStreamReader和FileReader

1.FileReader  extends InputStreamReader extends Reader 其中,Reader字符输入流和InputStreamReader和FileReader为字符输入流——写出——读取: 原文地址:https://www.cnblogs.com/wmqiang/p/10798538.html

【IO流】22 - 字符流 - 转换流OutputStreamWrite和InputStreamReader

转换流 InputStreamReader package cn.itcast.demo; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /* * 转换流 * java.io.InputStreamReader 继承 Reader * 字符输入流,读取文本文件 * * 字节流向字符的桥梁,将字节流转字符流 * * 读取的方法: * read() 读取1个字

JAVA基础知识之InputStreamReader流 和 将本地文件通过前端上传到服务器上

将本地文件通过前端上传到服务器上 public BaseResponseSwagger resolveFile(@Valid @ApiParam(value = "file")@RequestParam(name = "file",required = true) MultipartFile file){ if(file.isEmpty()){ throw new SoftwareException(ComStatusCodeEnum.COM_PARAM_VALID

String与InputStream相互转换

1.String to InputStream String str = "String与InputStream相互转换"; InputStream   in_nocode   =   new   ByteArrayInputStream(str.getBytes());  InputStream   in_withcode   =   new   ByteArrayInputStream(str.getBytes("UTF-8")); 2.InputStream