Tag: nio

为什么Files.list()并行流的执行速度比使用Collection.parallelStream()慢得多?

以下代码片段是获取目录列表的方法的一部分,在每个文件上调用extract方法并将生成的药物对象序列化为xml。 try(Stream paths = Files.list(infoDir)) { paths .parallel() .map(this::extract) .forEachOrdered(drug -> { try { marshaller.write(drug); } catch (JAXBException ex) { ex.printStackTrace(); } }); } 这是完全相同的完全相同的代码,但使用普通的.list()调用来获取目录列表并在结果列表中调用.parallelStream() 。 Arrays.asList(infoDir.toFile().list()) .parallelStream() .map(f -> infoDir.resolve(f)) .map(this::extract) .forEachOrdered(drug -> { try { marshaller.write(drug); } catch (JAXBException ex) { ex.printStackTrace(); } }); 我的机器是四核MacBook Pro,Java v 1.8.0_60(内置1.8.0_60-b27)。 我正在处理~7000个文件。 平均3次运行: 第一个版本:使用.parallel() :20秒。 没有.parallel() […]

Java WatchService在查看映射驱动器时不生成事件

我实现了一个文件监视器,但我注意到java nio文件观察器不会为映射驱动器上复制的文件生成事件。 例如,我在Unix上运行文件观察器来观察映射到Windows( H:\ )的本地目录( /sharedfolder ),然后我将一个文件放在这个目录中( H:\ )但是文件观察者没有生成任何事件。 现在,如果我在Windows上运行文件观察器来监视映射驱动器( H:\ ),它引用了unix路径( /sharedfolder ),并且从unix我将文件放在此文件夹中,文件监视器识别更改并生成事件。 它看起来像一个bug,或者可能是我错过了一些东西,任何想法?

在Java中为JOGL释放直接缓冲区本机内存

我使用直接缓冲区(java.nio)来存储JOGL的顶点信息。 这些缓冲区很大,在应用程序生命周期内会被多次更换。 内存没有及时解除分配,几次更换后我的内存不足。 似乎没有好的方法来使用java.nio的缓冲类来解除分配。 我的问题是: JOGL中有一些删除Direct Buffers的方法吗? 我正在研究glDeleteBuffer(),但看起来这只是从显卡内存中删除缓冲区。 谢谢

如何在套接字通道中发送和接收序列化对象

我想通过套接字通道传输序列化对象。 我想把“好朋友”字符串作为序列化对象,然后在套接字通道中写入此对象,而在另一端我想读取相同的对象并检索数据。 我想用Java SocketChannel做的所有这些事情。 这个怎么做? 我尝试过如下,但没有在接收方获得任何数据。 private static void writeObject(Object obj, SelectionKey selectionKey) { ObjectOutputStream oos; try { SocketChannel channel = (SocketChannel) selectionKey.channel(); oos = new ObjectOutputStream(Channels.newOutputStream(channel)); oos.writeObject(obj); } catch (IOException ex) { ex.printStackTrace(); } } private static Object readObject(SelectionKey selectionKey) { ObjectInputStream ois; Object obj = new Object(); SocketChannel channel = (SocketChannel) selectionKey.channel(); try […]

WatchService和SwingWorker:如何正确地做到这一点?

WatchService听起来像是一个令人兴奋的想法…不幸的是,它似乎与教程/ api中的警告一样低,并不真正适合Swing事件模型(或者我错过了一些明显的,非零概率 从教程中的 WatchDir 示例中获取代码(只是为了处理单个目录),我基本上结束了 扩展SwingWorker 在构造函数中执行注册工作 把无限循环放在doInBackground中等待一个键 通过key.pollEvents()检索时发布每个WatchEvent 通过使用已删除/创建的文件作为newValue触发propertyChangeEvents来处理块 @SuppressWarnings(“unchecked”) public class FileWorker extends SwingWorker<Void, WatchEvent> { public static final String DELETED = “deletedFile”; public static final String CREATED = “createdFile”; private Path directory; private WatchService watcher; public FileWorker(File file) throws IOException { directory = file.toPath(); watcher = FileSystems.getDefault().newWatchService(); directory.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); } […]