Tag: nio

读取NIO SocketChannel的超时时间?

如果在建立连接后的一段时间内没有收到数据,那么设置超时以关闭NIO SocketChannel的最佳方法是什么?

Java MemoryMapping大文件

MappedByteBuffer对2GIG的Java限制使得用于映射大文件变得棘手。 通常推荐的方法是使用MappedByteBuffer数组并通过以下方式对其进行索引: long PAGE_SIZE = Integer.MAX_VALUE; MappedByteBuffer[] buffers; private int getPage(long offset) { return (int) (offset / PAGE_SIZE) } private int getIndex(long offset) { return (int) (offset % PAGE_SIZE); } public byte get(long offset) { return buffers[getPage(offset)].get(getIndex(offset)); } 这可能适用于单个字节,但如果要处理更大且需要跨越边界的读/写(getLong()或get(byte [])),则需要重写大量代码。 问题是:对于这些场景,你最好的做法是什么,你知道任何可以重复使用的工作解决方案/代码而不重新发明轮子吗?

为什么JDK NIO使用这么多的anon_inode文件描述符?

我正在使用Sun的JDK 1.6.0_26和NIO(使用Netty),在lsof中我看到数百个文件描述符是anon_inode : $ lsof -np 11225 | fgrep -w anon_inode java 11225 nobody 57u 0000 0,9 0 1386 anon_inode java 11225 nobody 61u 0000 0,9 0 1386 anon_inode java 11225 nobody 65u 0000 0,9 0 1386 anon_inode java 11225 nobody 69u 0000 0,9 0 1386 anon_inode java 11225 nobody 73u 0000 0,9 0 1386 […]

查看Java可用的直接缓冲区内存量是多少?

如何查看Java当前分配(并可能分配)多少直接内存 ? 作为http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4879883的评估者提及,Java将这些缓冲区维护在普通Java堆之外。

Java Solaris NIO OP_CONNECT问题

我有一个Java客户端使用Java NIO使用TCP套接字连接到C ++服务器。 这适用于Linux,AIX和HP / UX,但在Solaris下, OP_CONNECT事件永远不会触发。 更多详情: Selector.select()返回0,’selected key set’为空。 该问题仅在连接到本地计算机时(通过环回或以太网接口)发生,但在连接到远程计算机时有效。 我已经在两台不同的Solaris 10机器上确认了这个问题; 使用JDK版本1.6.0_21和_26的物理SPARC和虚拟x64(VMWare)。 以下是一些演示此问题的测试代码: import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class NioTest3 { public static void main(String[] args) { int i, tcount = 1, open = 0; String[] addr = […]

Java:使用NIO和System.in

是否可以将NIO与System.in一起使用? 我想以某种方式将’stdin’视为可选择的频道。 有没有人找到办法做到这一点?

在Java NIO中使用Google Protocol Buffers?

我正在玩java.nio ,我很久没有使用过了。 我使用Google Protocol Buffers进行序列化以及与系统的其他部分进行通信。 现在我无法弄清楚是否/如何使用java.nio类来使用protobuffers。 我无法想象谷歌只使用“每个连接一个线程”与网络协议缓冲区。 谁能给我一个关于如何整合这两者的指针? 提前致谢! 马丁

何时以及如何释放NIO直接缓冲区?

我有一个C库,需要一个临时缓冲区用于临时空间。 我正在考虑将直接字节缓冲区的地址传递给它。 是否允许VM在最终释放缓冲区之前重新定位缓冲区? 在JNI帧消失后,本机库将保持指针。 我的理解是无法缓存JNI本地对象引用,因为VM可能在GC期间重定位它们。 这适用于缓冲区地址吗? 据我所知,如果我在Java中分配缓冲区然后让缓冲区对象超出范围,VM将释放缓冲区内存。 如果我使用NewDirectByteBuffer在本机代码中创建一个新的缓冲区,它的职责是释放后备内存? 如果我使用NewDirectByteBuffer在本机代码中创建一个新缓冲区并且直接缓冲区已经使用了一个地址,会发生什么? 记忆会被双重释放吗? VM引用是否会计算内存块,并在引用它的最后一个缓冲区被垃圾收集时尝试释放它?

如何在SocketChannel关闭时收到通知?

我想在SocketChannel调用close方法时收到通知。 我的第一个想法是创建一个包装器,它在调用implCloseSelectableChannel方法时通知监听器(因为close方法本身在AbstractInterruptibleChannel声明为final )。 这个解决方案有效,但是当我尝试用Selector注册它时,由于Selector中的以下检查,我会得到一个IllegalSelectorException : /* */ protected final SelectionKey register(AbstractSelectableChannel paramAbstractSelectableChannel, int paramInt, Object paramObject) /* */ { /* 128 */ if (!(paramAbstractSelectableChannel instanceof SelChImpl)) /* 129 */ throw new IllegalSelectorException(); 现在我无法覆盖register方法来委托包装的SocketChannel因为它在AbstractSelectableChannel声明为final ,我无法实现SelChImpl因为它在sun.nio.ch包中具有默认可见性。 我可以看到从这里开始的唯一方法是制作我自己的SelectorProvider和Selector ,但这似乎有点过于简单。 是否有更简单的方法在SocketChannel关闭时收到通知或我是否需要重新考虑我的程序设计? SocketChannelWrapper示例: import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketOption; import java.net.UnknownHostException; import java.nio.ByteBuffer; import […]

如何实现对Java中映射到内存的文件的并发读取?

我有许multithreading同时读取相同的文件(完全约100M),只有一个线程来更新文件。 我想将文件映射到内存中以减少文件I / O. 如何在Java中完成? 我基本上考虑了以下两种方法: 用字节数组来存储文件,每次创建ByteArrayInputStream以在multithreading读取时读取缓冲区。 使用NIO获取一个文件通道,同步通道以从MappedByteBuffer读取以进行multithreading读取。 我不确定这些方法是否有效。 如果有更好的解决方案,请帮助提供一些提示。