1

こんにちはスタックオーバーフローコミュニティ、

Javaサーブレットで受信している一部のデータに対してマルチステップ処理を行っています。私が現在行っているプロセスは、Apache File Uploadを使用してファイルをサーバーに入力し、それらをに変換することFileです。次にinput1、データが入力されたら、次のようなフローを実行します(プロセス関数はxsl変換です)。

File input1 = new File(FILE_NAME);  // <---this is populated with data
File output1 = new File(TEMP_FILE); // <---this is the temporary file

InputStream read = new FileInputStream(input1); 
OuputStream out = new FileOutputStream(output1);

process1ThatReadsProcessesOutputs( read, out);

out.close();
read.close();

//this is basically a repeat of the above process!
File output2 = new File(RESULT_FILE);  // <--- This is the result file 
InputStream read1 = new FileInputStream(output1);
OutputStream out1 = new FileOutputStream(output2);
Process2ThatReadsProcessesOutputs( read1, out1);
read1.close();
out1.close();
…

だから私の質問は、これを行うためのより良い方法があるかどうかですので、それらの一時的なものを作成してそれらへのFileストリームを再作成する必要はありませんFileか?(私はまともなパフォーマンスをペナルティで負っていると思います)

OutputStreamからInputStreamを作成するこの最も効率的な方法を見ましたが、これが最適なルートであるかどうかはわかりません...

4

3 に答える 3

1

単にその逆に交換FileOutputStreamしてください。ByteArrayInputStream

例:

ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
于 2012-08-06T23:01:40.230 に答える
1

本当に必要ないのに、なぜApacheCommonsで取得したFileItemを変換するのかわかりません。InputStreamアップロードされたファイルのコンテンツをそれぞれFileItemが使用および読み取る必要があるのと同じものを使用できます。

// create/retrieve a new file upload handler
ServletFileUpload upload = ...;

// parse the request
List<FileItem> items = (List<FileItem>) upload.parseRequest(request);

/* get the FileItem from the List. Yes, it's not a best practice because you must verify 
   how many you receive, and check everything is ok, etc. 
   Let's suppose you've done it */
//...
FileItem item = items.get(0); 

// get the InputStrem to read the contents of the file 
InputStream is = item.getInputStream();

したがって、最後に、オブジェクトを使用しInputStreamて、クライアントから送信されたアップロードされたストリームを読み取り、不要なインスタンス化を回避できます。

BufferedInputStreamはい、とのようなバッファリングされたクラスを使用することを強くお勧めしますBufferedOutputStream

もう1つのアイデアは、(真ん中の)回避して、ディスクに書き込む必要がない場合(常にメモリでの作業よりも遅いFileOutputStream)に置き換えることです。ByteArrayOutputStream

于 2012-08-06T23:50:55.297 に答える
0

Java 9は、この質問に対する新しい答えをもたらします。

// All bytes from an InputStream at once
byte[] result = new ByteArrayInputStream(buf)
    .readAllBytes();

// Directly redirect an InputStream to an OutputStream
new ByteArrayInputStream(buf)
    .transferTo(System.out);
于 2017-04-02T09:26:56.853 に答える