前端:
<form method="post" action="/file/upload" enctype="multipart/form-data">
<p>Type: <input type="text" name="type" value="multiPartFileSingle" size="60" /></p>
<p>File 1: <input type="file" name="files" size="60" /></p>
<p>File 2: <input type="file" name="files" size="60" /></p>
<p><input type="submit" value="Upload" /></p>
</form>
后端:
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String upload(@RequestParam("files") MultipartFile[] files, Model model) {
MyFile myFile = new MyFile();
String source;
String target;
String difference;
try {
BufferedReader sourceBufferedReader = new BufferedReader(new InputStreamReader(files[0].getInputStream()));
BufferedReader sourceBufferedReaderForParse = new BufferedReader(new InputStreamReader(files[0].getInputStream()));
BufferedReader targetBufferedReader = new BufferedReader(new InputStreamReader(files[1].getInputStream()));
BufferedReader targetBufferedReaderForParse = new BufferedReader(new InputStreamReader(files[1].getInputStream()));
source = parseBufferedReader(sourceBufferedReaderForParse);
target = parseBufferedReader(targetBufferedReaderForParse);
List<String> strings = fileService.differFiles(sourceBufferedReader, targetBufferedReader);
StringBuilder stringBuilder = new StringBuilder();
for (String string : strings) {
stringBuilder.append(string);
}
difference = stringBuilder.toString();
myFile.setSource(source);
myFile.setTarget(target);
myFile.setDifference(difference);
myFile.setDiffDate(new Date());
fileDao.insertFile(myFile);
} catch (IOException e) {
logger.error("Exception occurs when read line from BufferedReader!");
}
model.addAttribute("files", fileDao.selectFiles());
return "list";
}
BufferedReader到String的转换:
private String parseBufferedReader(BufferedReader bufferedReader) {
StringBuilder stringBuilder = new StringBuilder();
try {
String tempString = bufferedReader.readLine();
while (tempString != null) {
stringBuilder.append(tempString);
tempString = bufferedReader.readLine();
}
} catch (IOException e) {
logger.error("Exception occurs when read line from BufferedReader!");
}
return stringBuilder.toString();
}
这些代码实现了文件上传,并且获取上传文件的inputStream,再转换为字符串进行上传文件的处理.
现存问题:
1.引文bufferedReader读一次就清空,所以在用到两次bufferedReader的时候进行了两次新建bufferedReader.这种设计非常不好,对内存资源是一种浪费.以下代码就比较恶心.
BufferedReader sourceBufferedReader = new BufferedReader(new InputStreamReader(files[0].getInputStream()));
BufferedReader sourceBufferedReaderForParse = new BufferedReader(new InputStreamReader(files[0].getInputStream()));
BufferedReader targetBufferedReader = new BufferedReader(new InputStreamReader(files[1].getInputStream()));
BufferedReader targetBufferedReaderForParse = new BufferedReader(new InputStreamReader(files[1].getInputStream()));
2.上传文件后对文件可以直接进行处理,如果将MultipartFile先存为File,再将文件读入内存进行处理就非常挫.因为做了一次无谓的IO.