Tag: nio

分配零容量ByteBuffer

任何人都可以告诉我分配零长度缓冲区的可能目的是什么? ByteBuffer.allocate(0); // no IllegalArgumentException 为什么设计API的人这样做了? 感谢您的评论和解答。 我希望会有这样的更新。 🙂 public abstract class ByteBuffer extends Buffer implements Comparable { public static final ByteBuffer VOID = allocate(0); }

仅通过一个SocketChannel发送多条消息

阅读本教程后: http ://rox-xmlrpc.sourceforge.net/niotut/(它是关于编写非阻塞服务器和客户端,我读NIO部分,滑雪SSL部分),现在我正在尝试重写我自己的客户端,但在尝试编辑客户端代码时我遇到了问题。 首先,我想让你看到教程的客户端代码,它包含2个文件: RspHandler.java:http://rox-xmlrpc.sourceforge.net/niotut/src/RspHandler.java NIOClient.java:http://rox-xmlrpc.sourceforge.net/niotut/src/NioClient.java 但我在main函数中编辑了一下NIOClient.java,以解释我的问题如下: import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.nio.channels.spi.SelectorProvider; import java.util.*; public class NIOClient implements Runnable { // The host:port combination to connect to private InetAddress hostAddress; private int port; // The selector we’ll be monitoring private Selector selector; […]

有没有人玩过NIO管道来过滤/拦截System.out?

正如这里建议的那样,我想在选择器循环中做到这一点。 我真正想要的是在我的选择器循环中读取写入系统的内容。 编辑1:我编写了一个完整的解决方案,只是为了找出你不能使用System.setOut重定向GC日志。 它只是直接到FD或其他东西。 显示塞子! 除非我重定向到文件并将此文件传输到我的选择器。 很多工作! 看到这里 。

读取用户文件系统返回AccessDeniedException

我有这个方法应该返回一个OberservableList,用于JavaFX ListView,包含currentUserPath中的文件名System.getProperty(“user.home”)默认情况下初始化为System.getProperty(“user.home”) )。 public ObservableList getUserItems(){ ObservableList fileList = FXCollections.observableArrayList(); try { Files.walk(Paths.get(currentUserPath)).forEach(filePath -> { if (Files.isRegularFile(filePath)) { fileList.add(filePath.getFileName().toString()); } }); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return fileList; } 不幸的是,我在调用此方法时遇到了AccessDeniedException 。 这是堆栈跟踪: Exception in thread “JavaFX Application Thread” java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) […]

Java NIO通过ByteBuffer扫描某些字节和带有节的字

好吧,所以我正在尝试做一些看起来应该相当简单的事情,但是对于这些新的NIO接口,事情让我感到困惑! 这是我正在尝试做的事情,我需要扫描一个文件作为字节,直到遇到某些字节! 当我遇到这些特定字节时,需要抓住该段数据并对其执行某些操作,然后再继续执行此操作。 我本以为在ByteBuffer中有了所有这些标记,位置和限制,我能够做到这一点,但我似乎无法让它工作! 这是我到目前为止所拥有的…… test.text: this is a line of text a this is line 2b line 3 line 4 line etc.etc.etc. Test.java: import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class Test { public static final Charset ENCODING = Charset.forName(“UTF-8”); public static final byte[] NEWLINE_BYTE = […]

SSLEngine unwrap()javax.crypto.BadPaddingException:坏记录MAC

这让我疯狂了好几天了。 我使用带有ssl加密的java nio创建了一个使用SSLEngine的客户端。 握手工作正常,我写了一个网站的GET请求,它工作正常(我得到200代码的标题)。 问题是当网站发回数据包时,在第二个数据包上我得到一个BadPaddingException。 这是我的阅读方法: public void read(SelectionKey key,ByteBuffer readBuffer) throws IOException, BadPaddingException { SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer clientSSLData = ByteBuffer.allocate(getPacketBufferSize()); System.out.println(“Reading data. PacketBufferSize: “+(getPacketBufferSize())); int length = socketChannel.read(clientSSLData); System.out.println(“read “+length+” bytes”); if (length == -1){ System.out.println(“Length is -1 which means nothing was read from the channel “); socketChannel.close(); return; } clientSSLData.flip(); […]

DatagramChannel.close()在Windows上保持端口打开

我正在实施一个Discover流程: 打开UDP套接字以侦听给定端口上的广播响应 发送一些请求(并期待以后的响应) 在给定的时间段后关闭UDP套接字 第一个电话有效。 但是其他调用会出现绑定错误。 已经在使用的地址:bind 我正在运行Windows 7.我做了一些测试,发现在channel.close()之后; Netstat仍然给出: netstat -a -b -sp udp | grep 55224 UDP 0.0.0.0:55224 : 所以udp端口仍然在操作系统级别打开 我搜索了网络,它可能是os级别的泄漏: 一些java数据报套接字问题 我使用NIO通道运行了2次测试,没有使用1次(来自网络上的测试)。 我使用NIO版本重现了我的错误,但如果我不使用NIO,它会有效。 我有人可以指出我如何使它适用于NIO。 目标平台是Android,我不想总是听广播但只是重复一段时间。 测试sockets public void testConnectCloseWithSocket() { long tCumulative = 0; int errAt = -1; System.out.println(“start…”); for (int i = 0; i < 4000; i++) { try { errAt […]

ZipFileSystemProvider无法识别JIMFS

我有一个从字节数组在jimfs (内存文件系统中的google)中创建的zip文件。 尝试使用ZipMemoryFileSystem打开该文件时,出现无法识别提供程序的错误。 我的代码如下: public static void test(byte[] document) { try { try (FileSystem memoryFileSystem = Jimfs.newFileSystem(Configuration.unix())) { Files.write(memoryFileSystem.getPath(“/file.zip”), document); URI uri = URI.create(“jar:” + memoryFileSystem.getPath(“/file.zip”).toUri()); Map env = Collections.singletonMap(“create”, “false”); try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) { //do something } catch (Exception e) { e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } […]

Java:异步数据库写入的TaskExecutor?

我正在考虑使用Java的TaskExecutor来启动异步数据库写入。 可以理解的是,线程并不是免费的,但假设我使用的固定线程池大小为5-10,这怎么是一个坏主意? 我们的应用程序使用缓冲区从一个非常大的文件读取,并在执行一些数据操作后将此信息刷新到数据库。 在这里使用异步写入似乎是理想的,这样我们就可以继续处理该文件了。 我错过了什么? 为什么每个应用程序都不使用异步写入?

当文件在网络上时,java FileChannnel.transferTo()是否能够巧妙地工作?

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html 说 字节可以从文件传输到某个其他通道,反之亦然,其方式可以由许多操作系统优化为直接到文件系统高速缓存或从文件系统高速缓存快速传输。 如果两个文件都在计算机本地,我可以理解这是如何工作的。 但是,如果文件在同一网络驱动器上同样适用或不适用? 我的意思是,文件2中的字节必须首先传输到本地计算机,以便写入第二个文件,在慢速网络连接上,这似乎超过了绕过Java堆的任何优点。 或者操作系统可以说’将x个字节从文件1传输到文件2,因为它们位于同一个驱动器上,实际的字节不必通过网络传输,只需要进行传输的指令’