将byte []写入OutputStream时添加缓冲区

时间:2016-05-24 08:20:37

标签: java buffer

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

目前,它看起来像这样

public void readFileToOutputStream(Path path, OutputStream os) {
    byte[] barr = Files.readAllBytes(path)

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

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

我可以使用什么来为缓冲区提供读数?

4 个答案:

答案 0 :(得分:1)

  1. 简单的方法是使用Commons IO library

    public void readFileToOutputStream(Path path, OutputStream os) throws IOException {
      try(InputStream in = new FileInputStream(path.toFile())){
        IOUtils.copy(in, os);
      }
    }
    
  2. 您可以自己实现类似 IOUtils.copy

    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);
        }
      }
    }
    

答案 1 :(得分:0)

如果我理解你的问题,你只想在内存中写入指定数量的字节吗?

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

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

public void readFileToOutputStream(Path path, OutputStream os, int off, int len) {
    byte[] barr = Files.readAllBytes(path)

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

答案 2 :(得分:0)

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

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
                        }
                    }
                }
            }
        }
    }
}

答案 3 :(得分:0)

使用FileInputStream::read(byte[] b, int off, int len) link 读取最多len个字节以缓冲bFileOutputStream::write(byte[] b, int off, int len) link2从缓冲区写入