Tag: nio

为什么Java中的FileChannel不是非阻塞的?

我想编写一个同时写入多个文件的程序; 认为通过使用非阻塞模式可以使用一个线程。 但FileChannel不支持非阻塞模式。 有人知道为什么吗?

FileChannel.transferTo用于Windows中的大文件

使用Java NIO使用可以更快地复制文件。 我发现两种方法主要是通过互联网来完成这项工作。 public static void copyFile(File sourceFile, File destinationFile) throws IOException { if (!destinationFile.exists()) { destinationFile.createNewFile(); } FileChannel source = null; FileChannel destination = null; try { source = new FileInputStream(sourceFile).getChannel(); destination = new FileOutputStream(destinationFile).getChannel(); destination.transferFrom(source, 0, source.size()); } finally { if (source != null) { source.close(); } if (destination != null) { destination.close(); […]

SSL和SocketChannel

理想情况下,我只需要一个简单的SSLSocketChannel 。 我已经有一个组件可以在普通的SocketChannel上读取和写入消息,但是对于其中一些连接,我必须通过线路使用SSL; 但是,这些连接上的操作是相同的。 有谁知道免费的SSLSocketChannel实现(使用适当的选择器)或类似的东西? 我发现了这个 ,但选择器不接受它,因为它的供应商不是SUN。 我正在通过一个简单的对象将read_from / writing_to网络逻辑从网络数据的插入和检索中解耦,以便使用SSLEngine而不会生气,但考虑到我不这样做,实现它是非常棘手的。知道SSL协议的内部……

如何选择java nio vs io?

正如我们所知,如果我们想使用传统的IO构建服务器,它必须阻塞某个地方,所以我们不得不使用循环或一个线程一个套接字模式,所以nio似乎是更好的选择。 所以我想知道nio永远是更好的选择吗?

Java ByteBuffer性能问题

在处理多个千兆字节的文件时,我注意到一些奇怪的事情:似乎从使用文件通道的文件读取到使用allocateDirect分配的重用ByteBuffer对象比从MappedByteBuffer读取要慢得多,实际上它比读取字节更慢使用常规读取调用的数组! 我希望它(几乎)与从mappedbytebuffers读取一样快,因为我的ByteBuffer分配了allocateDirect,因此读取应该直接在我的bytebuffer中结束,没有任何中间副本。 我现在的问题是:我做错了什么? 或者bytebuffer + filechannel是否比常规io / mmap慢? 我下面的示例代码我还添加了一些代码,将读取的内容转换为long值,因为这是我的真实代码不断执行的操作。 我希望ByteBuffer getLong()方法比我自己的字节shuffeler快得多。 测试结果:mmap:3.828 bytebuffer:55.097常规i / o:38.175 import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode; import java.nio.MappedByteBuffer; class testbb { static final int size = 536870904, n = size / 24; static public long byteArrayToLong(byte [] in, int offset) { return ((((((((long)(in[offset + […]

Jetty和其他容器如何在坚持Servlet规范的同时利用NIO?

我是NIO的新手,我正在试图弄清Jetty如何利用NIO。 我对使用阻塞IO服务请求的传统servlet容器的理解如下: 请求到达 分配一个线程来处理请求,并调用servlet方法( doGet等) Servlet方法是一个InputStream和OutputStream servlet方法从InputStream读取并写入OutputStream InputStream和OutputStream基本上与底层Socket的各个流相关联 使用NIO连接器时有何不同? 我的猜测大致如下: 请求到达 Jetty使用NIO连接器并异步缓冲整个请求 一旦读取了请求,就完全将缓冲区包装在InputStream 创建一个空的响应缓冲区(包装在OutputStream ) 分配一个线程并调用处理上述包装器流的servlet方法( doGet等) Servlet方法写入包装(缓冲)响应流并从servlet方法返回 Jetty使用NIO将响应缓冲区内容写入底层SocketChannel 从Jetty文档中,我发现了以下内容: SelectChannelConnector – 此连接器使用具有非阻塞线程模型的高效NIO缓冲区。 Jetty使用Direct NIO缓冲区,并仅将线程分配给具有请求的连接。 同步模拟对servlet API的阻塞,并且在请求处理结束时任何未刷新的内容都是异步写入的。 我不确定我理解Synchronization simulates blocking for the servlet API意味着什么?

Java N / IO中的行分隔符?

使用java.nio.file写入txt文件时如何插入新行? 下面的代码生成一个带有一行ABCDEF的txt文件,而不是两行单独的ABC和DEF : public static void main(String args[]) throws IOException { final Path PATH = Paths.get(“test.txt”); String test = “ABC\nDEF”; Files.write(PATH, test.getBytes()); }

Netty IllegalReferenceCountException

这是我在这里的回答。 虽然我的业务逻辑没有问题,但事实certificate我没有使用Netty ByteBuf 。 一旦我更新了我的测试代码以使用ByteBuf ,我遇到了一个无限循环的IllegalReferenceCountException 。 我承认自己是Netty的新手,但这并不能certificate回到手动资源分配和发布的时代。 创建GC是为了避免这种混乱。 迪斯科,有人吗? 那么Bell Bottoms怎么样? public class StringDecoder extends AbstractDecoder { private static final IntPredicate NEWLINE_DELIMITER = b -> b == ‘\n’ || b == ‘\r’; @Override public Flux decode(Publisher publisher, ResolvableType elementType, MimeType mimeType, Map hints) { return Flux.from(publisher) .scan(Tuples.<Flux, Optional>of(Flux.empty(), Optional.empty()), (acc, buffer) -> { List […]

将键添加到选定的键集

我正在编写一个NIO服务器,并希望响应用户请求,即将一些数据写入通道。 Selector selector; //… if(selector.selectNow() != 0){ if(key.isReadable()){ SocketChannel channel = key.channel(); //read some data //respond key.interestOps(SelectionKey.OP_WRITE) //How to add the key to a selected set? } } 在阅读了一些我想回复的数据之后。 这意味着我需要将OP_WRITE添加到密钥,然后将密钥添加到Selected-keys set ,然后在密钥出现在选定集中时将一些内容写入通道。 如何明确地将键添加到选定的集合?

用SocketChannel.open()。socket()替换新的Socket()有什么问题吗?

如果我只是替换,会出现什么问题 socket = new Socket() 同 socket = SocketChannel.open().socket()? 背景:我有一些使用new Socket()遗留代码,我希望能够中断socket.connect()调用。 我不想重写代码来使用NIO。 我了解到Thread.interrupt()不会中断socket.connect() ,但另一个线程上的socket.close()应该中断连接。 奇怪的是,这适用于Java 7但不适用于Java 6。 我莫名其妙地使用socket = SocketChannel().open().socket()会让我使用Thread.interrupt()来中断socket.connect() 。 它没有,但奇怪的是,它确实使Java 6中的socket.close()中断socket.connect() ! 请注意,我不是以任何方式直接使用附加的SocketChannel它出现在我创建Socket再也没有。 这会出什么问题?