问题标签 [filechannel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
7765 浏览

java - 多个线程可以看到 Java 中直接映射的 ByteBuffer 上的写入吗?

我正在研究使用从内存映射文件(通过FileChannel.map())以及内存中直接 ByteBuffers构建的 ByteBuffers 的东西。我试图了解并发和内存模型约束。

我已经阅读了 FileChannel、ByteBuffer、MappedByteBuffer 等所有相关的 Javadoc(和源代码)。很明显,特定的 ByteBuffer(和相关的子类)有一堆字段,并且状态不受内存模型的保护观点看法。因此,如果跨线程使用该缓冲区,则在修改特定 ByteBuffer 的状态时必须进行同步。常见的技巧包括使用 ThreadLocal 来包装 ByteBuffer、复制(同步时)以获取指向相同映射字节的新实例等。

鉴于这种情况:

  1. B_all管理器为整个文件有一个映射的字节缓冲区(比如它<2gb)
  2. manager 调用 B_all 上的 duplicate()、position()、limit() 和 slice() 来创建一个新的较小的 ByteBuffer B_1,该文件的块并将其提供给线程 T1
  3. manager 做所有相同的事情来创建一个B_2指向相同映射字节的 ByteBuffer 并将其提供给线程 T2

我的问题是:T1 写 B_1 和 T2 写 B_2 可以同时保证看到对方的变化吗?T3 是否可以使用 B_all 读取这些字节并保证看到 T1 和 T2 的更改?

我知道映射文件中的写入不一定会跨进程看到,除非您使用 force() 指示操作系统将页面写入磁盘。我不在乎那个。对于这个问题,假设这个 JVM 是写单个映射文件的唯一进程。

注意: 我不是在寻找猜测(我自己可以很好地猜测)。我想参考一些关于内存映射直接缓冲区保证(或不保证)的明确内容。或者,如果您有实际经验或负面测试用例,也可以作为充分的证据。

更新:我已经做了一些测试,让多个线程并行写入同一个文件,到目前为止,其他线程似乎可以立即看到这些写入。我不确定我是否可以依赖它。

0 投票
4 回答
10665 浏览

java - 从随机访问文件中读取对象

我使用 Java 的 FileChannel 类编写了一个文件,该类使用 RandomAccessFiles。我在文件的不同位置写了对象。这些对象大小不一,但都属于同一类。我使用以下想法编写了对象:

现在我想从这样的文件中读取。我不想指定要读取的字节数。我希望能够使用对象输入流直接读取对象。如何做到这一点?

必须使用随机访问文件,因为我需要写入文件中的不同位置。我还在一个单独的数据结构中记录了写入对象的位置。

0 投票
1 回答
663 浏览

java - Linux 上的 FileChannel.write 会产生大量垃圾,但在 Mac 上不会

我试图限制我的日志库产生的垃圾量,所以我编写了一个测试来显示 FileChannel.write 创建了多少内存。下面的代码在我的 Mac 上分配零内存,但在我的 Linux 机器(Ubuntu 10.04.1 LTS)上创建了大量垃圾,触发了 GC。FileChannels 应该是快速和轻量级的。有没有在 Linux 上做得更好的 JRE 版本?

我的 JRE 的详细信息如下:


更新为:

它工作得很好。:-|

好吧,现在我们知道 FileChannelImpl 的早期版本存在内存分配问题。

0 投票
2 回答
1285 浏览

java - Java 可能的 FileChannel.map 错误

所以我正在尝试使用映射的 FileChannel 读取一个非常大的文件。

文件超过 2GB。一段代码是:

这会引发错误:

FileChannel.map 将 along作为文件大小。那么这个错误有意义吗?为什么他们不支持比这更大的文件?

0 投票
7 回答
9772 浏览

java - Java NIO:transferFrom 直到流结束

我在玩 NIO 库。我正在尝试侦听端口 8888 上的连接,一旦连接被接受,就将该通道中的所有内容转储到somefile.

我知道如何使用ByteBuffers,但我想让它与据称超级高效的FileChannel.transferFrom.

这就是我得到的:

所以,我的问题是:我如何表达“transferFrom在到达流结束之前的某个频道”


编辑:将 1024 更改为 BUF_SIZE,因为使用的缓冲区大小与问题无关。

0 投票
2 回答
2413 浏览

java - ByteBuffer 和 FileChannel 只读取指定的字节数

我有一种情况,我一直在阅读下面的 ByteBuffer。

但是当读数到达边界时(当要读取的剩余字节小于 BUFFER_SIZE 时)我只需要读取boundaryLimit - FileChannel's current position.

意味着边界限制是 x 并且当前位置是 y,那么我需要从y直到读取字节x而不是超出该字节。

我该如何做到这一点?

我不想创建另一个具有新容量的实例。

0 投票
1 回答
1120 浏览

java - Read specific bytes from RandomAccessFile using FileChannel : Java

I have a RandomAccessFile and its FileChannel. What I'm trying to do is read a specific section of the bytes from said file; however, while looking over the FileChannel read methods, I didn't see overloads that would help with what I'm trying to do, only methods which would read the entire content, or read content to a specific position in the buffer that the read method takes in. Is there a method that I'm missing that will help me accomplish my goal of reading a specific chunk of bytes, or will I need to read in the entire channel into the buffer and then parse out the section somehow?

0 投票
2 回答
9671 浏览

java - 我应该关闭 FileChannel 吗?

我今天在我们的一个实用程序类中遇到了一个问题。它是文件的助手,包含一些静态文件复制例程。以下是提取的相关方法以及测试方法。

问题是有时 setLastModified 调用失败,返回 false。

在我的 PC(Windows 7,最新 Java)上,我有时会收到“setLastModified failed”消息(大约 25 次 / 1000)。

我现在通过删除 FileChannel.close 调用解决了这个问题,但我更愿意理解为什么会发生这种情况,即使这是正确的解决方案。

还有其他人遇到同样的问题吗?

编辑:我已将代码更改为仅关闭Streamss 而不是FileChannels,因为研究表明关闭 sFileChannel也会关闭Stream.

0 投票
1 回答
4422 浏览

java - Java:从打开的 RandomAccessFile 实例中获取文件名

如何从打开的 RandomAccessFile 实例中获取文件名?

我只能找到与文件本身相关的以下方法:

  • getFD(): 返回一个 FileDescriptor 对象
  • getChannel(): 返回一个 FileChannel 对象

我想获取一个 File 类实例,或者直接获取我传递给 RandomAccessFile 的构造函数的文件名字符串:

谢谢!

0 投票
4 回答
8238 浏览

java - 使用 java.nio.MappedByteBuffer 时防止 OutOfMemory

考虑创建 5-6 个线程的应用程序,每个线程在循环中为 5mb 页面大小分配 MappedByteBuffer。

迟早,当应用程序处理大文件时,会抛出 oom

根据规范,MappedBuffer 应该在它本身被 GC 时立即处理直接内存。看起来问题是,MappedBuffer-s GC-ed 太晚了,然后直接内存就完成了。

如何避免这种情况?可能会说 MappedBuffer 隐式处理或使用某种 MappedBuffer 池