如何返回和删除文件?

时间:2013-12-09 16:00:34

标签: java java-io

我想从方法返回文件(读取或加载),然后删除此文件。

public File method() {
    File f = loadFile();
    f.delete();
    return f;
}

但是当我删除文件时,我会从磁盘中删除它,然后在return语句中只存在描述符到非现有文件。那么最有效的方法是什么呢。

2 个答案:

答案 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;
}