启动在 RAM 内存中创建的文件

Launch a file created in RAM memory

我被要求启动一个 Excel 文件,该文件是在运行时在 RAM 内存.

中创建的

例如:

Desktop.getDesktop().open(new File("c:\....\fileName.xlsx"));

我可以"launch" Excel 打开文件的程序 "c:....\fileName.xlsx".

由于我的文件是在 RAM 内存 中创建的,因此:

 ...

     FileSystemManager fsm = VFS.getManager();
     FileObject RAM = fsm.resolveFile("ram://ramFileName.xlsx");
     OutputStream os = RAM.getContent().getOutputStream();
     FileInputStream sorgente = new FileInputStream("C:\originalFile.xlsx");   
     int singloByte;

     while ((singloByte = sorgente.read()) != -1) {
        os.write(singloByte);
     }
     sorgente.close();
     os.close();
     ...

有没有办法打开仅在 RAM 内存不在文件系统 中创建的文件?

谢谢

Excel 个文件不能 "launched"。 Desktop.open() 所做的是找到文件的默认处理程序(在这种情况下大概是 Excel),并使用给定的文件作为参数启动处理程序。

由于Excel打不开"in-memory files"(据我所知),你别无选择,只能将其写入临时文件才能打开。

@Kayaman 的回答是正确的(差不多)。

Since Excel can't open "in-memory files" (AFAIK) ...

如果我们谈论的是 Java VFS "ram:" 文件系统,

绝对正确。

首先我们需要了解普通文件系统和Java VFS 之间的区别。

普通文件系统是操作系统支持的文件系统。应用程序通过跨用户-space 到 kernel-space 边界。内核可能会根据文件系统类型以不同方式处理请求;例如NFTS、FAT、已安装的 SMB 共享等。或者在某些操作系统中,请求可能会被传递到 user-space 文件系统;例如一个环回文件系统,其中一个 ISO 映像或一个 ZIP 文件被挂载为一个文件系统。

普通文件系统的关键是应用程序看到它们(几乎)相同,并使用标准系统调用访问它们。

相比之下,Java VFS 是一种抽象,其中常见的 API 由 Java 库而不是操作系统实现。例如,流的 Java read(...) 方法调用将映射到对 VFS 对象的调用。这可以分派到真实文件系统(通过系统调用),或分派到在 JVM 中实现的虚拟文件系统。 "ram:" VFS 可以使用从 Java 堆或本机堆分配的内存来表示。

Excel 应用程序是本机应用程序。本机应用程序可以与普通文件系统通信,就像 Java 应用程序一样;通过系统调用。但是由于 Excel 应用程序不在保存您的 "ram:" VFS 的 JVM 地址 space 中 运行,因此它无法访问它。


但这还没有结束。您可以通过多种方式Excel读取内存文件。

一些操作系统支持 "normal" 位于 RAM ... 或虚拟内存中的文件系统。例如,典型的 Linux 系统将使用 "tmpfs" 文件系统来保存“/tmp”目录。因此,在 Linux 上,您可以安排 Java 应用程序将文件写入 "tmpfs" 文件系统,然后将路径名传递给 Excel 等应用程序。在Windows,我认为你需要使用3rd-party RAM磁盘软件;见下页:

第二种方法比较复杂。我在上面提到过,SMB 网络共享是作为 "normal" 文件系统访问的。 SMB 实际上是一种网络协议,允许客户端(您的本地操作系统)访问 SMB 文件服务器上的文件。现在至少理论上 Java 应用程序可以实现 SMB 协议的服务器端,并使用其堆来存储它为客户端提供的 "files"。所以......假设......你可以启动你的SMB-server-in-a-Java-application,然后让操作系统将它安装为网络共享。然后您的 Excel 应用程序可以通过共享从 Java 应用程序的内存中读取和写入文件。

我不认为这是一种实用的方法(除非你有雄厚的财力!),但我知道一个基于 Java 的平台 可以做到这一点之类的事情;通过自己的 Java NFS、S3 和其他协议的实现将其 "repository" 暴露给客户端。