我正在尝试找到一种简单的方法来将 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) 奇怪的是,我无法在 Google 中找到 NIO.2 异步 IO 性能与通过 java.nio.channels.Selector 使用 NIO 的多路复用 IO 的明确答案。
所以,我的问题是:NIO.2 AsynchronousChannel 是否比 NIO Selector 具有更好的性能?当然,我对不同负载配置文件下的服务器端事物感兴趣 - 同时连接数/平均连接寿命/流量。
我能找到的唯一信息是 Windows IOCP 比 Windows select 稍好。
我有一个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)
我究竟做错了什么?
我看到很多的例子使用Files.walkFileTree()的目录及其内容从一个位置复制到另一个,但他们不采取目录的文件属性和权限考虑.意思是,他们只是调用Files.createDirectories()而没有任何属性或权限.
如何使用Java7核心类将目录(及其内容)从一个位置复制到另一个位置而不丢失文件属性或权限?
我试图调查一个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()提供一个选项吗?
说我有以下目录结构
/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) 为什么该方法relativize在java-8和java-11上的行为不同?
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)
两个版本的 JavaDoc 描述是相同的。我觉得java-11方式对我来说是正确的行为:
path1:/a/./b/../image.png归一化到/a/b/../image.png哪个归一化到/a/image.pngpath2: /a/file.txt/a/image.png并且/a/file.txt是../file.txt问题
如何在Java的8来计算应该呢?它不会使路径正常化吗?我不明白如何从 head得到结果。
为什么这两个版本之间存在根本没有记录的差异?
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