- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我每天都在 Scala 中学习新东西。我当前采取的路线是从 java nio 中提取功能并从中实现 Scala 实现。我观察到其他 Scala 专家如何使用 java.nio.files 包和 FileVisitor 接口(interface)递归地遍历包含子目录和文件的嵌套目录结构。
但是,我遇到了一个小问题。我不太明白
我注意到 github 上有一个由 paulp 维护的实现,我无法理解。我将在这里展示他的代码,以及我的问题和疑虑:
import java.nio.file.{ FileVisitResult, SimpleFileVisitor }
trait PathVisitor extends FileVisitor[Path] {
def preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult
def postVisitDirectory(dir: Path, exc: IOException): FileVisitResult
def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult
def visitFileFailed(file: Path, exc: IOException): FileVisitResult
}
好吧,他继承自 FileVisitor,这是一个 Java 接口(interface):起初,我不确定 Scala 特征是否可以从 java 接口(interface)扩展。我在 REPL 中对此进行了测试。显然这没问题。 REPL 输出如下:
C:\Users\lulu\Documents\GitHub\akkaexperiments>scala欢迎使用 Scala 版本 2.10.2(Java HotSpot(TM) 64 位服务器 VM、Java 1.7.0_71)。输入表达式以对其进行求值。输入 :help 以获取更多信息。
scala> 导入 java.nio.file.{ FileVisitor };导入java.nio.file.FileVisitor
scala> 导入 java.nio.file.Path导入java.nio.file.Path
scala> 特征 PathVisitor 扩展了 FileVisitor[Path]定义特征 PathVisitor
scala>
<小时/>解决了这个问题,我现在查看 FileVisitor.java 的源代码。如下: 这就是保罗有趣的地方。下面的代码后面有解释。
public interface FileVisitor<T> {
FileVisitResult preVisitDirectory(T dir);
FileVisitResult preVisitDirectoryFailed(T dir, IOException exc);
FileVisitResult visitFile(T file, BasicFileAttributes attrs);
FileVisitResult visitFileFailed(T file, IOException exc);
FileVisitResult postVisitDirectory(T dir, IOException exc);
}
---------------------
paulp's code continues below:
object PathVisitor {
class Simple extends SimpleFileVisitor[Path] with PathVisitor { }
val Continue = FileVisitResult.CONTINUE
val SkipSiblings = FileVisitResult.SKIP_SIBLINGS
val SkipSubtree = FileVisitResult.SKIP_SUBTREE
val Terminate = FileVisitResult.TERMINATE
def apply(f: (Path, BasicFileAttributes) => FileVisitResult): PathVisitor = new Simple {
override def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult = f(file, attrs)
}
}
------
For context and comparison purposes here is the code for SimpleFileVisitor:
public class SimpleFileVisitor<T> implements FileVisitor<T> {
protected SimpleFileVisitor() {
}
@Override
public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
throws IOException
{
Objects.requireNonNull(dir);
Objects.requireNonNull(attrs);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(T file, BasicFileAttributes attrs)
throws IOException
{
Objects.requireNonNull(file);
Objects.requireNonNull(attrs);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(T file, IOException exc)
throws IOException
{
Objects.requireNonNull(file);
throw exc;
}
@Override
public FileVisitResult postVisitDirectory(T dir, IOException exc)
throws IOException
{
Objects.requireNonNull(dir);
if (exc != null)
throw exc;
return FileVisitResult.CONTINUE;
}
}
<小时/>
经过这一切,我得出以下结论:class Simple 扩展了 SimpleFileVisitor,它是 Java FileVisitor 接口(interface)的实现
paulp还混合了PathVisitor特征,其方法定义与Java FileVisitor接口(interface)中的方法定义完全相同。
这里令我困惑的是:1)为什么他在扩展 SimpleFileVisitor 的同时还混合了 PathVisitor 特征?2)当Simple类是相同的方法时,我们是否不想要求Simple类同时遵守SimpleVisitor契约和FileVisitor特征未实现的方法?3) 他包装了 Simple Class、一堆代表 SimpleFileVisitor 方法的返回类型的 val 和一个 apply 方法。好的,那么您认为这种结构背后的想法是什么?
我真的很想使用 PaulP 提出的结构,但这令人困惑。也许它需要一些清理。请指教。
最佳答案
这样做的原因是为了提供无缝的 Scala 体验。首先,第一个特征不是抽象您可能有访问者的任何 T
,而是指定路径。如果您确实只对路径感兴趣,那么不必担心泛型就好了。
然后他以 Scala 风格为您提供常量,这样您就不必从 Java 中获取它们。
他为您提供了一个特定于路径的 SimpleFileVisitor
,无需任何额外的工作,只需混合 PathVisitor
特征即可。
现在,问题仍然是:为什么要这样做而不是仅仅说
type PathVisitor = java.nio.file.FileVisitor
有两个原因。首先,类型别名并不是真正一流的语言构造,因此您会倾向于看到 Java 类型而不是 Scala 类型(稍微不太好)。此外,如果您以这种方式进行设置,您以后可以更轻松地将功能添加到框架中。如果您确定不想添加任何内容,那么这样做就没有什么争议。
现在,对于具体问题:
我们混合在 PathVisitor 中,这样我们就有了一个可以移动和操作的 Scala 特定类型;我们从 Java SimpleFileVisitor
获取实现,但使其具有 Scala 特征。
要求遵守多个匹配的方法不是问题;相同的方法可以是多个特征的 API 的一部分。关键是你是否可以使用你想要的特征(即 PathVisitor;答案是"is")。
本地提供的 Scala 样式常量有助于清理导入并提供更无缝的体验,就像 apply
样式构建器而不是 new
一样。
关于java - Scala:特征扩展了 java.nio.file.FileVisitor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29354517/
我花了相当多的时间尝试优化文件哈希算法,以尽可能地提高性能。 查看我之前的 SO 主题: Get File Hash Performance/Optimization FileChannel Byte
我不太明白它们之间有什么不同,所以我对这两个包有一些疑问。 在 Google 上浏览了一下之后,似乎 Oracle 决定使用更新和增强的 NIO.2 包来更新 NIO 包,作为 JDK7 版本的一部分
在 Java 1.4 之前,通过在不同的输入流/输出流之间移动字节来处理文件是常见的做法。 自 Java 1.4 起,其中 NIO已添加,建议使用 Channels 执行相同操作。 与 NIO2在 J
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我需要重写一些应该在 Java 6 VM 上运行的 Java 7 文件 IO 代码。 该实现使用了方便的 Java 7 功能,例如自动关闭、Paths 和 Files。 更具体地说,我需要处理像 /t
当我查看java中Scanner的源代码时,我发现一些让我困惑的事情 import java.nio.file.Path; import java.nio.*; 它们之间有什么区别,为什么它们不直接导
我的 Java 代码中几乎所有文件 I/O 操作都使用 java.nio.*。然而,在今天调试一段代码时,我注意到调试器 (Intellij IDEA 14) 显示了以下关于 java.nio.fil
奇怪的是,我无法在 Google 中找到 NIO.2 异步 IO 性能与通过 java.nio.channels.Selector 使用 NIO 的多路复用 IO 的明确答案。 所以,我的问题是:NI
我是初级 Java 程序员。 今天,我练习了如何在 java 中复制文件并尝试按照本教程进行操作 http://www.journaldev.com/861/4-ways-to-copy-file-i
我有一个指向绝对路径的 java.nio.Path: /home/user/project/resources/configuration.xml 我有第二个 java.nio.Path 指向项目的根
我开始使用java.nio.*,现在我想知道:为什么java.nio.Paths.get(..)不使用java.nio.Path 对象作为输入? 现在我总是做这样的事情: final Path bas
我是新手,正在学习 Java。我尝试在 Netbeans 7 中运行以下应用程序。 import java.io.*; import java.nio.file.*; import java.nio.
我的 Java 程序(见下文)有时会在 java.nio.File.move() 方法执行中因 java.nio.file.AccessDeniedException 崩溃。 我不明白为什么会抛出这个
所以我在这里阅读我最喜欢的软件模式书籍之一(面向模式的软件架构 - 并发和网络对象的模式),特别是关于 Proactor/Reactor 异步 IO 模式的部分。我可以看到通过使用可选 channel
我有一个方法如下,它已经正常运行了很长时间: private String loadFromFile(){ RandomAccessFile inFile = null; FileCh
我在 IntellijIDEA Community Edition 2017.3 版本中收到以下错误。该项目使用java版本“1.8.0-ea”。请给我一些解决问题的想法 Error:Internal
一 点睛 在 scatter-and-gather 场景下,可以将数据写入多个 Buffer 中。在 NIO 中,也能够同时操作多个缓冲区。在很多 Channel 实现类中,都提供了多个重载的 rea
I/O简介 在 Java 编程中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节。流 I/O 用于与外部世界接
一 点睛 给某一个文件加锁,防止并发访问时引起的数据不安全。 在 JUC 中,可以使用 synchronized、Lock 给共享的资源加锁,或者使用 volatile、CAS 算法等防止并发冲突。在
一 点睛 给某一个文件加锁,防止并发访问时引起的数据不安全。 在 JUC 中,可以使用 synchronized、Lock 给共享的资源加锁,或者使用 volatile、CAS 算法等防止并发冲突。在
我是一名优秀的程序员,十分优秀!