【问题标题】:write file in memory with java.nio?用 java.nio 在内存中写入文件?
【发布时间】:2012-03-22 17:32:40
【问题描述】:

使用 nio 可以映射内存中的现有文件。但是是否可以只在内存中创建它而不在硬盘驱动器上创建文件?

我想模仿 CreateFileMapping windows 函数,它允许你在内存中写入。

Java 中是否有等效的系统?

目标是写入内存以便另一个程序 ( c ) 读取它。

【问题讨论】:

  • 为什么不直接创建一个字节缓冲区并写入呢?
  • 您可以告诉 Windows 创建页面文件的内存映射而不是命名文件。这就是你要找的吗?
  • 你说的是进程间通信吗?
  • 确实,目标是写入内存以便另一个程序 ( c ) 读取它。

标签: java java-native-interface shared-memory memory-mapped-files


【解决方案1】:

请看以下内容。创建了一个文件,但这可能与您将获得的一样接近。

MappedByteBuffer
MappedByteBuffer.load()
FileChannel
FileChannel.map()

这是一个帮助您入门的 sn-p。

    filePipe = new File(tempDirectory, namedPipe.getName() + ".pipe");
    try {
        int pipeSize = 4096;
        randomAccessFile = new RandomAccessFile(filePipe, "rw");
        fileChannel = randomAccessFile.getChannel();
        mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, pipeSize);
        mappedByteBuffer.load();
    } catch (Exception e) {
    ...

【讨论】:

  • 这项工作,事实上,一切都在 RAM 中(我用一些实用程序检查,没有 hdd i/o)但是,你知道如何用 c 代码检索映射文件吗?使用窗口函数?
  • @Foobyto - 不,我没有。值得添加一个新问题来得到答案。
  • 其实经过研究,不能用java在RAM中写,需要通过系统api来实现。比如这个东西:msdn.microsoft.com/en-us/library/windows/desktop/aa366537Java只是让你把一个文件放到RAM中以便更快地修改它,仅此而已。
【解决方案2】:

根据定义,磁盘上存在一个文件。你的问题体现了一个矛盾的术语。

【讨论】:

    【解决方案3】:

    Java 中的大多数库都处理 inputoutput streams 而不是 java.io.File 对象。
    示例:image readingXMLaudiozip

    在处理 I/O 时,尽可能使用流。

    但是,如果您需要随机访问数据,这可能不是您想要的。

    当使用内存映射文件时,您使用FileChannel.map()FileChannel 获得MappedByteBuffer,如果您不需要文件,只需使用ByteBuffer,它完全存在于内存中。使用ByteBuffer.allocate()ByteBuffer.allocateDirect() 创建其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多