2011-09-14 15 views
0

私はWebアプリケーションを作成しており、ユーザーがリンクをクリックしてファイルをダウンロードできるようにしたいと考えています。http応答にストリームするファイルを作成する方法

私はインターフェイスを持っているが、私は変更することはできませんサードパーティのライブラリである:

writeFancyData(File file, Data data); 

は私が書かれたときにことをこのメソッドに渡すことができるファイルオブジェクトを作成することができます簡単な方法はありますHTTP応答にストリームするか?

注:

もちろん、私はただの一時ファイルを書き込むことができ、その後にそれをリードバックして、それをHTTPレスポンスの出力ストリームを作成します。しかし、私が探しているのは、ファイルシステムIOを回避する方法です。理想的には、偽のファイルを作成して、書き込まれたときにhttpレスポンスの出力ストリームに書き込みます。

writeFancyData(new OutputStreamBackedFile(response.getOutputStream()), data); 

私が再現できない非常に特定のフォーマットでファイルを書き込むので、writeFancyDataメソッドを使用する必要があります。

+0

ファイルオブジェクトを作成する際の難しさは何ですか? – nidhin

+0

それをストリーミングする目的は何ですか?ダウンロードを要求する各ユーザーに対して動的に作成されますか? – ZenMaster

+0

はい、動的に作成されます。 – Pablojim

答えて

2

writeFancyDataがブラックボックスだとすると、それは不可能です。あなたはファイルの任意の拡張版から返すことができる唯一のことは、あなただけのことができるように、パス名つもりはないさを考えると

public void writeFancyData(File file, Data data){ 
    File localFile = new File(file.getPath()); 
    ... 
    // process data from file 
    ... 
} 

:思考実験として、このような何かをしたwriteFancyDataの実装を検討そのメソッドに必要なデータを取得します。シグネチャに何らかのストリームが含まれていれば、より良い立場になりますが、渡すことができるのはファイルなので、これはできません。

実際には、FileInputStreamまたはFileReaderクラスの1つで、おそらくFileオブジェクトを名前の代わりに使用し、ネイティブメソッドを呼び出してファイル記述子を取得し、実際の入出力を処理します。

1

このAPIを使用すると、RAMディスクファイルシステム内のファイルに対してFileを与えることができます。

さらに、WriterまたはOutputStream引数を取るオーバーロードを要求するAPIに対してバグ/不具合レポートを提出します。

1

dlawrenceはAPIを記述するため、APIがファイルで何をしているのかを判断することはできません。

Java以外の方法は、named pipeを作成することです。あなたはあなたのプログラムでパイプのためのリーダーを確立し、そのパスにFileを作成してAPIに渡すことができます。

このようなことをする前に、パフォーマンスを分析し、ディスクI/Oが実際にボトルネックであることを確認することをお勧めします。

関連する問題