java-如何在不将文件保存到磁盘的情况下打开文件

提问

我的问题:如何在不将文件保存到磁盘的情况下打开文件(在系统默认的[外部]程序中)?

我的情况:我的资源中有文件,我想显示这些文件而不先保存到磁盘.例如,我有一个xml文件,我想在用户计算机上的默认程序中打开它以读取xml文件,而无需先将其保存到磁盘上.

我一直在做什么:到目前为止,我只是将文件保存到一个临时位置,但是我无法知道何时他们不再需要该文件,因此我不知道何时/是否删除它.这是我的SSCCE代码(嗯,除了资源外,大部分都是sscce……您必须自己创建它):

package main;

import java.io.*;

public class SOQuestion {

  public static void main(String[] args) throws IOException {
    new SOQuestion().showTemplate();
  }

  /** Opens the temporary file */
  private void showTemplate() throws IOException {
    String tempDir = System.getProperty("java.io.tmpdir") + "\\BONotifier\\";
    File parentFile = new File(tempDir);
    if (!parentFile.exists()) {
      parentFile.mkdirs();
    }
    File outputFile = new File(parentFile, "template.xml");
    InputStream inputStream = getClass().getResourceAsStream("/resources/template.xml");
    int size = 4096;
    try (OutputStream out = new FileOutputStream(outputFile)) {
      byte[] buffer = new byte[size];
      int length;
      while ((length = inputStream.read(buffer)) > 0) {
        out.write(buffer, 0, length);
      }
      inputStream.close();
    }
    java.awt.Desktop.getDesktop().open(outputFile);
  }
}

最佳答案

由于这一行:

String tempDir = System.getProperty("java.io.tmpdir") + "\\BONotifier\\";

我推断出您正在使用Windows.您知道,您可以轻松地将此代码设置为多平台.

您的问题的答案是:不. Desktop类需要知道文件在哪里,以便使用参数调用正确的程序.请注意,该类中没有接受InputStream的方法,这可能是一个解决方案.

无论如何,我看不出问题出在哪里:您创建了一个临时文件,然后在编辑器中打开它.没关系.在Linux中,退出应用程序(通常)后,将删除其所有临时文件.在Windows中,用户将需要触发临时文件的删除.但是,如果您没有安全限制,那么我将无法理解问题出在哪里.毕竟,临时文件是操作系统所关心的.

评论