×

InputStream和Reader区别_inputstreamreader

前端技术网 前端技术网 发表于2024-01-26 17:57:44 浏览2238 评论0

抢沙发发表评论

一、InputStreamReader.read()详解

在最一开始,我们先明确InputStreamReader和InputStream的区别:InputStreamReader用于读取字符,而InputStream用于读取字节

public abstract int read() throws IOException

InputStream和Reader区别_inputstreamreader

从输入流中读取数据的一个字符(可以从中读入一个字节序列的对象称为输入流,这些字节序列可以来自文件、网络、内存块)。

以整数的形式返回读入的这个字符(其实就是ASC码),也就是一个0-255的整数。

如果已经到达流末尾而没有可用的字节,则返回值-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

public int read(byte[] cbuf, int offset, int length) throws IOException

将输入流中最多 length个字符读入 byte数组(缓冲区)。尝试读取 length个字符,但读取的字节也可能小于该值。

以整数形式返回实际读取的字符数。

InputStream和Reader区别_inputstreamreader

如果已经到达流末尾而没有可用的字符,则返回值-1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。

如果 len为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字符。如果因为流位于文件末尾而没有可用的字字符,则返回值-1;否则,至少读取一个字节并将其存储在 b中。

将读取的第一个字节存储在元素 b[offset]中,下一个存储在 b[off+1]中,依次类推。读取的字符数最多等于 length。设 k为实际读取的字节数,这些字节将存储在 b[offset]到 b[off+k-1]的元素中,不影响 b[off+k]到 b[off+len-1]的元素。

在任何情况下,b[0]到b[off]的元素以及b[off+len]到b[b.length-1]的元素都不会受到影响。

此方法重复调用方法 read()。如果第一次这样的调用导致 IOException,则从对 read(cbuf, offset, length)方法的调用中返回该异常。如果对 read()的任何后续调用导致IOException,则捕获该异常并将其视为到达文件末尾;到达该点时读取的字符存储在 cbuf中,并返回发生异常之前读取的字节数。在已读取输入数据len的请求数量、检测到文件结束标记、抛出异常前,此方法的默认实现将一直阻塞。建议子类提供此方法更为有效的实现。

二、JAVA IO的使用原则及stream 和 reader的区别

嗨你好

avaIO的一般使用原则:

一、按数据来源(去向)分类:

1、是文件:FileInputStream,FileOutputStream,FileReader,FileWriter

2、是byte[]:ByteArrayInputStream,ByteArrayOutputStream

3、是Char[]:CharArrayReader,CharArrayWriter

4、是String:StringBufferInputStream,StringReader,StringWriter

5、网络数据流:InputStream,OutputStream,Reader,Writer

二、按是否格式化输出分:

1、要格式化输出:PrintStream,PrintWriter

三、按是否要缓冲分:

1、要缓冲:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter

四、按数据格式分:

1、二进制格式(只要不能确定是纯文本的):InputStream,OutputStream及其所有带Stream结束的子类

2、纯文本格式(含纯英文与汉字或其他编码方式);Reader,Writer及其所有带Reader,Writer的子类

五、按输入输出分:

1、输入:Reader,InputStream类型的子类

2、输出:Writer,OutputStream类型的子类

六、特殊需要:

1、从Stream到Reader,Writer的转换类:InputStreamReader,OutputStreamWriter

2、对象输入输出:ObjectInputStream,ObjectOutputStream

3、进程间通信:PipeInputStream,PipeOutputStream,PipeReader,PipeWriter

4、合并输入:SequenceInputStream

5、更特殊的需要:PushbackInputStream,PushbackReader,LineNumberInputStream,LineNumberReader

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):

首先,考虑最原始的数据格式是什么:原则四

第二,是输入还是输出:原则五

第三,是否需要转换流:原则六第1点

第四,数据来源(去向)是什么:原则一

第五,是否要缓冲:原则三(特别注明:一定要注意的是readLine()是否有定义,有什么比read,write更特殊的输入或输出方法)

第六,是否要格式化输出:原则二

Java中Inputstream与Reader的区别

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

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

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

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

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

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

java.io.Reader和java.io.InputStream组成了Java输入类。Reader用于读入16位字符,也就是Unicode编码的字符;而InputStream用于读入ASCII字符和二进制数据。

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

FileReader用于从文件输入;

CharArrayReader用于从程序中的字符数组输入;

StringReader用于从程序中的字符串输入;

PipedReader用于读取从另一个线程中的PipedWriter写入管道的数据。

相应的也有不同类型的InputStream输入流对应于不同的数据源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。另外,还有两种没有对应Reader类型的InputStream输入流:

Socket用于套接字;

URLConnection用于URL连接。

这两个类使用getInputStream()来读取数据。

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

三、BufferedReader和BufferedWriter的区别 及用法

bufferedreader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取;

bufferedwriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入;

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

这个是将字符输入流嵌套在控制台输入流中,用于入去控制台输入的字符。

BufferedReader br=new BufferedReader(new FileReader("test.txt"));

对文件test.txt构造了一个字符输入流,用于将test.txt中的字符读取出来。

BufferedWriter br3=new BufferedWriter(new FileWriter("test.txt"));

对文件test.txt构造了一个字符输出流,用于将输出流中的数据写入到test.txt中。

对于输入输出流的理解是相对于程序本身而言的,将一个文件中的数据读取出来写入到程序里面,这样的是输入流,而将程序中的数据写入到一个文件中这样的是输出流,这个输入和输出可以理解为相对程序来说是输入还是输出来定义。

四、InputStream和Reader的区别

java.io下面有两个抽象类:InputStream和Reader

InputStream是表示字节输入流的所有类的超类

Reader是用于读取字符流的抽象类

InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。

即用Reader读取出来的是char数组或者String,使用InputStream读取出来的是byte数组。

弄清了两个超类的根本区别,再来看他们底下子类的使用,这里只对最常用的几个说明

感谢您的阅读!希望本文对解决您关于InputStream和Reader区别_inputstreamreader的问题有所帮助。如果您还有其他疑问,欢迎随时向我们提问。