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

标签 java file io temp

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

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

我一直在做什么:到目前为止,我只是将文件保存到一个临时位置,但我无法知道他们何时不再需要该文件,所以我不知道什么时候/if 删除它。这是我的 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 中,用户将需要触发临时文件删除。但是,如果您没有安全约束,我无法理解问题出在哪里。毕竟,临时文件是操作系统的关注对象。

关于java - 如何在不将文件保存到磁盘的情况下打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12964050/

相关文章:

java - 根据单词中的位置替换字符串中的字母

c - 如何计算文件中的换行符,但不计算只是换行符的行?

python - 在 Python 中区分空行和文件结尾

amazon-ec2 - 监控 I/O 请求

java - 方法无法修改输入 int 参数

java - 在 Android 中从导入的 jar 中读取资源

选择文件后的 html 输入文件操作

python - win32api 与 Python

c - 第一行代码之前的段错误

java - Hibernate:双向 ManyToOne 映射 - 逆关系不起作用