将Vaadin7 StreamResource保存到文件中

时间:2016-05-24 12:47:12

标签: java stream vaadin vaadin7

我有一个StreamResource类的对象,里面有一些需要的内容。我确定这个内容是有效的,我需要在本地保存以便进一步处理。以下是代码段:

OutputStream os = new FileOutputStream(filePath, false);

byte[] buffer = new byte[1024];
int bytesRead;
//read from is to buffer
try {
    while(true)
    {
         bytesRead = resource.getStream().getStream().read(buffer);
         if(bytesRead == -1)
             break;

         os.write(buffer, 0, bytesRead);
         resource.getStream().getStream().skip(bytesRead);
    }
    os.flush();
    os.close();
} catch (IOException e) {
    e.printStackTrace();
}

在这里我加入无限循环。 Break永远不会出现,并且所需位置的文件变得非常大,因为它应该实际上。在调试器下,我看到read()操作在每次迭代中只返回第一块字节,甚至在os.write后调用skip()。

我应该如何阅读流中的内容?

感谢。

1 个答案:

答案 0 :(得分:1)

根据StreamResource的源代码,每次调用都会创建一个新的DownloadStream。您应该只调用一次,如下面的代码段所示:

OutputStream os = new FileOutputStream(filePath, false);

byte[] buffer = new byte[1024];
int bytesRead;
//read from is to buffer
try {
    DownloadStream stream = resource.getStream();
    while(true)
    {
         bytesRead = stream.getStream().read(buffer);
         if(bytesRead == -1)
             break;

         os.write(buffer, 0, bytesRead);
    }
    os.flush();
    os.close();
} catch (IOException e) {
    e.printStackTrace();
}

这样,每次迭代都不会从头开始读取流。但是,我仍然不明白为什么你在StreamResource上使用间接,因为我猜你以前创建了那个对象。