我的问题:如何在不将文件保存到磁盘的情况下打开文件(在文件的系统默认[外部]程序中)?
我的情况:我的资源中有文件,我想先显示那些文件而不将它们保存到磁盘。例如,我有一个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);
}
}
答案 0 :(得分:3)
由于这一行:
String tempDir = System.getProperty("java.io.tmpdir") + "\\BONotifier\\";
我推断您正在使用Windows。你知道,你可以轻松地使这个代码成为多平台。
你的问题的答案是:不。 Desktop类需要知道文件的位置,以便使用参数调用正确的程序。请注意,该类中没有接受InputStream
的方法,这可能是一种解决方案。
无论如何,我没有看到问题所在:你创建一个临时文件,然后在编辑器或其他任何东西中打开它。没关系。在Linux中,当退出应用程序(通常)时,将删除其所有临时文件。在Windows中,用户需要触发临时文件删除。但是,如果您没有安全限制,我无法理解问题所在。毕竟,临时文件是操作系统的关注点。
答案 1 :(得分:1)
根据您的应用程序需要的可移植性,可能没有“一劳永逸”的解决方案来解决您的问题。但是,你可以稍微帮助自己:
至少在Linux下,您可以使用管道(|
)将一个程序的输出定向到另一个程序的输入。一个简单的例子(使用gedit
文本编辑器)可能是:
echo "hello world" | gedit
这将(对于gedit)打开一个新的编辑器窗口,并在一个未保存的新文档中显示内容“hello world”。
上述问题是,这可能不是独立于平台的解决方案。它适用于Linux和OS X,但我没有在这里进行Windows安装来测试它。
此外,您需要自己找出默认编辑器。这个older question和linked article提供了一些关于如何运作的想法。
答案 2 :(得分:0)
我不太了解你的问题。我只能看到你问题的两种可能性。
打开现有文件,您希望对其流进行操作,但不想保存任何修改。
创建一个文件,以便您可以使用文件i / o对文件流进行操作,但您不希望将该流保存到文件中。
在任何一种情况下,您的主要动机是利用现有的文件i / o来自行决定和编程乐趣,我是否正确?
我觉得问题不是那么简单,我的回答可能不是你所寻求的答案。但是,如果我对这个问题的理解与你的问题一致......
如果您希望使用Stream io,而不是使用FileOutputStream或FileInputStream,这是因为您打开File对象,为什么不使用非File InputStream或OutputStream?无论如何,您的文件i / o实用程序最终将归结为操作i / o流。
http://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html
http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html
无需涉及临时文件。