2017-09-10 3 views
0

私はJettyサーバーから大きなファイルを返す必要があり、私はそれを行うために私の会社のソースコードに3つの異なる方法を見つけました。私は今、彼らの賛否両論をパフォーマンスワイズ、記憶と時間を理解しようとしています。jettyサーバーから大きなファイルを返す最良の方法は何ですか?

オプションA:書くこと

Path path = <FilePath>; 
    return path.toFile(); 

最も簡単。しかし、ファイル全体がメモリにロードされてから送信されますか?または桟橋はそれを流すのですか?

オプションB:

Path path = <FilePath>; 
    return new FileInputStream(path.toFile()); 

はここにストリーミングするためのファイルを回しているオプションAと比較も効果がありますか?

オプションC:

Path path = <FilePath>; 
    return new StreamingOutput() { 
     @Override 
     public void write(final OutputStream out) throws IOException { 
      copy(path, out); 
     } 
    }; 

はコピーがここで必要ですか?オプションBと比較して冗長ではありませんか?基づいて

オプションD Streaming Large Files In a Java Servlet

Path path = <FilePath>; 
InputStream in = null; 
OutputStream out = null; 
try { 
    in = new FileInputStream(path.toFile()); 
    out = response.getOutputStream(); 
    IOUtils.copy(in, out); 
} finally { 
    IOUtils.closeQuietly(in); 
    IOUtils.closeQuietly(out); 
} 

他/より良いオプションがある場合は、それらを共有してください。

+0

もちろん、ここのコードは要求を処理する関数本体のスニペットです。 –

+0

多分ここで読むことができます:https://stackoverflow.com/questions/55709/streaming-large-files-in-a-java-servlet – PeterMmm

+0

@PeterMmm - ありがとうございます。しかし、それは全体を読み込む代わりにデータをストリーミングする必要性を説明していますデータをメモリに送信してから送信します。私がまだ混乱しているのは、Jettyが 'File'または' InputStream'を与えられたときに内部的に応答を処理する方法です。内部的にストリームを知っていますか? –

答えて

0

オプションA:書くこと

Path path = <FilePath>; 
return path.toFile(); 

最も簡単。しかし、ファイル全体がメモリにロードされてから送信されますか?

や桟橋には、それをストリームのでしょうか?

いいえこれはすべてFileオブジェクトです。

オプションB:

はここにストリーミングするためのファイルを回しているオプションAと比較も効果がありますか?

はい、ただし有用ではありません。効果。 FileInputStreamを返します。これは、接続のもう一方の端では使用されません。

オプションC:

Path path = <FilePath>; 
return new StreamingOutput() { 
    @Override 
    public void write(final OutputStream out) throws IOException { 
     copy(path, out); 
    } 
}; 

はここに必要なコピーですか?

はい。

オプションBと比べて冗長ではありませんか?

いいえこれは実際にはStreamingOutputの内容に依存します。

オプションD: に基づいて:でストリーミングサイズの大きなファイルをJavaサーブレット

Path path = <FilePath>; 
InputStream in = null; 
OutputStream out = null; 
try { 
    in = new FileInputStream(path.toFile()); 
    out = response.getOutputStream(); 
    IOUtils.copy(in, out); 
} finally { 
    IOUtils.closeQuietly(in); 
    IOUtils.closeQuietly(out); 
} 

これは、実際にサーバからクライアントに何かをコピーするように見えるあなたが提示してきた唯一のオプションです。これを達成するには他にも方法がありますが、FileまたはFileInputStreamを返す方法はありません。

+0

お手数ですが、試してみることはできますが、提示されたすべてのオプションを試してみましたが、そのすべてでクライアント側のコンテンツ全体を含む 'file'を受け取りました。オプションCに関しては、 'javax.ws.rs.core.StreamingOutput'を使用します。 –

関連する問題