最近写代码时发现用BufferedReader把InputStream包装后,使用BufferedReader读取后,然后再使用 InputStream读取时总是发现问题,好像总是丢数据,由于我在流里面同时混了二进制数据与字符串,所以很不好调度,然后专门写了下面的代码去测试发现原来是. BufferedReader读取数据时会把数据从流里面取出一部分缓存,如果你再转向去用InputStream去读取的话,BufferedReader缓存里面的数据InputStream是读取不到的 .
package bytearray;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class TestByteArray {
public byte[] generateByte() {
// 构造一个测试流,这样就不用从文件里面读取了,在这个流里面使用了大量的回车换行("\r\n"),这样方便过会的测试
// 过会,我会通过把字符串转换成byte数组,然后通过ByteArrayInputStream来构造一个数据流
return "a\r\nbc\r\ndef\r\nghi\r\nj\r\nklmn\r\nopqr\r\ns\r\ntuvwxyz "
.getBytes();
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
TestByteArray self = new TestByteArray();
byte[] be = self.generateByte();
InputStream in = new ByteArrayInputStream(be);
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(
in));
// 使用DataInputStream而不直接使用Inputstream是因为这样方便,因为他提供了读取行
// 不过听说他读取行时把字节转变为字符时会有问题,所以不推荐使用,不过我们在这只做测试就没关系了
DataInputStream dataInputStream = new DataInputStream(in);
// 先读取流里面的一行数据
System.out.println("bufferReader=" + bufferReader.readLine());
// 回过头来使用dataInputStream读取数据,会发现什么也读取不到
System.out.println("dataInputStream=" + dataInputStream.readLine());
// 回过头来使用inputstream读取数据,会发现什么也读取不到
System.out.println("in=" + in.read());
// InputStream读取不到数据,然后再使用原来的BufferedReader来读取数据,发现是接着原来读取的.
System.out.println("bufferReader=" + bufferReader.readLine());
//我们上面的字符串比较小,我想如果字符串,大到缓存装不下的时候,使用inputstream回头去读取数据,肯定是能读取到的
//这个我就不测试了
}
}
转自
http://itspy.spaces.live.com/blog/cns!87AF3B24336DF461!180.entry
相关推荐
总结来说,`BufferedReader`和`BufferedWriter`是Java I/O中的重要工具,它们通过内部缓冲机制提升了文件读写操作的效率,使得程序在处理大量文本数据时能更加高效。在实际编程中,我们应该合理利用这两个类,以优化...
服务器端可能使用`BufferedReader`从`Socket`的`InputStream`读取客户端发送的数据,而客户端则可能使用它从标准输入或文件读取要发送的数据。 10. **源码阅读** 如果想要深入理解`BufferedReader`的工作原理,...
这是必要的,因为`BufferedReader`只能处理字符流,而不能直接处理字节流。具体实现如下: ```java BufferedReader reader = new BufferedReader(new InputStreamReader(is)); ``` 这里的`is`是一个`InputStream`...
在Java编程中,文件操作是不可或缺的一部分,尤其是在处理数据存储和读取时。`InputStream`、`OutputStream`、`Reader`和`Writer`是Java IO流的基础类,它们提供了读写文件的基本接口。本篇文章将深入讲解这些类的...
- 使用`BufferedReader`和`InputStreamReader`:首先,通过`InputStreamReader`将InputStream转换为字符流,然后使用`BufferedReader`逐行读取并拼接成字符串。 ```java InputStream is = ...; ...
通过使用 `BufferedReader`,程序可以在每次调用读取方法时从缓冲区中获取更多的字符,从而减少系统调用的次数,提高整体性能。 #### 二、创建 BufferedReader 实例 在创建 `BufferedReader` 对象时,通常需要传入...
BufferedReader 开发的结构
可以自定义方法实现这个功能,或者使用现有的CSV解析库,比如`opencsv`库的`CSVReader`类,它能很好地处理包含逗号的字段和引用字段: ```java CSVReader csvReader = new CSVReader(reader); String[] line; ...
将InputStream转化为String,一般使用BufferedReader读取InputStream中的每一行并拼接到StringBuffer中,最后返回其toString()的结果。另外,也可以通过ByteArrayOutputStream来读取InputStream,然后将其转换为...
本文将深入探讨如何使用Java实现这一过程,同时涵盖异常处理、重复不终止输入以及`BufferedReader`的高效使用。 首先,了解字符编码至关重要。常见的编码方式有ASCII、ISO-8859-1、UTF-8、GBK等。每种编码都有其...
结合使用InputStreamReader和BufferedReader: 通常,为了提高效率,我们会在InputStreamReader之上使用BufferedReader。例如,当从文件或网络读取数据时,可以首先创建一个InputStreamReader对象,然后将其传递给...
BufferedReader 是缓冲字符输入流。它继承于Reader。 BufferedReader 的作用是为其他字符输入流添加一些缓冲功能。
没有堵塞,客户端和服务端简单的信息传递,利用了BufferedReader读。
根据提供的文件信息,我们可以总结出以下几个关键...通过以上分析,我们了解了如何使用 `BufferedReader` 和 `Scanner` 这两种不同的方式来实现从键盘读取用户的输入。这两种方法各有优势,可以根据具体需求选择使用。
BufferedReader的用法---马克-to-win java视频缓存输入流的介绍
Java中的`InputStream`和`OutputStream`是所有字节输入流和输出流的抽象基类。 - 示例:`FileInputStream`和`FileOutputStream`用于读写文件,`InputStreamReader`和`OutputStreamWriter`则将字节流转换为字符流。 ...
NULL 博文链接:https://chaoyi.iteye.com/blog/2084140
3. **使用`BytesIO`和`BufferedReader`** 接下来,我们需要将字节串转换为`_io.BytesIO`对象,这允许我们在内存中进行读写操作: ```python f4 = BytesIO(str_encode) ``` 然后,我们创建一个`_io....
在Java编程语言中,`BufferedReader`和`BufferedWriter`是两个非常重要的类,它们分别位于`java.io`包中,用于提高字符输入和输出的效率。这两个类继承自抽象基类`Reader`和`Writer`,为读写操作提供了缓冲区功能。 ...
在实际应用中,当需要读取文件时,通常会结合使用FileInputStream(或FileOutputStream)与BufferedInputStream(或BufferedOutputStream)来提高性能,同时使用InputStreamReader和BufferedReader来处理字符编码和...