问题标签 [nio2]

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 投票
1 回答
349 浏览

scala - 如何在 Scala 中实例化 Java 7 完成处理程序

我在玩 scala(新手),我正在尝试使用 Java 7 NIO(因为我喜欢轻松开始)。但我不知道如何为接受实例化CompletionHandler。以下代码是错误的,我无法修复它:

0 投票
1 回答
2590 浏览

java - 为什么 Java 的 NIO.2 中的异步通道需要这些暂停?

我写了最小的例子,但它仍然太长,所以让我知道我应该发布到 Pastebin 的链接。

服务器:

客户:

要运行的样板:

所以,如果我有这样的代码,它会给我以下输出:

但是,如果我删除那些sleep()s in Srv.runInstance(),我会得到:

那么,这是否意味着客户端连接到服务器,但服务器拒绝?我不清楚这里发生了什么,文档也很差,所以我不知道在哪里寻找解决方案。

0 投票
1 回答
1658 浏览

java - 将 Java UserPrincipal 映射到 Active Directory 用户

我正在使用 Java 访问远程服务器。该服务器运行 Microsoft Windows 并提供 Active Directory 以及文件系统共享。我通过 JNDI 从 Active Directory 中读取用户和组,效果很好。我得到了所有的用户属性,比如distinguishedNameobjectSid等等。

我的 Java 程序还使用 Java 7 和 NIO.2 连接到同一服务器上的 Windows 共享。我可以读取远程文件系统并获取有关它的信息。我还可以像这样读取文件权限设置:

这样我就获得了UserPrincipal对象的访问权限。这个类只提供了一个getName()返回一些名字或者有时是一个 SID 的方法。

对于实际用户,该UserPrincipal对象返回一个 SID,我可以使用它在 Active Directory 中查找相应的用户。但是,如果UserPrincipal代表一个组,getName()则只返回一个文本,例如"VORDEFINIERT\Administratoren"

我找不到将此文本映射到 Active Directory 中定义的组的方法。AD 中对应的组有这个distinguishedName属性:CN=Administratoren,CN=Builtin,DC=mydomain,DC=com.

运行 Java 程序的机器和服务器都运行德文版的 Windows。奇怪的是 AD 返回CN=Builtin(English) 但文件系统返回一个带有德语翻译的组名VORDEFINIERT。如果两者都是,例如Builtin,我可能会解析UserPrincipal并找出distinguishedNameAD 对象应该是什么......但是,这种方法似乎不是很可靠。

我真的很想能够读取所有UserPrincipal对象的 SID,以便我可以在 AD 中找到相应的用户或组。

有没有办法做到这一点?如果您需要更多信息,请告诉我。

最好的问候,天空

0 投票
4 回答
5633 浏览

io - How can AsynchronousFileChannel read large file?

In this way, I can read the first 1000 byte from large.log. How can I read following log If I don't want to allocate bigger byte array like ByteBuffer.allocate(1000*1000). Because I think this will lead to OutOfMemory.

Could someone give me the sample code? Thanks.

ps:I can loop read the large file with JIO because I can check the return value of java.io.BufferedReader.read(). But I don't know how to do with NIO2.

0 投票
1 回答
255 浏览

java - Java NIO2:需要澄清 FileChannel

我正在尝试构建一个 custom FileChannel,但由于文档不一致,我遇到了不清楚的问题。

FileChannel.transferFrom(ReadableByteChannel src, long position, long count)方法的文档说,

如果给定位置大于文件的当前大小,则不传输任何字节。

现在,他们不应该这样说吗?:

“如果position + count大于文件的当前大小,则不传输任何字节。”

怀疑这可能是文档中的错误的原因是这个。在同一个 API 文档的其他地方,如果文件需要增长,则会明确提及它,例如FileChannel.write(ByteBuffer src, long position)

“如果给定的位置大于文件的当前大小,那么文件将被增长以容纳新的字节;”

因此,如果在 的情况下没有提到任何文件增长FileChannel.transferFrom(),我会觉得文件不应该通过这种方法增长。但问题是,文件不仅可以增长“如果给定位置大于文件的当前大小”,还可以“如果position + count大于文件的当前大小”。

0 投票
2 回答
297 浏览

java - 这是 Java 7 中的一个错误吗?

我不知道在哪里寻求关于 Java API 文档和 Java 代码的澄清和确认,所以我在这里做。

在 API 文档中FileChannel,我发现要归档position并归档size在多个位置的错误。

这里只是一个例子。状态的 API 文档transferFrom(...)

“如果给定位置大于文件的当前大小,则不传输任何字节。”

我确认 OpenJDK 代码也包含此代码...

...在FileChannelImpl.java与文档一致的文件中。

现在,虽然上面的代码片段和 API 文档看起来相互一致,但我“感觉”上面应该“大于或等于”而不仅仅是“大于”,因为position它是文件数据的基于 0 的索引,随意读取position == size()没有数据返回给调用者!(在position == size() - 1处,至少 1 个字节——文件的最后一个字节——可以返回给调用者。)

以下是同一 API 文档页面中的其他一些类似实例:

  1. position(...): "将位置设置为大于文件当前大小的值是合法的,但不会改变文件的大小。" (应该是“大于或等于”。)

  2. transferTo(...): "如果给定位置大于文件的当前大小,则不传输任何字节。" (应该是“大于或等于”。)

  3. read(...)“如果给定位置大于文件的当前大小,则不读取任何字节。” (应该是“大于或等于”。)

最后,返回值的文档部分read(...)甚至无法与文档的其余部分保持一致。这是它所说的:

read(...)

回报:

读取的字节数,可能为零,如果给定位置大于或等于文件的当前大小,则为 -1

所以,在这个单独的例子中,我确实看到他们提到了正确的事情。

总的来说,我不知道该怎么做。如果我今天编写与此文档匹配的代码,那么 Java 中的未来错误修复(代码或文档)将使我的代码出现错误,也需要我的修复。如果我今天自己按照今天的情况做正确的事情,那么我的代码一开始就会出错!

0 投票
1 回答
37 浏览

java - 是否可以出于任何原因为每个路径注册两个 WatchKey?

我无法在一个小示例中重现该问题,但是如果 WatchService 和s 相同,是否可以WatchKeys为一个注册两个不同的?PathKind<?>

例如,如果父目录内容发生变化?

0 投票
3 回答
16436 浏览

java - 使用常见 OpenOption 组合的最快方法

是否有一种简洁、惯用的方式(可能使用 Apache Commons)来指定 OpenOption 的常见组合,例如StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING

0 投票
3 回答
5243 浏览

java-7 - Java 7 walkFileTree calling visitFile on directories

Say I have the following directory structure

And let's say I'll be using the following visitor:

If we use the simple overload of walkFileTree:

Everything goes according to plan and we see the following output:

But when we try setting the max depth, things start to break down:

Output:

I'm pretty sure this is a bug, but I wanted to ask the community first: Is there something I'm missing and this is actually expected behavior? Thanks for confirming!

Details:

0 投票
1 回答
2155 浏览

java - 你如何干净地关闭 AsynchronousSocketChannel?

我的服务器使用AsynchronousServerSocketChannel. 监听客户端连接CompletionHandler。当一个客户端连接被接受时,它AsynchronousSocketChannel被读取,再次使用 aCompletionHandler来接收没有超时的数据。

到目前为止一切顺利,我的客户端连接,写入服务器读取的数据,服务器能够响应通过同一个套接字将数据发送回客户端。

当我的客户端终止时,它会调用AsynchronousSocketChannel.close(), 来关闭套接字。当进行此调用时,服务器正在等待从套接字读取数据。

我曾期望AsynchronousSocketChannel.close()客户端上的调用转换为服务器上CompletionHandler.completed读取长度为的回调-1,表明套接字已关闭,但是回调是CompletionHandler.failed有以下异常的:

客户端应该如何关闭一个套接字,以便它在服务器上不被视为错误?