java - 使用 Java NIO 监视服务监视 http 资源

标签 java amazon-s3 nio watchservice

我需要监控 Amazon S3 上的目录以检查是否有任何新文件添加到该目录。我尝试使用 Java NIO Watch Service,但它无法正常工作。如果我使用以下语法和提供的 S3 路径:

String pathToMonitor="file://https://abc/dir";  //Line1
Path path=Paths.get(new URL(pathToMonitor).toURI()); //Line2
Boolean isFolder=(Boolean) Files.getAttribute(file, "basic:isDirectory", LinkOption.NOFOLLOW_LINKS); //Line3

然后我收到以下错误:

java.nio.file.FileSystemException: \\https\abc\dir: The network path was not found.

at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:53)
at sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(WindowsFileAttributeViews.java:38)
at sun.nio.fs.AbstractBasicFileAttributeView.readAttributes(AbstractBasicFileAttributeView.java:168)
at sun.nio.fs.AbstractFileSystemProvider.readAttributes(AbstractFileSystemProvider.java:92)
at java.nio.file.Files.readAttributes(Files.java:1961)
at java.nio.file.Files.getAttribute(Files.java:1866)

如果我从路径中删除 file:// 前缀,则会生成以下错误:

Exception in thread "main" java.nio.file.FileSystemNotFoundException: Provider "https" not installed
at java.nio.file.Paths.get(Paths.java:147)

如果我将 'Line2' 修改为 Path path=Paths.get("https://abc/dir"); 则会生成以下跟踪:

Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <:> at index 5: https://abc/dir
at sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)
at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)
at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
at sun.nio.fs.WindowsPath.parse(WindowsPath.java:94)
at sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:255)
at java.nio.file.Paths.get(Paths.java:84)

请让我知道我在这里做错了什么,以及是否可以使用 Java 监视服务来监视此类 Web 资源,或者是否有任何其他框架/API。

谢谢

最佳答案

您给了它混合了 file 协议(protocol)和 http 协议(protocol),这实际上没有意义。

如果您访问资源的唯一方式是通过 HTTP,那么基本上您无法执行您想要执行的操作。当 HTTP 资源发生更改时,没有通用的机制可以收到通知,因为没有通用的机制可以从 HTTP 资源获取推送通知,而且它不在操作系统的控制范围内,因此无法在发生更改时拦截这些更改。使用本地文件,您的操作系统可以检测到发生的更改,因为它最终负责处理本地磁盘的写入,但这不适用于您的情况。

您需要一些可以轮询更改的东西,除非 S3 有定制的东西来推送更改通知(但这是您必须单独调查的东西)。你无法使用 Java NIO 来做到这一点。

关于java - 使用 Java NIO 监视服务监视 http 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27226592/

相关文章:

Oracle 数字类型的 java 映射

android - 无法在 s3 中获取更新的对象?

amazon-web-services - 从 CloudFormation 模板中启用 S3 存储桶上的 MFA 删除

Java tryLock释放多个JVM上的锁

java - java中没有这样的文件异常

java - 将ImageView保存到sdcard android

java - Glassfish 3.1.2 中的连接池遇到 ClassCastException

java - 支柱|使用 Javascript 为逻辑标签赋值

javascript - 使用 Nodejs 读取存储在 aws S3 中的 JSON 文件

java - Java 8/NIO 中是否有任何机制可以替换大文件的行而不将其加载到内存中?