问题标签 [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.
java - 多个线程可以看到 Java 中直接映射的 ByteBuffer 上的写入吗?
我正在研究使用从内存映射文件(通过FileChannel.map())以及内存中直接 ByteBuffers构建的 ByteBuffers 的东西。我试图了解并发和内存模型约束。
我已经阅读了 FileChannel、ByteBuffer、MappedByteBuffer 等所有相关的 Javadoc(和源代码)。很明显,特定的 ByteBuffer(和相关的子类)有一堆字段,并且状态不受内存模型的保护观点看法。因此,如果跨线程使用该缓冲区,则在修改特定 ByteBuffer 的状态时必须进行同步。常见的技巧包括使用 ThreadLocal 来包装 ByteBuffer、复制(同步时)以获取指向相同映射字节的新实例等。
鉴于这种情况:
B_all
管理器为整个文件有一个映射的字节缓冲区(比如它<2gb)- manager 调用 B_all 上的 duplicate()、position()、limit() 和 slice() 来创建一个新的较小的 ByteBuffer
B_1
,该文件的块并将其提供给线程 T1 - manager 做所有相同的事情来创建一个
B_2
指向相同映射字节的 ByteBuffer 并将其提供给线程 T2
我的问题是:T1 写 B_1 和 T2 写 B_2 可以同时保证看到对方的变化吗?T3 是否可以使用 B_all 读取这些字节并保证看到 T1 和 T2 的更改?
我知道映射文件中的写入不一定会跨进程看到,除非您使用 force() 指示操作系统将页面写入磁盘。我不在乎那个。对于这个问题,假设这个 JVM 是写单个映射文件的唯一进程。
注意: 我不是在寻找猜测(我自己可以很好地猜测)。我想参考一些关于内存映射直接缓冲区保证(或不保证)的明确内容。或者,如果您有实际经验或负面测试用例,也可以作为充分的证据。
更新:我已经做了一些测试,让多个线程并行写入同一个文件,到目前为止,其他线程似乎可以立即看到这些写入。我不确定我是否可以依赖它。
java - 从随机访问文件中读取对象
我使用 Java 的 FileChannel 类编写了一个文件,该类使用 RandomAccessFiles。我在文件的不同位置写了对象。这些对象大小不一,但都属于同一类。我使用以下想法编写了对象:
现在我想从这样的文件中读取。我不想指定要读取的字节数。我希望能够使用对象输入流直接读取对象。如何做到这一点?
我必须使用随机访问文件,因为我需要写入文件中的不同位置。我还在一个单独的数据结构中记录了写入对象的位置。
java - Linux 上的 FileChannel.write 会产生大量垃圾,但在 Mac 上不会
我试图限制我的日志库产生的垃圾量,所以我编写了一个测试来显示 FileChannel.write 创建了多少内存。下面的代码在我的 Mac 上分配零内存,但在我的 Linux 机器(Ubuntu 10.04.1 LTS)上创建了大量垃圾,触发了 GC。FileChannels 应该是快速和轻量级的。有没有在 Linux 上做得更好的 JRE 版本?
我的 JRE 的详细信息如下:
更新为:
它工作得很好。:-|
好吧,现在我们知道 FileChannelImpl 的早期版本存在内存分配问题。
java - Java 可能的 FileChannel.map 错误
所以我正在尝试使用映射的 FileChannel 读取一个非常大的文件。
文件超过 2GB。一段代码是:
这会引发错误:
FileChannel.map 将 along
作为文件大小。那么这个错误有意义吗?为什么他们不支持比这更大的文件?
java - Java NIO:transferFrom 直到流结束
我在玩 NIO 库。我正在尝试侦听端口 8888 上的连接,一旦连接被接受,就将该通道中的所有内容转储到somefile
.
我知道如何使用ByteBuffers
,但我想让它与据称超级高效的FileChannel.transferFrom
.
这就是我得到的:
所以,我的问题是:我如何表达“transferFrom
在到达流结束之前的某个频道”?
编辑:将 1024 更改为 BUF_SIZE,因为使用的缓冲区大小与问题无关。
java - ByteBuffer 和 FileChannel 只读取指定的字节数
我有一种情况,我一直在阅读下面的 ByteBuffer。
但是当读数到达边界时(当要读取的剩余字节小于 BUFFER_SIZE 时)我只需要读取boundaryLimit - FileChannel's current position
.
意味着边界限制是 x 并且当前位置是 y,那么我需要从y
直到读取字节x
而不是超出该字节。
我该如何做到这一点?
我不想创建另一个具有新容量的实例。
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?
java - 我应该关闭 FileChannel 吗?
我今天在我们的一个实用程序类中遇到了一个问题。它是文件的助手,包含一些静态文件复制例程。以下是提取的相关方法以及测试方法。
问题是有时 setLastModified 调用失败,返回 false。
在我的 PC(Windows 7,最新 Java)上,我有时会收到“setLastModified failed”消息(大约 25 次 / 1000)。
我现在通过删除 FileChannel.close 调用解决了这个问题,但我更愿意理解为什么会发生这种情况,即使这是正确的解决方案。
还有其他人遇到同样的问题吗?
编辑:我已将代码更改为仅关闭Streams
s 而不是FileChannel
s,因为研究表明关闭 sFileChannel
也会关闭Stream
.
java - Java:从打开的 RandomAccessFile 实例中获取文件名
如何从打开的 RandomAccessFile 实例中获取文件名?
我只能找到与文件本身相关的以下方法:
getFD()
: 返回一个 FileDescriptor 对象getChannel()
: 返回一个 FileChannel 对象
我想获取一个 File 类实例,或者直接获取我传递给 RandomAccessFile 的构造函数的文件名字符串:
谢谢!
java - 使用 java.nio.MappedByteBuffer 时防止 OutOfMemory
考虑创建 5-6 个线程的应用程序,每个线程在循环中为 5mb 页面大小分配 MappedByteBuffer。
迟早,当应用程序处理大文件时,会抛出 oom
根据规范,MappedBuffer 应该在它本身被 GC 时立即处理直接内存。看起来问题是,MappedBuffer-s GC-ed 太晚了,然后直接内存就完成了。
如何避免这种情况?可能会说 MappedBuffer 隐式处理或使用某种 MappedBuffer 池