Java 如何打开文件而不将其保存到磁盘

Java 如何打开文件而不将其保存到磁盘,java,file,io,temp,Java,File,Io,Temp,我的问题:如何在不将文件保存到磁盘的情况下打开文件(在文件的系统默认[外部]程序中) 我的情况:我的资源中有文件,我想显示这些文件而不首先将它们保存到磁盘。例如,我有一个xml文件,我想在用户机器上的默认程序中打开它,以读取xml文件,而不首先将其保存到磁盘 我一直在做什么:到目前为止,我只是将文件保存到一个临时位置,但我无法知道他们何时不再需要该文件,因此我不知道何时/是否删除该文件。以下是我的代码(好吧,它主要是sscce,除了资源…您必须自己创建): 根据应用程序的可移植性,可能没有“一刀

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

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

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


根据应用程序的可移植性,可能没有“一刀切”的解决方案。但是,您可以帮助自己:

至少在Linux下,您可以使用管道(
|
)将一个程序的输出定向到另一个程序的输入。一个简单的例子(使用
gedit
文本编辑器)可能是:

echo "hello world" | gedit
这将(对于gedit)打开一个新的编辑器窗口,并在一个新的未保存文档中显示内容“hello world”


上面的问题是,这可能不是一个独立于平台的解决方案。它将适用于Linux,也可能适用于OSX,但我这里没有安装Windows来测试它

此外,您还需要自己找到默认编辑器。这是一个关于如何工作的想法。

因为这一行:

String tempDir = System.getProperty("java.io.tmpdir") + "\\BONotifier\\";
我推断你正在使用Windows。你知道,你可以很容易地把这段代码做成多平台的

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


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

我不太理解你的问题。我认为你的问题只有两种可能

  • 打开现有文件,您希望对其流进行操作,但不希望保存任何修改

  • 创建一个文件,以便可以使用文件i/o对文件流进行操作,但不希望将流保存到文件

  • 在任何一种情况下,您的主要动机都是利用现有的文件i/o,这是您的判断和编程乐趣,对吗

    我觉得问题并不是那么简单,我的答案可能不是你想要的答案。但是,如果我对这个问题的理解与你的问题一致

    如果您希望使用流io,而不是使用FileOutputStream或FileInputStream,这是打开文件对象的结果,为什么不使用非文件InputStream或OutputStream?您的文件i/o实用程序最终将归结为操作i/o流


    无需涉及临时文件。

    这取决于您试图将文件加载到的程序。它是否在某些端口上有一些API或列表?根据您的操作系统,您甚至可以在程序仍在使用的情况下删除该文件,这样您就可以使用当前的方法,而不必担心用户何时查看完该文件。@WhiskySpider:嗯,使用Desktop类,它会自动确定默认值。如果可能的话,我想要一个多平台的解决方案:)谢谢你的提示+1如果你能为我指出一个好的方向,使这个多平台:)虽然我很欣赏你的答案,而且无论如何可能会投赞成票…那很容易。不要使用“\\”作为目录分隔符,而是使用char/String常量。这个常量会让你的程序自动从Windows中的“\\”更改为Linux中的“/”,而不是在其中一个中进行中继。我编辑了我的问题。希望这能帮助你理解我的要求。
    String tempDir = System.getProperty("java.io.tmpdir") + "\\BONotifier\\";