将 Vaadin7 StreamResource 保存到文件
Save Vaadin7 StreamResource to file
我有一个 StreamResource class 的对象,里面有一些需要的内容。我确定此内容有效,我需要将其保存在本地以供进一步处理。这是代码片段:
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();
}
在这里我加入了无限循环。从未发生中断,所需位置的文件变得很大,实际上应该如此。在调试器下,我看到 read() 操作 returns 每次迭代中只有第一个字节块,甚至在 os.write.
之后调用 skip()
我应该如何从流中读取内容?
谢谢。
根据 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 上使用间接寻址,因为我猜你之前创建了那个对象。
我有一个 StreamResource class 的对象,里面有一些需要的内容。我确定此内容有效,我需要将其保存在本地以供进一步处理。这是代码片段:
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();
}
在这里我加入了无限循环。从未发生中断,所需位置的文件变得很大,实际上应该如此。在调试器下,我看到 read() 操作 returns 每次迭代中只有第一个字节块,甚至在 os.write.
之后调用 skip()我应该如何从流中读取内容?
谢谢。
根据 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 上使用间接寻址,因为我猜你之前创建了那个对象。