现有一个项目,是基于云平台的开发,应用程序不能在服务器创建文件,因为不具备权限、且具体响应的服务器IP是未知的。
问题如下:
根据多个文件ID,可从文件服务器获取多个 InputStream 供用户下载,但是用户需要多次保存。
现需要将这多个 InputStream 直接包装成一个流(即:不能在服务器上创建真实的文件和文件夹),使用户只需要保存一次。 InputStream包装成一个流不操作文件多个 InputStream云平台
问题如下:
根据多个文件ID,可从文件服务器获取多个 InputStream 供用户下载,但是用户需要多次保存。
现需要将这多个 InputStream 直接包装成一个流(即:不能在服务器上创建真实的文件和文件夹),使用户只需要保存一次。 InputStream包装成一个流不操作文件多个 InputStream云平台
public class MultipleInputStream extends InputStream { public MultipleInputStream(InputStream[] targets) {
//....
} //修改默认的实现。
}以上是自己实现,当然使用3楼的SequenceInputStream也是个好办法,只要没有特殊要求。
你或者可以直接继承SequenceInputStream,再改一些自己需要的功能。
您好,这个主要是从用户的角度不用多次保存,用户本地保存的还是多个文件,所以SequenceInputStream不合适;
ZipOutputStream 需要文件服务器的IP、文件路径,但实际上IP和路径都是未知的,云端只返回多个InputStream 。但还是谢谢你的回答!
我想了一下,其实现在的主要问题是
能不能将多个InputStream 直接封装成一个 ZipOutputStream(即:不能在服务器上创建真实的文件和文件夹)
一个保存操作,用一个类,处理多个流也是可以的啊,楼主在疑问什么呢?
得到两个流,分别处理,保存在客户端两个InputStream in1 = ...;
InputStream in2 = ...;
byte[] buf1 = new byte[2048];
byte[] buf2 = new byte[2048];
int len1 = in1.read(buf1);
int len2 = in2.read(buf2);
OutputStream o1 = new FileOutputStream("d://copytest1.txt");
OutputStream o2 = new FileOutputStream("d://copytest2.txt");
o1.write(buf1,0,len1);
o2.write(buf2,0,len2);
in1.close();
in2.close();
o1.close();
o2.close();
应该是下载方式的问题吧?用什么实现在下载?
现在的主要问题是
能不能将多个InputStream 直接封装成一个 ZipOutputStream(即:不能在服务器上创建真实的文件和文件夹)
ZipOutputStream也没有问题。InputStream in1 = ...;
InputStream in2 = ...;
ZipOutputStream out = new ZipOutputStream(new FileOutputStream("d://copytest.zip")); out.putNextEntry(new org.apache.tools.zip.ZipEntry("copy1"));
int b;
while ( (b = in1.read()) != -1) {
out.write(b);
}
out.putNextEntry(new org.apache.tools.zip.ZipEntry("copy2"));
int b2;
while ( (b2 = in2.read()) != -1) {
out.write(b2);
}
out.close();
in1.close();
in2.close();
我觉得 11楼的有道理啊,可以将服多个输入流保存到多个字节数组里啊。
然后输出到本地。
可能是我理解的不够深。O(∩_∩)O。
之前就是怕文件太多的时候,用字节数组存文件流(都是几十兆的DOC、图片什么的,且系统并发量较大)再压缩占用的内存太大,所以一开始就没往这方面想。
现在看来,如果实在没有文件操作权限的话,也只能操作内存、用字节数组来实现了,我再想想怎么优化内存吧。谢谢大家的回答!