问题标签 [java-nio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
12933 浏览

java - Java 中 File.exists() 的替代方案

我从没想过它会发生在我身上,但我遇到了我在 Java 中的第一个错误:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5003595

我几乎处于与错误(Linux 上的 NFS)中描述的完全相同的情况,并且我看到它File.exists()没有返回正确的值(至少不是马上)。

所以我的问题是,这种检查文件是否存在的方法有什么替代方法吗?如果可能的话,我更愿意让它与操作系统无关。

编辑:我找到了一种解决方法。如果您调用ls $filedir,NFS 会刷新任何给 Java 带来麻烦的缓存/元数据,并File.exists()返回正确的值。当然,这并不完全理想,因为它会损害便携性,但有一些方法可以解决这个问题。

0 投票
1 回答
40 浏览

sockets - Java NIO 构造——socketchannel 和 socketserverchannel 是如何在内部工作的?

我有一些与 socketchannel 和 socketserverchannel 如何工作有关的具体问题:-

  1. 当 ServerSocketChannel 接受连接时(请参阅下面的代码),我的理解是它以某种方式将客户端移动到一个新的随机选择的端口。这个对吗?有没有办法从一个范围内选择这个端口?我问是因为当我编写这样的服务器并将其部署到 VM 时,我希望能够仅将一组端口列入白名单。如果 accept() 调用可以选择任何随机端口,我该如何实现?我不是必须打开所有端口吗?

    ServerSocketChannel 套接字 = ServerSocketChannel.open();

    socket.bind(new InetSocketAddress("localhost", 1111));

    ... ..

    SocketChannel 接受Socket= socket.accept();

  2. 客户端代码非常简单(请参阅下面的代码)。

    SocketChannel 客户端= SocketChannel.open(new InetSocketAddress("localhost", 1111)); .....//初始化一个缓冲区

    客户端.write(缓冲区);

现在这个客户端正在尝试连接到端口 1111。客户端如何确定它被重定向到哪个端口?它怎么知道写操作必须发生在服务器选择的不同端口上?

0 投票
0 回答
259 浏览

java - AsynchronousSocketChannel 如何保持读取?

我需要连接到 4 台机器并从套接字读取数据。我选择使用 nio2 的异步模型。

这是一个伪代码:

要运行此代码,我创建一个新组并将其传递给所有Connectors :

问题:

线程在第一次阅读后发布(您可以在其中找到//#1评论)。

解决方案 !

为了解决这个问题,我引入了一个CountDownLatch让线程等待读取:

问题:

这是 ( CountDownLatch) 解决问题的正确方法吗?如果没有最好的方法是什么?

阻塞线程(latch.await())是不是与异步模型相矛盾?

0 投票
1 回答
304 浏览

java - JAVA NIO 包,出现意外的网络错误

我有一个代码,可以在其中读取网络驱动器上的图像。我阅读了数千张图片,但只是有时我偶尔会遇到以下异常。

下面是我得到它的代码

`

我在这一行得到了异常 - int totalBytesRead = inputStream.read(fourBytes);

0 投票
1 回答
203 浏览

java - 模拟 java.nio.Files.class 时出现 NullPointer 异常

我正在尝试为该类编写一个单元测试:

这是我的单元测试:

当我运行它时,模拟不起作用。我从实际Files.list()方法中得到一个例外。 我也想模拟 (Paths.class)Paths.get()调用,但暂时不要这样做。

Junit错误:

java.nio.file.Files.provider(Files.java:97) 在 java.nio.file.Files.newDirectoryStream(Files.java:457) 在 java.nio.file.Files.list( Files.java:3451) 在 com.ClassToTestUTest.testWalk(ClassToTestUTest.java:51)

我发现了很多与模拟这个 Files 类有关的问题。我正在使用 PowerMock 2.0.0 RC4 和 Mockito 2.23.4。

我哪里错了?

0 投票
0 回答
67 浏览

java - Java NIO 多播/UDP 环回延迟

我使用 java.nio 编写了一个非常简单的多播/UDP 发布者和侦听器,我正在通过执行以下操作来测试端到端延迟:

  • 在发布方面,我发送了一个包含当前时间戳的数据报,精度为微秒。
  • 在侦听方面,我只是解析该时间戳,然后获取当前时间戳并计算差异以获得端到端延迟。

请注意,我没有进行任何 CPU 固定,而是在 Mac OS 上运行 Java 11。我在环回接口上运行发布/订阅的 2 个进程,我得到的延迟范围为 100 到 400 微秒。我发现它非常高,我预计延迟会快一个数量级。我错过了什么吗?

如果你想重现,我将代码添加到这篇文章中。要运行程序,参数如下:

这是代码:

0 投票
1 回答
56 浏览

java - 用例 OutputStream(java.io) 与 Channel(java.nio)

我是否正确理解,当我们要写入的数据不是完整接收/准备的数据时,用于案例的通道是什么?

但是 OutputStream 用于我们现在已经可以写入所有数据的情况。

换句话说:
nio - 当我们异步获取数据以进行写入
io - 当我们同步获取数据以进行写入

0 投票
0 回答
171 浏览

java - 如何从 GCS Blob 中读取特定范围的字节?

我想以指定大小的块读取 GCS blob 的内容。我写了一个测试,我想检索存储为 GCS blob 的 10,000 字节文件的最后 5000 字节。该文件由 1K 个“0”组成,然后是 1K 个“1”,1K 个“2”,...,1K 个“9”。

因为我从 5000 字节开始,并要求检索 10,000 字节,所以我希望只读取最后 5000 字节。但是,读取的字节数为 10,000。前 5000 个字节是我所期望的,从“5”开始。有趣的部分是最后 5000 个字节由 <CR><LF> 组成,然后是文件的开头- 1K 的“0”,...,998 个“4”。为什么会发生这种情况,我该怎么做才能只检索最后 5000 个字节?

0 投票
0 回答
49 浏览

java - java Files.delete 会在没有写权限的情况下删除文件吗?

我正在尝试编写一个单元测试来测试某些代码中的 IOException 处理。我想我可以通过从文件中删除权限并尝试删除它来创建一个 IOException 。但看起来该文件无论如何都会被删除。第一个问题是预期的行为?如果是这样,这对我来说似乎是一个很大的安全漏洞。第二个问题是任何人都对如何在 Files.delete() 或 commons.io FileUtils.deleteDirectory() 两种方法中的任何一种上创建 IOException 有任何建议。以下是单元测试代码,我在文件上尝试了 Files.delete,在目录上尝试了 FileUtils.deleteDirectory。在后一种情况下,我得到一个 fileNotFound 异常。第二个断言总是失败。使用调试器,我停止了代码并确保不可写的权限为 000。我在 Redhat 7 上运行 java 11。

0 投票
0 回答
25 浏览

java - 我应该使用 JavaNIO 将文件引用传递给 Saxon s9api 吗?

我从Saxonica 网站下载了 Saxon 10 样本,以获取有关如何使用s9api的一些示例。

我发现所有示例都使用经典java.io.*来读取和写入 XSL 转换的文件。然后,我尝试使用更新的 Java NIO 和 NIO.2 包来查找任何 Saxon 示例用于 I/O**。

但令人惊讶的是,我一点运气都没有。我想知道为什么。

更具体地说,让我们关注两个例子:

java.nio.file.Files如果我使用类而不是经典java.io.File来告诉序列化程序在哪个文件中保存转换结果,它会产生真正的区别吗?

或者,在输入端,以下之一是否比其他更好?

或者参数类型只是一个“文件引用”,Serializer并且StreamSource无论我如何告诉他们要使用什么文件,都会尽力而为。