关于java:将byte []写入OutputStream时添加缓冲区

Adding buffer when writing byte[] to OutputStream

本问题已经有最佳答案,请猛点这里访问。

在我的方法中,我将数据从文件保存到输出流。

现在,它看起来像这样

1
2
3
4
5
6
public void readFileToOutputStream(Path path, OutputStream os) {
    byte[] barr = Files.readAllBytes(path)

    os.write(barr);
    os.flush();
}

但是在这个解决方案中,所有字节都被加载到内存中,我想使用缓冲区来释放其中的一些字节。

我可以用什么来提供缓冲区?


  • 简单的方法是使用公共IO库

    1
    2
    3
    4
    5
    public void readFileToOutputStream(Path path, OutputStream os) throws IOException {
      try(InputStream in = new FileInputStream(path.toFile())){
        IOUtils.copy(in, os);
      }
    }
  • 您可以自己实现类似ioutils.copy的功能。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void readFileToOutputStream(Path path, OutputStream os) throws IOException {
      try (InputStream fis = new FileInputStream(path.toFile());
           InputStream bis = new BufferedInputStream(fis)) {
        byte[] buffer = new byte[4096];
        int n;
        while ((n = bis.read(buffer)) >= 0) {
          os.write(buffer, 0, n);
        }
      }
    }


  • 使用FileInputStream::read(byte[] b, int off, int len)链接向缓冲区bFileOutputStream::write(byte[] b, int off, int len)链路2读至多len字节,从缓冲区写入数据。


    使用缓冲流为您管理缓冲区:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public void readFileToOutputStream(Path path, OutputStream os) {
        try (FileInputStream fis = new FileInputStream(path.toFile())) {
            try (BufferedInputStream bis = new BufferedInputStream(fis)) {
                try (DataInputStream dis = new DataInputStream(bis)) {
                    try (BufferedOutputStream bos = new BufferedOutputStream(os)) {
                        try (DataOutputStream dos = new DataOutputStream(bos)) {
                            try {
                                while (true) {
                                    dos.writeByte(dis.readByte());
                                }
                            } catch (EOFException e) {
                                // normal behaviour
                            }
                        }
                    }
                }
            }
        }
    }


    如果我正确理解您的问题,您只想将指定数量的字节写入内存?

    OutputStreams写入方法还可以从起始偏移量和长度写入指定的字节数组。

    https://docs.oracle.com/javase/7/docs/api/java/io/outputstream.html

    1
    2
    3
    4
    5
    6
    public void readFileToOutputStream(Path path, OutputStream os, int off, int len) {
        byte[] barr = Files.readAllBytes(path)

        os.write(barr, off, len);
        os.flush();
    }