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); } } } |
。
使用
使用缓冲流为您管理缓冲区:
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(); } |