标签: nio2

NIO2:如何将 URI 映射到路径?

我正在尝试找到一种简单的方法来将 a 映射URI到 a Path,而无需编写特定于任何特定文件系统的代码。以下似乎可行,但需要一种有问题的技术:

public void process(URI uri) throws IOException {
    try {
        // First try getting a path via existing file systems. (default fs)
        Path path = Paths.get(uri);
        doSomething(uri, path);
    }
    catch (FileSystemNotFoundException e) {
        // No existing file system, so try creating one. (jars, zips, etc.)
        Map<String, ?> env = Collections.emptyMap();
        try (FileSystem fs = FileSystems.newFileSystem(uri, env)) {
            Path path = fs.provider().getPath(uri);  // yuck :(
            // assert path.getFileSystem() == fs;
            doSomething(uri, path);
        }
    } …
Run Code Online (Sandbox Code Playgroud)

java filesystems zip jar nio2

4
推荐指数
1
解决办法
3077
查看次数

IO 性能:选择器 (NIO) 与 AsynchronousChannel(NIO.2)

奇怪的是,我无法在 Google 中找到 NIO.2 异步 IO 性能与通过 java.nio.channels.Selector 使用 NIO 的多路复用 IO 的明确答案。

所以,我的问题是:NIO.2 AsynchronousChannel 是否比 NIO Selector 具有更好的性能?当然,我对不同负载配置文件下的服务器端事物感兴趣 - 同时连接数/平均连接寿命/流量。

我能找到的唯一信息是 Windows IOCP 比 Windows select 稍好。

java performance nio nio2

4
推荐指数
1
解决办法
3144
查看次数

从ByteBuffer到双数组

我有一个ByteBuffer包含三个双重值,例如{1.0, 2.0, 3.0}.我现在拥有的是什么

double[] a = new double[3];
for (int i = 0; i < 3; i++) {
    a[i] = byteBuffer.getDouble();
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但我更喜欢一步到位的解决方案

double[] a = byteBuffer.asDoubleBuffer().array();
Run Code Online (Sandbox Code Playgroud)

但这导致了一个例外:

java.lang.UnsupportedOperationException at java.nio.DoubleBuffer.array(...)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

java nio bytebuffer nio2

4
推荐指数
2
解决办法
1360
查看次数

如何将具有属性/权限的目录从一个位置复制到另一个位置?

我看到很多的例子使用Files.walkFileTree()的目录及其内容从一个位置复制到另一个,但他们不采取目录的文件属性和权限考虑.意思是,他们只是调用Files.createDirectories()而没有任何属性或权限.

如何使用Java7核心类将目录(及其内容)从一个位置复制到另一个位置而不丢失文件属性或权限?

java-7 nio2

3
推荐指数
1
解决办法
5712
查看次数

DirectoryStream.Filter用于列出基于特定日期/时间的文件的示例

我试图调查一个DirecoryStream.Filter示例newDirectoryStream,我可以在其中列出超过60天的目录(及其所有子目录)下的所有文件,作为示例.

DirectoryStream<Path> dirS = Files.newDirectoryStream(Paths.get("C:/myRootDirectory"), <DirectoryStream.filter>);

for (Path entry: dirS) {
    System.out.println(entry.toString());
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,应该是DirectoryStream.filter什么?
这将是一个很大的帮助,因为我正在一个项目,我试图删除早于某个时间戳和java-1.7 File.listFiles()之前的文件挂起.

可以Files.walkFileTree()提供一个选项吗?

java file-io nio2

3
推荐指数
1
解决办法
1万
查看次数

Java 7 walkFileTree在目录上调用visitFile

说我有以下目录结构

/root/dir
/root/dir/file1.txt
/root/dir/subdir
/root/dir/subdir/file2.txt
Run Code Online (Sandbox Code Playgroud)

假设我将使用以下访客:

class MyFileVisitor extends SimpleFileVisitor<Path> {

  @Override
  public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs)
  throws IOException {
    if(Files.isDirectory(file)) {
      throw new IllegalStateException("WAT!? Visiting directory: "+file.toAbsolutePath().toString());
    }
    System.out.println("Visiting file: "+file.toAbsolutePath().toString());
    return super.visitFile(file, attrs);
  }
Run Code Online (Sandbox Code Playgroud)

如果我们使用walkFileTree的简单重载:

Files.walkFileTree(Paths.get("/root/dir"), new MyFileVisitor());  
Run Code Online (Sandbox Code Playgroud)

一切都按计划进行,我们看到以下输出:

Visiting file: /root/dir/file1.txt
Visiting file: /root/dir/subdir/file2.txt
Run Code Online (Sandbox Code Playgroud)

但是,当我们尝试设置最大深度时,事情开始崩溃:

Files.walkFileTree(Paths.get("/root/dir"), EnumSet.noneOf(FileVisitOption.class), 1, new MyFileVisitor());
Run Code Online (Sandbox Code Playgroud)

输出:

Visiting file: /root/dir/file1.txt

java.lang.IllegalStateException: WAT!? Visting directory: /root/dir/subdir
Run Code Online (Sandbox Code Playgroud)

我很确定这是一个错误,但是我想先问一下社区:我缺少什么了吗,这实际上是预期的行为吗?感谢您的确认!

细节:

java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) …
Run Code Online (Sandbox Code Playgroud)

java-7 nio2

2
推荐指数
1
解决办法
3727
查看次数

为什么 Path.relativize 在 Java 8 和 Java 11 上表现不同?

为什么该方法relativize上的行为不同?

Path path1 = Paths.get("/a/./b/../image.png");
Path path2 = Paths.get("/a/file.txt");
Path path = path1.relativize(path2);
System.out.println(path);
Run Code Online (Sandbox Code Playgroud)
  • (准确地说是 1.8.0_66)打印../../../../file.txt. 文档
  • (准确地说是 11.0.4)打印../file.txt. 文档

两个版本的 JavaDoc 描述是相同的。我觉得方式对我来说是正确的行为:

  • path1:/a/./b/../image.png归一化到/a/b/../image.png哪个归一化到/a/image.png
  • path2/a/file.txt
  • 的方式浏览来自/a/image.png并且/a/file.txt../file.txt

问题

  1. 如何在来计算应该呢?它不会使路径正常化吗?我不明白如何从 head得到结果。

  2. 为什么这两个版本之间存在根本没有记录的差异?

java path java-8 nio2 java-11

2
推荐指数
1
解决办法
172
查看次数

标签 统计

nio2 ×7

java ×5

java-7 ×2

nio ×2

bytebuffer ×1

file-io ×1

filesystems ×1

jar ×1

java-11 ×1

java-8 ×1

path ×1

performance ×1

zip ×1