java输入流输出流的互相转换(不需要经过临时文件啦超方便)

114 阅读1分钟

写在前面

工作中经常会遇到,将一个或多个文件读取,然后压缩,然后再怎么怎么做。

如果每个过程都需要创建一个临时文件,可能会创建许多临时文件,那么就可以将输入输出流无缝衔接,不需要使用临时文件了。

解决方案如下

直接上代码


        File file = new File("D:\\test\\3.exe");
        BufferedInputStream bis = null;
        ByteArrayOutputStream arrayOutputStream = null;
        OutputStream bos = null;
        try {
            // 模拟读入一个文件,作为输入流
            bis = new BufferedInputStream(new FileInputStream(file), 1024);
            // 创建ByteArray输出流,所有的输出可以输出到ByteArray中,可以替代一个文件
            arrayOutputStream = new ByteArrayOutputStream();
            //用buffered包装一下,为了提高效率使用缓冲区流
            bos=new BufferedOutputStream(arrayOutputStream);

            int len=-1;
            //读取文件输入流,写入到输出流ByteArray中,输入流转成了输出流
            byte[] buf = new byte[1024];
            while ((len = bis.read(buf)) != -1) {
                bos.write(buf,0,len);
            }
            bos.flush();//清空缓冲区(非必要)
            //创建ByteArrayResource用ByteArray输出流的字节数组
            InputStreamSource inputStreamSource = new ByteArrayResource(arrayOutputStream.toByteArray());
            //至此把OutputStream已经转换成了InputStreamSource,输出流又转成了输入流
            // 又将输入流转成了输出流
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStreamSource.getInputStream());
            int bytesRead;
            byte[] buffer = new byte[4096];
            while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {
                // 将文件发送到客户端
                bos.write(buffer, 0, bytesRead);
                bos.flush();
            }
        } catch (Exception e) {
            System.out.println(e);
        } finally{
            if(bos!=null){
                bos.close();//关闭BufferedOutputStream输出流
            }
            if(arrayOutputStream!=null){
                arrayOutputStream.close();//关闭ByteArray输出流
            }
            if(bis != null){
                bis.close();
            }
        }