Tag: nio

在创建资源路径时从ZipFileSystemProvider获取FileSystemNotFoundException

我有一个Maven项目,在一个方法中我想为我的资源文件夹中的目录创建一个路径。 这样做是这样的: try { final URI uri = getClass().getResource(“/my-folder”).toURI(); Path myFolderPath = Paths.get(uri); } catch (final URISyntaxException e) { … } 生成的URI看起来像jar:file:/C:/path/to/my/project.jar!/my-folder 。 堆栈跟踪如下: Exception in thread “pool-4-thread-1” java.nio.file.FileSystemNotFoundException at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171) at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157) at java.nio.file.Paths.get(Paths.java:143) URI似乎有效。 之前的部分! 指向生成的jar文件及其后面的部分到归档根目录中的my-folder 。 我之前使用过这些说明来创建资源的路径。 为什么我现在得到例外?

Java大文件磁盘IO性能

我的硬盘上有两个(每个2GB)文件,想要将它们相互比较: 使用Windows资源管理器复制原始文件大约需要。 2-4分钟(即读写 – 在同一物理和逻辑磁盘上)。 使用java.io.FileInputStream读取两次并在每个字节的字节上比较字节数组需要20多分钟。 java.io.BufferedInputStream缓冲区为64kb,文件以块的forms读取然后进行比较。 比较完成是一个紧凑的循环之类 int numRead = Math.min(numRead[0], numRead[1]); for (int k = 0; k < numRead; k++) { if (buffer[1][k] != buffer[0][k]) { return buffer[0][k] – buffer[1][k]; } } 我该怎么做才能加快速度呢? NIO应该比普通的流更快吗? Java无法使用DMA / SATA技术,而是执行一些缓慢的OS-API调用吗? 编辑: 谢谢你的回答。 我做了一些基于它们的实验。 正如安德烈亚斯所示 流或nio方法没有太大差别。 更重要的是正确的缓冲区大小。 我的实validation实了这一点。 由于文件是以大块读取的,所以即使是额外的缓冲区( BufferedInputStream )也不会提供任何内容。 优化比较是可能的,并且我通过32次展开获得了最佳结果,但与磁盘读取相比,花费的时间比较小,因此加速很小。 看起来我无能为力;-(

Java高负载NIO TCP服务器

作为我研究的一部分,我正在用Java编写一个高负载的TCP / IP echo服务器。 我想为大约3-4k的客户端提供服务,并且每秒可以看到我可以挤出的最大可能消息。 消息大小非常小 – 最多100个字节。 这项工作没有任何实际意义 – 只是一项研究。 根据我见过的众多演讲(HornetQ基准测试,LMAX Disruptor会谈等),真实世界的高负载系统往往每秒服务数百万次交易(我相信Disruptor提到大约6密尔和大黄蜂 – 8.5)。 例如, 这篇文章指出可以达到高达40M MPS。 所以我把它作为现代硬件应该具备的粗略估计。 我编写了最简单的单线程NIO服务器并启动了负载测试。 我很惊讶我在本地主机上只能获得大约10万MPS,在实际网络上只能获得25k MPS。 数字看起来很小。 我正在测试Win7 x64,核心i7。 查看CPU负载 – 只有一个核心正忙(在单线程应用程序上预期),而其余核心处于空闲状态。 然而,即使我加载了所有8个核心(包括虚拟),我的MPS也不会超过800k – 甚至不到接近4千万:) 我的问题是:向客户提供大量消息的典型模式是什么? 我应该在单个JVM内的几个不同套接字上分配网络负载,并使用某种负载均衡器(如HAProxy)将负载分配到多个内核吗? 或者我应该考虑在我的NIO代码中使用多个选择器? 或者甚至可能在多个JVM之间分配负载并使用Chronicle在它们之间建立进程间通信? 在像CentOS这样适当的服务器端操作系统上进行测试会产生很大的不同(可能是Windows会降低速度)吗? 下面是我的服务器的示例代码。 对于任何传入的数据,它总是以“ok”回答。 我知道在现实世界中,我需要跟踪消息的大小,并准备好一条消息可能在多次读取之间分配,但是我现在想让事情变得非常简单。 public class EchoServer { private static final int BUFFER_SIZE = 1024; private final static int DEFAULT_PORT […]

与Java中的传统IO相比,NIO性能改进

我看过许多文章/博客说与传统的Java IO相比,Java NIO是一个更好的解决方案。 但今天我的一位同事向我展示了这个博客http://mailinator.blogspot.com/2008/02/kill-myth-please-nio-is-not-faster-than.html 。 我想知道Java社区中是否有人做过与Java NIO性能相关的这种基准测试。

在许多客户端连接的情况下,Netty线程模型如何工作?

我打算在即将开展的项目中使用Netty。 该项目将充当客户端和服务器。 特别是它将建立和维护与各种服务器的许多连接,同时为其自己的客户提供服务。 现在, NioServerSocketChannelFactory的文档公平地指定了服务器端的线程模型 – 每个绑定的侦听端口在整个过程中都需要专用的boss线程,而连接的客户端将在工作线程上以非阻塞的方式处理。 具体来说,一个工作线程将能够处理多个连接的客户端。 但是, NioClientSocketChannelFactory的文档不太具体。 这似乎也利用了boss和worker线程。 但是,文档说明: 一个NioClientSocketChannelFactory有一个boss线程。 它根据请求进行连接尝试。 一旦连接尝试成功,boss线程就将连接的Channel传递给NioClientSocketChannelFactory管理的其中一个工作线程。 工作线程似乎也以与服务器案例相同的方式运行。 我的问题是,这是否意味着从我的程序到外部服务器的每个连接都会有一个专用的boss线程? 如果我建立数百个或数千个此类连接,这将如何扩展? 作为旁注。 重新使用单个Executor(缓存线程池)作为ChannelFactory的bossExecutor和workerExecutor是否有任何不良副作用? 那么在不同的客户端和/或服务器ChannelFactory实例之间重新使用呢? 这里有一些讨论 ,但我没有找到足够具体的答案。 任何人都可以详细说明这个吗?

文件之间的区别#删除(路径)和文件#delete()

我正在使用Windows 7与java 7更新6,并发现这个奇怪的(至少对我来说)行为 – 我有两个文件E:\delete1.txt和E:\delete2.txt都是只读文件,当我尝试删除文件时,如果它被删除没有任何问题 – File file = new File(“E:\\delete1.txt”); assertTrue(file.delete()); 但是当我使用nio API删除文件时如下 – Path path = Paths.get(“E:\\delete2.txt”); Files.delete(path); 它抛出java.nio.file.AccessDeniedException 。 为什么使用旧的和新的nio API进行相同操作的不同行为?

Java:使用nio Files.copy移动目录

我是nio类的新手,无法将文件目录移动到新创建的目录中。 我先创建2个目录: File sourceDir = new File(sourceDirStr); //this directory already exists File destDir = new File(destDirectoryStr); //this is a new directory 然后我尝试将现有文件复制到新目录中,使用: Path destPath = destDir.toPath(); for (int i = 0; i < sourceSize; i++) { Path sourcePath = sourceDir.listFiles()[i].toPath(); Files.copy(sourcePath, destPath.resolve(sourcePath.getFileName())); } 这会引发以下错误: Exception in thread “main” java.nio.file.FileSystemException: destDir/Experiment.log: Not a directory 我知道destDir/Experiment.log不是现有目录; 它应该是Files.copy操作的结果的新文件。 […]

java.net与java.nio

在什么时候从java.net切换到java.nio更好? .net(不是Microsoft实体)更容易理解和更熟悉,而nio是可扩展的,并带有一些额外的漂亮function。 具体来说,我需要为这种情况做出选择:我们有一个控制中心在几个远程站点管理硬件(每个站点有一台计算机管理多个硬件单元(收发器,TNC和旋转器))。 我的想法是在每台机器上编写一个服务器应用程序,作为从控制中心到无线电硬件的网关,每个单元有一个插槽。 根据我的理解,NIO适用于一个服务器,许多客户端,但我想的是一个客户端,许多服务器。 我想第三种选择是使用MINA,但我不确定这是否会对一个简单的问题投入太多。 每个远程服务器最多有8个连接,全部来自同一个客户端(用于控制所有硬件和单独的TX / RX套接字)。 但是,单个客户端将希望同时连接到多个服务器。 不是将每个服务器放在不同的端口上,而是可以在客户端使用通道选择器,还是更好地在客户端进行multithreadingio并以不同方式配置服务器? 实际上,由于远程机器仅用于与其他硬件交互,RMI或IDL / CORBA是否是更好的解决方案? 实际上,我只是希望能够从硬件发送命令并接收遥测,而不必编写一些应用程序层协议来执行此操作。

Java NIO客户端

import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.*; public class EchoServer { private InetAddress addr; private int port; private Selector selector; private Map<SocketChannel,List> dataMap; public EchoServer(InetAddress addr, int port) throws IOException { this.addr = addr; this.port = port; dataMap = new […]

Java:文件重命名检测

有没有办法使用Java检测文件重命名? (NIO的WatchService API或任何其他)从我在重命名文件时看到的情况发生了两个单独的事件 – ENTRY_DELETE,然后是ENTRY_CREATE。