2016-05-23 2 views
-2

は、私が使用します。私はもはや、フォルダへの書き込み権限を持っていないので、ファイルをメモリに保存してファイル出力ストリームを読み込む方法は?私は、ファイルを保存すると

File file = new File(filename); 

しかし、は、私はそれをメモリに保存したFileOutputStreamにファイルを読み取るために、むしろたいと思います。

私はこのアプローチをメモリにファイルを保存することができます読んだことがある:

new ByteArrayOutputStream(); 

はどのように全体のコードは次のようになりますか?アップロードが完了したら正しく書き込む方法を理解できません。

編集:私はVaadinsは、プラグインをアップロード使用しています:

public File file; 

    public OutputStream receiveUpload(String filename, 
             String mimeType) { 

     // Create upload stream 
     FileOutputStream fos = null; // Stream to write to 
     file = null; 

     if(StringUtils.containsIgnoreCase(filename, ".csv")){ 
      try { 

       file = new File(filename); 
       fos = new FileOutputStream(file); 
      } catch (final java.io.FileNotFoundException e) { 

       new Notification("Error", e.getMessage(), Notification.Type.WARNING_MESSAGE) 
        .show(Page.getCurrent()); 
       return null; 
      } 
     } else { 

      new Notification("Document is not .csv file", Notification.Type.WARNING_MESSAGE) 
       .show(Page.getCurrent()); 
      return null; 
     } 
     return fos; // Return the output stream to write to 
    } 
+0

あなたはメモリにそれを「保存」する必要がありますなぜですか?内容は "アップロード完了後"(多分 'byte []'または 'String')としてメモリに保存されます –

+1

*"どのようにコード全体が見えるでしょうか? "*試してみてください。 * 質問。 –

+0

sharobn ..どのようにそれらのコンテンツを収集できますか?私のコードはT.J.Crowderと表示されます。質問は、ディスクに書き込まずにデータを収集し、FileOutputStreamデータを取得する方法です。 – DarioBB

答えて

2
public OutputStream receiveUpload(String filename, 
            String mimeType) { 

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

    return byteArrayOutputStream; 
} 

あなたが使ってストリームで書かれたコンテンツを取得することができます:

byte[] dataWrittenInTheOutputStream = byteArrayOutputStream.toByteArray(); 

をそれとも、別の内容を書き込むことができます出力ストリーム:

byteArrayOutputStream.writeTo(System.out); 

または

file = new File(filename);  
fos = new FileOutputStream(file); 
byteArrayOutputStream.writeTo(fos); 
+0

私が必要とするものではありません。ディスクにファイルを保存していません。 – DarioBB

+0

何が必要ですか?あなたはどのようにデータを受け取りますか? –

+0

私はそれを理解しようとしています。ファイルをディスクに保存せずに実行できるかどうかはわかりません。コードは例です – DarioBB

0
  1. 彼らはチャンクと内部
  2. 巨大な配列を作成していないので、彼らは追加の配列の割り当てが必要になりますので、大規模な割り当てはそうではありません
  3. 、方法.toByteArray()の使用は避けてください、ByteArrayOutputStream /するByteArrayInputStreamを使用して避けてください。最も古い世代が使用されるため、いくつかの小さなオブジェクト割り当てよりも最適です。 See details in this answer

私のお勧めは何です:

  1. okioライブラリからBufferクラスを使用します。メモリ内でチャンクされ、InputStream/OutputStreamバインディングをサポートします。
  2. パフォーマンスを向上させるには、非同期のデータ読み取り方法を使用します。しかし、私は同期的な方法を示します。

ので、短いコードは次のようになります。

Buffer buffer = new Buffer(); 
buffer.readFrom(previouslyCreatedFileStream); // of course, it is better to use  
buffer.writeTo(someOutputStream); 
関連する問題