1

你好 Stack Overflow 社区,

我正在对使用 java Servlet 接收的一些数据进行多步处理。我目前的过程是我使用 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的 s 并重新创建那些 s 的流File?(我假设我的表现不错)

我看到了这种从 OutputStream 创建 InputStream 的最有效方法,但我不确定这是否是最好的方法......

4

3 回答 3

1

如果您真的不需要,我不知道您为什么要转换使用 Apache Commons 检索到的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对象来读取客户端发送的上传流,避免不必要的实例化。

是的,确实建议使用像BufferedInputStreamand之类的缓冲类BufferedOutputStream

另一种想法可能是避免(中间一个)并在不需要写入磁盘时FileOutputStream将其替换为(总是比在内存中工作慢)。ByteArrayOutputStream

于 2012-08-06T23:50:55.297 回答
1

只需替换FileOutputStreamByteArrayInputStream反之亦然。

例子:

ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
于 2012-08-06T23:01:40.230 回答
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 回答