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

时间:2014-12-01 10:41:56

标签: 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监视服务监控这些网络资源,或者是否有任何其他框架/ api。

由于

1 个答案:

答案 0 :(得分:3)

你已经给它混合了file协议和http协议,这实际上没有用。

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

您需要一些可以轮询更改的内容,除非S3有适当的东西来推送更改通知(但这是您必须单独调查的内容)。你不能用Java NIO做到这一点。