Java BufferedReader可以读取字节吗?

Java BufferedReader可以读取字节吗?,java,file-handling,Java,File Handling,很抱歉,如果这个问题很复杂,但我没有得到我想要的答案 Java文档是这样说的 通常,读取器发出的每个读取请求都会导致底层字符或字节流发出相应的读取请求。因此,建议将BufferedReader包装在任何read()操作可能代价高昂的读取器周围,例如FileReaders>和InputStreamReaders。比如说, 将缓冲来自指定文件的输入。如果没有缓冲,每次调用read()或readLine()都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能非常低效 我的第一个问题是如果buf

很抱歉,如果这个问题很复杂,但我没有得到我想要的答案

Java文档是这样说的

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

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

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

  • 我的第二个问题是Bufferedreader是否在缓冲区中存储字符?这一行的含义是什么

  • 将缓冲来自指定文件的输入

  • 我的第三个问题是这句话是什么意思
  • 通常,读取器发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求

    java中的读卡器(和写卡器)是处理文本(字符)流的专用类——行的概念在任何其他类型的流中都是毫无意义的

    对于通用IO等效项,请查看

    因此,要回答您的问题:

  • 虽然读取器最终读取字节,但它会将字节转换为字符。它不打算读取任何其他内容(如图像)-为此使用InputStream类家族
  • 缓冲读取器将从底层流(可能是文件、套接字或其他任何内容)中读取大块数据到内存中的缓冲区中,然后从该缓冲区提供读取请求,直到缓冲区清空。这种每次读取大块而不是较小的卡盘的行为提高了性能
  • 这意味着,如果您将读卡器包装在缓冲读卡器中,则每次您要读取单个字符时,它都会访问disk.network以获取所需的单个字符。在如此小的块中执行I/O通常会对性能造成影响
  • 默认行为是它将转换为字符,但当您有一个图像时,您不能有字符数据,而是需要像素字节数据。所以你不能用它

  • 它是缓冲,也就是说,它在读取字符数组中的某个数据块。您可以在代码中看到这种行为:

  • defaultCharBufferSize如下所述:

    私有静态int-defaultCharBufferSize=8192

    简而言之,buffred的意思是,它将首先读取一些字符数据块,这些数据块将保存在一个字符数组中,并将被处理,然后再次读取相同的数据块,直到到达流的末尾

    您可以参考以下内容了解更多信息


    这里有两个问题

    1。缓冲

    想象一下,你住在离最近的水源一英里的地方,每小时喝一杯水。嗯,你不可能一杯一杯地走到水边。每天去一次,带着一桶足够装满24次的水回家

    桶是一个缓冲器

    想象一下,你的村庄由河流供水。但有时河水会干涸一个月;其他时候,这条河带来的水太多,以致于村庄被洪水淹没。所以你建了一个水坝,水坝后面有一个水库。水库在雨季蓄水,在旱季逐渐排空。这个村庄一年四季都有稳定的水流

    水库是一个缓冲区

    计算中的数据流与这两种场景类似。例如,您可以在一次操作系统调用中从文件系统获取数千字节的数据,但如果您希望一次处理一个字符,则需要类似于存储库的内容

    BufferedReader中包含另一个读卡器(例如文件读卡器),它是河流,还有一个字节数组,它是水库。每次你读到它时,它都会做一些类似的事情:

     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
    s都不太适合图像

    Reader
    有两种
    read
    方法:

     int read(); // returns one character, cast to an int
     int read(char[] block); // reads into block, returns how many chars it read
    
    第二种形式不适用于图像,因为它肯定读取字符,而不是整数

    第一个表单看起来似乎还可以——毕竟,它读取ints。事实上,如果您只使用文件阅读器,它可能会很好地工作

    但是,请考虑围绕文件读取器的BufferedReader将如何工作。第一次调用BufferedReader.read()时,它将调用FileReader.read(buffer)来填充其缓冲区。然后它将把缓冲区的第一个
    char
    转换回int,并返回该值

    特别是当您将多字节字符集引入图片时,这可能会导致问题

    因此,如果要读取整数,请使用
    InputStream
    而不是
    Reader
    <代码>输入流具有
    int读取(字节[]bu
    
     Reader reader = new FileReader(file);
    
     Reader reader = new BufferedReader(new FileReader(file));
    
     int read(); // returns one character, cast to an int
     int read(char[] block); // reads into block, returns how many chars it read