标签: nio2

AsynchronousFileChannel如何读取大文件?

  Path file = Paths.get("c:/large.log");
  AsynchronousFileChannel channel = AsynchronousFileChannel.open(file);
  final ByteBuffer buffer = ByteBuffer.allocate(1000);
  channel.read(buffer, 0, buffer,
      new CompletionHandler<Integer, ByteBuffer>() {
        public void completed(Integer result, ByteBuffer attachment) {
          System.out.println(new String(buffer.array()));
        }
  }); 
Run Code Online (Sandbox Code Playgroud)

这样,我就可以从large.log中读取前1000字节。如果我不想分配更大的字节数组,如 ByteBuffer.allocate(1000*1000),我如何读取以下日志。因为我认为这会导致OutOfMemory。

有人可以给我示例代码吗? 谢谢。

ps:我可以用JIO循环读取大文件,因为我可以检查java.io.BufferedReader.read()的返回值。但我不知道NIO2怎么办。

io java-7 nio2

5
推荐指数
2
解决办法
6696
查看次数

Java NIO2 中临时文件中 Files.copy 上的 AccessDeniedException

我正在习惯 Java 7 和新Files类。

我正在编写一个小型应用程序,它在某些时候必须替换文件的内容。我使用临时文件来避免在出现问题时删除目标文件。AccessDeniedException但是,在执行实际副本时我总是收到。

这是我的代码:

// Temporary file generation.
Path target = getCurrentConfigFile(); // Returns a path, works ok.
Path tempFile = Files.createTempFile("tempfile", null);
Files.write(tempFile, conf.getBytes(Charset.defaultCharset()), StandardOpenOption.WRITE);

// Actual copy.
Files.copy(tempFile, target, StandardCopyOption.REPLACE_EXISTING);

// Cleanup.
Files.delete(tempFile);
Run Code Online (Sandbox Code Playgroud)

getCurrentConfigFile()处理目标文件路径创建:

(... generates various strings from configuration parameters)
return FileSystems.getDefault().getPath(all, these, various, strings);
Run Code Online (Sandbox Code Playgroud)

当我执行代码时,它是通过.bat脚本执行的,并且我在标准命令提示符或提升中都会收到错误。目标文件位于C:\temp\tests我使用同一 Windows 用户创建的目录中。

问题似乎在于从临时文件中读取,因为直接写入目标是有效的。接下来我该看哪里?

java permissions file nio2

5
推荐指数
1
解决办法
7300
查看次数

合并大文件而不将整个文件加载到内存中?

我想将包含字符串的大文件合并到一个文件中,并尝试使用nio2.我不想将整个文件加载到内存中,所以我尝试使用BufferedReader:

public void mergeFiles(filesToBeMerged) throws IOException{

Path mergedFile = Paths.get("mergedFile");
Files.createFile(mergedFile);

List<Path> _filesToBeMerged = filesToBeMerged;

try (BufferedWriter writer = Files.newBufferedWriter(mergedFile,StandardOpenOption.APPEND)) {
        for (Path file : _filesToBeMerged) {
// this does not work as write()-method does not accept a BufferedReader
            writer.append(Files.newBufferedReader(file));
        }
    } catch (IOException e) {
        System.err.println(e);
    }

}
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,这个工作,hower,字符串的格式(例如新行等不会被复制到合并文件):

...
try (BufferedWriter writer = Files.newBufferedWriter(mergedFile,StandardOpenOption.APPEND)) {
        for (Path file : _filesToBeMerged) {
//              writer.write(Files.newBufferedReader(file));
            String line = null;


BufferedReader reader = Files.newBufferedReader(file);
            while ((line = reader.readLine()) != null) { …
Run Code Online (Sandbox Code Playgroud)

java java-8 nio2

5
推荐指数
1
解决办法
7462
查看次数

我应该关闭用java.nio.file.Files.newInputStream创建的Streams吗?

在流教程中,关于从中获取的关闭流没有任何说法Files.newInputStream( path ).只有一些模糊不清:

返回的流是否可异步关闭和/或可中断是高度特定于文件系统提供程序的,因此未指定.

什么是"异步"在这种情况下?如果我显式关闭流或另一个线程异步关闭流?

java stream nio2

5
推荐指数
1
解决办法
2219
查看次数

如何使用AsynchronousServerSocketChannel绑定多个端口?

我正在尝试创建一个具有异步通信模型的服务器,并希望绑定多个端口,但是当我多次调用bind方法时,它将引发错误“ AlreadyBoundException”。有什么可行的方法吗?这是我的代码

try(AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open()){
                if(listener.isOpen()){
                    listener.setOption(StandardSocketOptions.SO_RCVBUF, 4*1024);
                    listener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
                    listener.bind(new InetSocketAddress(9001));
                    listener.bind(new InetSocketAddress(9002));
Run Code Online (Sandbox Code Playgroud)

java channel serversocket nio2

5
推荐指数
1
解决办法
280
查看次数

如何使用AsynchronousFileChannel异步强制文件

AsynchronousFileChannelJava中NIO.2 API包含的void force(boolean)方法.

显然这种方法是阻塞的,因为只有在将更改成功写入设备后才能返回.

我正在寻找一种方法来实现相同的目标,而不会阻塞线程.

正如评论中所提到的,这将等同于标准C库函数aio_fsync:http://pubs.opengroup.org/onlinepubs/009695399/functions/aio_fsync.html

java asynchronous nio nio2

5
推荐指数
1
解决办法
284
查看次数

在java.nio2中设置只读路径的正确方法

我很困惑......根据这个Java页面,File.setReadOnly()函数现在是一个"遗留"函数,应该被替换为Files.setAttribute()......但这需要您知道您是使用DOS还是POSIX文件系统.我只是想以独立于平台的方式使文件成为只读文件.我该怎么办?

java nio2

5
推荐指数
1
解决办法
1623
查看次数

Files.list和Files.walkFileTree和Files.walk有什么区别,maxdepth = 1?

如果我想要做一些文件只对目录的第一级,是有使用之间的差异Files.list(...)Files.walkFileTree(...)Files.walk(...)

Files.walkFileTree(directory, Collections.emptySet(), 1, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        doSomething(file);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) {
        // log exc
        return FileVisitResult.CONTINUE;
    }
});
Run Code Online (Sandbox Code Playgroud)

Files.list(directory)
    .forEach(path -> {
        try {
            doSomething(path);
        } catch (IOException exc) {
            // log exc
        }
    });
Run Code Online (Sandbox Code Playgroud)

Files.walk(directory, 1)
    .forEach(path -> {
        try {
            doSomething(path);
        } catch (IOException exc) {
            // log exc
        }
});
Run Code Online (Sandbox Code Playgroud)

java java.nio.file nio2

5
推荐指数
1
解决办法
7045
查看次数

支持 NIO.2 中区分大小写的 Windows 目录

最近的 Windows 10 版本能够通过以下方式将单个 NTFS 目录(而不是整个文件系统)标记为区分大小写fsutil.exe

如果我想从 Java 应用程序中查询给定目录的区分大小写的标志,我目前唯一的选择是调用

fsutil.exe file queryCaseSensitiveInfo ...
Run Code Online (Sandbox Code Playgroud)

在每个目录的基础上,这意味着可能会产生多个进程,这很昂贵。

在较新的 Java 版本 (11+) 中是否有针对区分大小写的 NTFS 和/或 WSL 文件系统的计划中的 NIO.2 API 扩展?

java ntfs fsutil nio2 windows-subsystem-for-linux

5
推荐指数
0
解决办法
117
查看次数

AsynchronousSocketChannel 如何保持读取?

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

这是一个伪代码:

class Connector {

    private final AsynchronousChannelGroup group;
    private final String host;
    private final int port
    //...
    
    public void connect() {
        try (AsynchronousSocketChannel client = AsynchronousSocketChannel.open(group)) {

            client.connect(new InetSocketAddress(host(), port())).get(5, TimeUnit.SECONDS);

            if (!group.isShutdown()) {
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                client.read(buffer, 5, TimeUnit.SECONDS, new Attachement(buffer), new ReadHandler(client)); //#1
            }

        } catch (Exception e) {
            //
        }
    }

    private class ReadHandler implements CompletionHandler<Integer, Attachement> {

        final AsynchronousSocketChannel channel;

        @Override
        public void completed(Integer result, Attachement attachment) {
            attachment.buffer.clear();
            channel.read(attachment.buffer, …
Run Code Online (Sandbox Code Playgroud)

java nio2 java-nio

5
推荐指数
0
解决办法
249
查看次数