Tag: nio

Java Serializable,ObjectInputstream,非阻塞I / O.

我刚刚开始使用Java序列化,并且我不清楚如何在具有非阻塞I / O的场景中从源获取对象。 我能找到的所有文档建议使用ObjectInputStream是读取序列化对象的正确方法。 但是,正如我所提到的,我正在使用java.nio并执行非阻塞操作。 如果readObject()将阻塞,直到有新对象可用,这对我无济于事 总结..在使用Java NIO时如何进行序列化?

使用java nio socket时,“已建立的连接被主机中的软件中止”

我使用java nio套接字开发了一个java服务器。 这是我的应用程序的代码: public class EchoServer { static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Main.class); private static final int BUFFER_SIZE = 1024; private final static int DEFAULT_PORT = 4664; private InetAddress hostAddress = null; private int port; private String ipAddress = “my ip”; private Selector selector; // The buffer into which we’ll read data when it’s available […]

什么文件系统支持Java UserDefinedFileAttributeView?

我需要将自定义数据与文件系统中的文件一起存储(每个文件大约50个字节)。 我没有任何其他存储来保存数据,也无法为此创建额外的文件。 这些是我的要求我无法改变它。 我发现这可以使用UserDefinedFileAttributeView类来完成。 哪些文件系统支持此function? NTFS,FAT,Linux上的任何其他文件系统? 数据实际存储的位置和可靠性如何?

导致VM故障的Java map / nio / NFS问题:“在编译的Java代码中最近的不安全内存访问操作中发生了故障”

我已经为特定的二进制格式编写了一个解析器类( nfdump,如果有人感兴趣的话),它使用java.nio的MappedByteBuffer来读取每个几GB的文件。 二进制格式只是一系列标题和大多数固定大小的二进制记录,它们通过调用nextRecord()输出到被调用者,后者推送状态机,完成时返回null。 它表现很好。 它适用于开发机器。 在我的生产主机上,它可以运行几分钟或几小时,但似乎总是抛出“java.lang.InternalError:在编译的Java代码中最近的一个不安全的内存访问操作中发生了一个错误”,指法其中一个Map.getInt ,getShort方法,即地图中的读取操作。 设置地图的无争议(?)代码是这样的: /** Set up the map from the given filename and position */ protected void open() throws IOException { // Set up buffer, is this all the flexibility we’ll need? channel = new FileInputStream(file).getChannel(); MappedByteBuffer map1 = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); map1.load(); // we want the whole thing, plus […]

在Java7中的FileWalking树中解决访问被拒绝的问题

以下是一些简单的代码,仅用于测试Files.walkFileTree()方法。 但是,具有这些权限( rwx–x— )的文件夹/etc/ssl/private会抛出exception,即使我认为我用if语句保护它( if (permissions.equals(“rwx–x—“) )。 我究竟做错了什么? 提前致谢。 public static void main (String []args) throws IOException, InterruptedException { Files.walkFileTree(Paths.get(“/”), new WalkingTheThing2()); } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { PosixFileAttributeView posixView = Files.getFileAttributeView(dir, PosixFileAttributeView.class); PosixFileAttributes posixAttr = posixView.readAttributes(); String permissions =PosixFilePermissions.toString(posixAttr.permissions()); if (permissions.equals(“rwx–x—“)) { return FileVisitResult.SKIP_SUBTREE; } return FileVisitResult.CONTINUE; } @Override […]

当消息大小很大时,socketchannel.write()变得非常慢

在我使用java nio的程序中,socketchannel.write()在尝试连续写入10 KB消息时变得非常慢。 写入完整10 KB消息的测量时间介于160 ms和200 ms之间。 但是编写完整的5 KB消息的时间仅需0.8 ms。 在选择器中,我只有Selection.OP_READ并且不处理Selection.OP_WRITE。 当收到大的完整消息时,它会被写入另一个接收器4次。 有人遇到同样的问题吗? 有关于socketchannel.write()的post很慢。 我的问题是如何在OP_READ和OP_WRITE之间进行替换? 如果我添加一个例如150毫秒的inerval,则响应时间会减少。 有什么办法可以找到缓冲区已满的时候,我可以让程序等待。 我的操作系统是windows xp。 谢谢。 我通过检查写入的字节数来遵循EPJ的建议。 但响应时间仍然很长。 我在这里发布了部分代码,并想检查我的代码是否有问题。 //这是使用nio的writeData()部分: while (buffer.hasRemaining()) { try { buffer.flip(); n = socket.write(buffer); if(n == 0) { key.interestOps(SelectionKey.OP_WRITE); key.attach(buffer); break; } } catch (IOException e) { e.printStackTrace(); } finally { buffer.compact(); } } if(buffer.position()==0) { […]

如何在阻塞模式NIO中实现超时?

我没有使用任何选择器或类似的东西。 我只是一个简单的ServerSocketChannel监听和一个SocketChannel在阻塞模式下连接到它。 我想在连接上施加超时,但SocketChannel.socket().setSoTimeout()不起作用。 我尝试让后台线程hibernate30秒并检查变量是否仍为null (因为它将阻止等待读入该变量)但我无法正确同步变量,因为我无法访问我的局部变量匿名课。 还有其他方法可以实现这一目标吗? 更新:我说错了我的问题。 我还希望读取操作以及连接本身超时。

Java NIO windows实现

在使用NIO.2 AIOfunction处理项目时,我查看了“旧的”NIO选择器实现,并在Windows上看到使用默认的select-function,由于内部实现不良,因此在Windows上根本无法扩展。 大家都知道,在Windows上IOCP是唯一真正的解决方案。 当然,回调完成模型不适合NIO选择器模型,但这是否有效意味着在Windows上使用NIO基本上不是一个好主意? 例如:新的AIOfunction包括IOCP实现。 在使用支持AIO的最新Netty框架时,尤其如此。 那么Netty在Windows上的速度并不像它那么快?

下游事件如何在jboss的网络中运行?

刚刚开始使用netty来实现我自己的服务器。 我花了一些时间来掌握它,但现在我能够通过编写自己的MessageHandler接受客户端并在内部消息接收我能够从缓冲区读取并做了一些与收到的数据相关的业务逻辑。 但现在的问题是,如何将数据写入连接的客户端? 我看到了示例代码,如果出现这样的新消息,您可以在其中写入通道: public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { Channel ch = e.getChannel(); ch.write(e.getMessage()); } 但是如果你不想在那时写回数据呢? 如果客户端在套接字中保持连接并等待服务器中发生某些事件,该怎么办? 在那种情况下,我的服务器将如何找到要写入的正确套接字? 我想保留对通道对象的引用吗? 这是惯例吗? 我进一步研究了代码并看到了一个名为writeRequested的方法。 这有关系吗? 谁叫那个? 它需要吗?

Files.newDirectoryStream与Files.list

我知道Files.list(Path)在内部使用Files.newDirectoryStream(Path) ,基本上只包装DirectoryStream。 但是我不明白,当我想使用第一个或后一个时。 如果我想使用流API,这只是一种方便的方法吗? 我本可以做到这一点相当容易, 看到这个问题 。 如果查看Files.list的实现,内部DirectoryStream抛出的exception将包含在UncheckedIOException 。 我应该知道的任何事情吗?