当前位置: 首页 > 知识库问答 >
问题:

BufferedReader可以读取字节吗?

卞俊贤
2023-03-14

对不起,如果这个问题是一个迟钝的,但我没有得到一个答案,我正在寻找。

Java docs这样说

通常,对读取器的每个读取请求都会导致对底层字符或字节流的相应读取请求。因此,建议将BufferedReader包装在任何读取()操作可能代价高昂的读取器周围,例如FileReaders>和InputStreamReaders。例如,

BufferedReader in = new BufferedReader(new FileReader("foo.in"));

将缓冲来自指定文件的输入。如果不进行缓冲,每次调用read()或readLine()都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能非常低效。

>

  • 我的第一个问题是,如果bufferedReader可以读取字节,那么为什么我们不能使用bufferedReader处理以字节为单位的图像。

    1. 我的第三个问题是这一行的意思是什么

    通常,每个对读取器的读取请求都会导致对底层字符或字节流发出相应的读取请求。

  • 共有1个答案

    微生俊
    2023-03-14

    这里有两个问题。

    1.缓冲

    假设你住在离你最近的水源一英里的地方,你每小时喝一杯水。你不会为了每个杯子都走到水边的。每天去一次,回家时带着满满一桶足够把杯子灌满24次的水。

     if there are not enough bytes in the "reservoir" to fulfil this request
          top up the "reservoir" by reading from the underlying Reader
     endif
     return some bytes from the "reservoir".
    

    然而,当您使用BufferedReader时,您不需要知道它是如何工作的,只需要知道它是如何工作的。

    2.图像的适用性

    了解BufferedReader和FileReader是阅读器的例子是很重要的。您可能还没有在编程教育中介绍多态性,所以当您这样做时,请记住这一点。这意味着,如果您有使用fileReader代码--但只有符合reader的方面--那么您可以替换bufferedreader,它的工作方式也是一样的。

     Reader reader = new FileReader(file);
    

    ...因为这将是您需要添加缓冲的唯一更改:

     Reader reader = new BufferedReader(new FileReader(file));
    

    我走了这条弯路,因为所有阅读器都不太适合图像。

    reader有两个read方法:

     int read(); // returns one character, cast to an int
     int read(char[] block); // reads into block, returns how many chars it read
    

    因此,如果要读取整数,请使用inputstream而不是readerInputStream具有int read(byte[]buf,int offset,int length)--字节比字符更可靠地从int来回转换。

     类似资料:
    • 据我所知,缓冲阅读器比非缓冲阅读器优化了很多,因为每次读取都将从内存中完成,不需要每次都从磁盘/网络进行I/O读/写。 所以我在这里阅读答案: 缓冲读取器和文件读取器之间的特定区别 我被第二个答案弄糊涂了,这个答案似乎有很高的票数: 当向BufferedReader对象发出“read”指令时,它会使用FileReader对象从文件中读取数据。当给出指令时,FileReader对象一次读取2(或4)

    • 编辑:到目前为止,我所见过的每一个类似LineReader的类似乎都被缓冲了。有没有人知道一个无缓冲的类linereader类?

    • 如果文件很小,我就工作。但是,当文件变大时,偏移量将小于实际值。我怎样才能得到抵消?

    • 我想从Java程序接收Arduino Uno上的多个字节。arduino在收到数据后立即处理数据,因此我不需要存储它,我使用串行RX缓冲区作为临时存储,直到我实际读取字节为止。完全实现后,每次将发送大约150个字节,但我已经修改了缓冲区大小来解决这个问题。我使用jSerialComm作为java的串行库 我在下面放了一些arduino和java代码。当我从IDE的串行监视器发送字节,按预期点亮le

    • 如何使用将所有可用字符读入? 编辑 1。委托不关心字符串有多长,它只需要处理通过套接字到达的任何哈达-以及它的全部内容 2。我不需要将数据切成块--我希望读取到达 3的每一个信息。是的,我有一个无限循环,因为我需要保持与套接字的连接并监听数据,直到客户端删除连接-当我获得时。我为套接字使用单独的线程,因为会有更多的套接字要听。

    • 我有一个名为“add”的方法,它将字符串作为参数,并使用bufferedwriter将其写入文件。完成此操作后,bufferedwriter将被刷新。 在另一个方法“read”中,我遍历文件中的行,但这些行是空的(因此我不能打印它们)。