我想从方法返回文件(读取或加载),然后删除此文件。
public File method() {
File f = loadFile();
f.delete();
return f;
}
但是当我删除文件时,我会从磁盘中删除它,然后在return语句中只存在描述符到非现有文件。那么最有效的方法是什么呢。
答案 0 :(得分:2)
你不能保留已删除文件的File句柄,而是可以暂时将数据保存在字节数组中,删除文件然后返回字节数组
public byte[] method() {
File f =loadFile();
FileInputStream fis = new FileInputStream(f);
byte[] data = new byte[fis.available()];
fis.read(data);
f.delete();
return data;
}
// 编辑Aproach 2
FileInputStream input = new FileInputStream(f);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int bytesRead = input.read(buf);
while (bytesRead != -1) {
baos.write(buf, 0, bytesRead);
bytesRead = input.read(buf);
}
baos.flush();
byte[] bytes = baos.toByteArray();
您可以从字节数组
构造文件数据但是,我的建议是使用来自Jakarta commons的IOUtils.toByteArray(InputStream输入),为什么要在已经在盘中重写
答案 1 :(得分:0)
假设您要将文件返回浏览器,我就是这样做的:
File pdf = new File("file.pdf");
if (pdf.exists()) {
try {
InputStream inputStream = new FileInputStream(pdf);
httpServletResponse.setContentType("application/pdf");
httpServletResponse.addHeader("content-disposition", "inline;filename=file.pdf");
copy(inputStream, httpServletResponse.getOutputStream());
inputStream.close();
pdf.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
private static int copy(InputStream input, OutputStream output) throws IOException {
byte[] buffer = new byte[512];
int count = 0;
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}