2016-05-24 10 views
0

私はStreamResourceクラスのオブジェクトをいくつか必要なコンテンツとともに持っています。私はこのコンテンツが有効であると確信して、私はそれ以降の処理のためにローカルに保存する必要があります。コードスニペットは次のとおりです。ファイルに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(); 
} 

ここで私は無限ループに参加します。ブレークは決して矯正されず、必要な場所のファイルは実際には巨大になります。デバッガでは、read()オペレーションは、os.writeの後にw/skip()を呼び出しても、各繰り返しで1バイト目のバイトだけを返します。

ストリームからコンテンツをどのように読み取る必要がありますか?

ありがとうございました。

+0

ユースケースとは何ですか?ユーザーがVaadinアプリに何かをアップロードしていますか? –

+0

いいえ、私はコンテンツを自分で生成します。ここにアップロードはありません。 – user1053031

答えて

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を介してインダイレクションを使用する理由はまだありません。

+0

あなたの答えをありがとう。私は少し後にそれをテストします - 今私は私の働く環境から遠く離れています。私は小さなエキスパートを持っているようです。ストリームで作業しています(( – user1053031

+0

ありがとうございました! – user1053031

関連する問題