现有一个项目,是基于云平台的开发,应用程序不能在服务器创建文件,因为不具备权限、且具体响应的服务器IP是未知的。
问题如下:
根据多个文件ID,可从文件服务器获取多个 InputStream 供用户下载,但是用户需要多次保存。
现需要将这多个 InputStream 直接包装成一个流(即:不能在服务器上创建真实的文件和文件夹),使用户只需要保存一次。 InputStream包装成一个流不操作文件多个 InputStream云平台

解决方案 »

  1.   

    这是我在csdn上提的第一个问题,所以结贴率为0%,请各位同行见谅啊
      

  2.   

    SequenceInputStream 用来将2个流合并在一起,输出后,两个文件就变成一个文件了.可以看下ZipOutputStream,将多个文件压缩,然后将压缩后的文件保存到客户端. 
      

  3.   

    貌似楼主想要的只是前台一次点击保存是吧 那是不是不用管点击触发下载的实际是一个流还是多个流(InputStream貌似也可以不弹出保存对话框)
      

  4.   

    我没有理解楼主的意思,好像是要合并多个输入流让用户读取?你是不是可以考虑继承InputStream,像这样。
      public class MultipleInputStream extends InputStream {    public MultipleInputStream(InputStream[] targets) {
          //....
        }    //修改默认的实现。
      }以上是自己实现,当然使用3楼的SequenceInputStream也是个好办法,只要没有特殊要求。
    你或者可以直接继承SequenceInputStream,再改一些自己需要的功能。
      

  5.   


    您好,这个主要是从用户的角度不用多次保存,用户本地保存的还是多个文件,所以SequenceInputStream不合适;
    ZipOutputStream 需要文件服务器的IP、文件路径,但实际上IP和路径都是未知的,云端只返回多个InputStream 。但还是谢谢你的回答!
      

  6.   

    楼主问题补充:
    我想了一下,其实现在的主要问题是
    能不能将多个InputStream 直接封装成一个 ZipOutputStream(即:不能在服务器上创建真实的文件和文件夹)
      

  7.   


    一个保存操作,用一个类,处理多个流也是可以的啊,楼主在疑问什么呢?
    得到两个流,分别处理,保存在客户端两个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();
    应该是下载方式的问题吧?用什么实现在下载?
      

  8.   


    现在的主要问题是
    能不能将多个InputStream 直接封装成一个 ZipOutputStream(即:不能在服务器上创建真实的文件和文件夹)
      

  9.   


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

  10.   

    java 菜鸟:
    我觉得 11楼的有道理啊,可以将服多个输入流保存到多个字节数组里啊。
    然后输出到本地。
    可能是我理解的不够深。O(∩_∩)O。
      

  11.   

    就用ZipOutputStream,里面套一个字节数组流生成在内存中以便下载,ByteArrayOutputStream bos=new ByteArrayOutputStream();ZipOutputStream zos=new ZipOutputStream(bos)什么文件服务器ip,文件路径啊。你只要从你云端获得的这些流里面循环读取,一个流就putNextEntry(String name);//文件名自订吧。然后就读取这个inputStream进行write到这个zos中。最后在用这个bos转换成ByteArrayInputStream来提供下载不就行了
      

  12.   


    之前就是怕文件太多的时候,用字节数组存文件流(都是几十兆的DOC、图片什么的,且系统并发量较大)再压缩占用的内存太大,所以一开始就没往这方面想。
    现在看来,如果实在没有文件操作权限的话,也只能操作内存、用字节数组来实现了,我再想想怎么优化内存吧。谢谢大家的回答!