启动在 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" 暴露给客户端。
我被要求启动一个 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 的回答是正确的(差不多)。
如果我们谈论的是 Java VFS "ram:" 文件系统,Since Excel can't open "in-memory files" (AFAIK) ...
绝对正确。
首先我们需要了解普通文件系统和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" 暴露给客户端。