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

Java 启动在RAM内存中创建的文件,java,file-io,ram,fileinputstream,Java,File Io,Ram,Fileinputstream,我被要求启动一个Excel文件,在运行时在RAM内存中创建 例如,使用: Desktop.getDesktop().open(new File("c:\....\fileName.xlsx")); 我可以启动Excel程序,打开文件c:..\fileName.xlsx 由于我的文件是以这种方式在RAM内存中创建的: ... FileSystemManager fsm = VFS.getManager(); FileObject RAM = fsm.resolveFile

我被要求启动一个Excel文件,在运行时在RAM内存中创建

例如,使用:

Desktop.getDesktop().open(new File("c:\....\fileName.xlsx"));
我可以启动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文件无法启动。在本例中,Desktop.open所做的是查找文件的默认处理程序,并以给定文件作为参数启动该处理程序


由于Excel无法快速打开内存中的文件,因此您别无选择,只能将其写入临时文件以打开它。

Excel文件无法启动。在本例中,Desktop.open所做的是查找文件的默认处理程序,并以给定文件作为参数启动该处理程序


由于Excel无法快速打开内存中的文件,您别无选择,只能将其写入临时文件以打开它。

@Kayaman的答案几乎是正确的

因为Excel无法在内存中打开文件

这是绝对正确的,如果我们谈论的是JavaVFSRAM:文件系统

首先,我们需要理解普通文件系统和JavaVFS之间的区别

普通文件系统是操作系统支持的文件系统。应用程序通过使系统调用open、read、write、seek、opendir等跨越用户空间到内核空间边界来访问普通文件系统。内核可以根据文件系统类型以不同的方式处理请求;e、 g.NFT、FAT、挂载SMB共享等。或者在一些操作系统中,请求可以传递到用户空间文件系统;e、 g.一种环回文件系统,其中ISO映像或ZIP文件作为文件系统装入

普通文件系统的关键在于,应用程序可以看到几乎相同的文件系统,并使用标准系统调用访问它们

相反,JavaVFS是一种抽象,其中公共API由Java库而不是操作系统实现。例如,Java读取。。。流的方法调用将映射到对VFS对象的调用。这可以通过系统调用发送到真实的文件系统,也可以发送到JVM中实现的虚拟文件系统。可以使用从Java堆或本机堆分配的内存来表示ram:VFS

Excel应用程序是本机应用程序。本机应用程序可以与普通文件系统进行通信,与Java应用程序的通信方式相同;通过系统调用。但是,由于Excel应用程序没有在保存ram:VFS的JVM的地址空间内运行,因此它无法访问它

但这还不是故事的结局。有几种方法可以让Excel从内存文件中读取

有些操作系统支持内存中的普通文件系统。。。或虚拟内存。例如,典型的Linux系统将使用tmpfs文件系统来保存/tmp目录。因此,在Linux上,您可以安排Java应用程序将文件写入tmpfs文件系统,然后将路径名传递给Excel之类的应用程序。在Windows上,我认为您需要使用第三方RAM磁盘软件;见下页:

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


除非你有钱,否则我不会称之为实际的方法!,但我知道有一个基于Java的平台可以做这种事情;通过自己的NFS、S3和其他协议的Java实现向客户端公开其存储库。

@Kayaman的答案几乎是正确的

因为Excel无法在内存中打开文件

这是绝对正确的,如果我们谈论的是JavaVFSRAM:文件系统

首先,我们需要理解普通文件系统和JavaVFS之间的区别

普通文件系统是操作系统支持的文件系统。应用程序通过使系统调用open、read、write、seek、opendir等跨越用户空间到内核空间边界来访问普通文件系统。内核可以根据文件系统类型以不同的方式处理请求;e、 g.NFT、FAT、挂载SMB共享等。或者在某些操作系统中,请求可能是b e传递给用户空间文件系统;e、 g.一种环回文件系统,其中ISO映像或ZIP文件作为文件系统装入

普通文件系统的关键在于,应用程序可以看到几乎相同的文件系统,并使用标准系统调用访问它们

相反,JavaVFS是一种抽象,其中公共API由Java库而不是操作系统实现。例如,Java读取。。。流的方法调用将映射到对VFS对象的调用。这可以通过系统调用发送到真实的文件系统,也可以发送到JVM中实现的虚拟文件系统。可以使用从Java堆或本机堆分配的内存来表示ram:VFS

Excel应用程序是本机应用程序。本机应用程序可以与普通文件系统进行通信,与Java应用程序的通信方式相同;通过系统调用。但是,由于Excel应用程序没有在保存ram:VFS的JVM的地址空间内运行,因此它无法访问它

但这还不是故事的结局。有几种方法可以让Excel从内存文件中读取

有些操作系统支持内存中的普通文件系统。。。或虚拟内存。例如,典型的Linux系统将使用tmpfs文件系统来保存/tmp目录。因此,在Linux上,您可以安排Java应用程序将文件写入tmpfs文件系统,然后将路径名传递给Excel之类的应用程序。在Windows上,我认为您需要使用第三方RAM磁盘软件;见下页:

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


除非你有钱,否则我不会称之为实际的方法!,但我知道有一个基于Java的平台可以做这种事情;通过自己的NFS、S3和其他协议的Java实现向客户端公开其存储库。

谢谢,非常有趣的一课:我想到了ram驱动器,但我认为它不再是一种非常有效的机制:对Windows没有任何评论:-。在Linux等平台上,tmpfs与操作系统集成,这是一个有效的解决方案。谢谢,非常有趣的一课:我想到了ram驱动器,但我认为它不再是一个非常有效的机制:对Windows没有评论:-。它是Linux等平台上的有效解决方案,其中tmpfs与操作系统集成。