写在前面
工作中经常会遇到,将一个或多个文件读取,然后压缩,然后再怎么怎么做。
如果每个过程都需要创建一个临时文件,可能会创建许多临时文件,那么就可以将输入输出流无缝衔接,不需要使用临时文件了。
解决方案如下
直接上代码
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();
}
}
|