将字节 [] 写入 OutputStream 时添加缓冲区 [重复]

Posted

技术标签:

【中文标题】将字节 [] 写入 OutputStream 时添加缓冲区 [重复]【英文标题】:Adding buffer when writing byte[] to OutputStream [duplicate] 【发布时间】:2016-09-21 08:08:40 【问题描述】:

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

目前看起来是这样的

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

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

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

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

【问题讨论】:

在链接的问题中查看这个答案:***.com/a/19194580/1743880 有一个内置的:Files.copy(Path, OutputStream) 【参考方案1】:

    最简单的方法是使用Commons IO library

    public void readFileToOutputStream(Path path, OutputStream os) throws IOException 
      try(InputStream in = new FileInputStream(path.toFile()))
        IOUtils.copy(in, os);
      
    
    

    你可以自己实现类似于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);
        
      
    
    

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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
                        
                    
                
            
        
    

【讨论】:

您可以在try 部分内拥有多个资源,而不是嵌套与资源一样多的try 块。 @Tunaki 不知道这一点。谢谢【参考方案4】:

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

【讨论】:

以上是关于将字节 [] 写入 OutputStream 时添加缓冲区 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中OUTPUTSTREAM中方法WRITE用法

00089_字节输出流OutputStream

字节输出流 OutputStream 总结

Java FileInput/OutputStream 和 ByteBuffer

review25

如何将 outputStream 转换为字节数组?