标签: nio2

使用Java 6中的Java 7 SDK功能

我有兴趣使用Java 7 SDK中的一些NIO2功能(特别是文件系统观察者),但是我不想为Java 7编译我的类并排除Java 6运行时.主要是因为我希望保持与Mac OS X的兼容性,还因为我不想强迫我的用户升级.

这可能吗?最好的方法是什么?任何链接或示例?

以下是我可以想象的一些方法:使用不同的编译器编译类文件并根据Java版本动态加载它?或者也许使用反射?或者也许只有Java 7的编译器设置来生成Java 6兼容的类?

我正在寻找一个不会变成丑陋混乱的解决方案:),所以理想情况下我可以编写两个接口实现,一个使用新功能,一个不使用,然后动态选择一个而不必进行反射调用到处都是.

java java-7 nio2

9
推荐指数
1
解决办法
2917
查看次数

Java I/O:确保在任何r/w操作之前文件未被其他进程锁定

我在一个应用程序中遇到一个经常出现的问题,该应用程序基于Java 7 WatchService API跟踪目录中文件的内容.当底层文件系统触发文件的修改事件时,我想立即计算其SHA-256.

但是经常发生另一个进程打开文件(即Word),从而扣留了一个独占锁并阻止我的应用程序进行任何读/写操作.如果针对打开的文件创建了任何Stream/Channel,则会抛出一个类似于以下消息的FileNotFoundException或者用于nio API的FileSystemException:

该进程无法访问该文件,因为该文件正由另一个进程使用

当文件实际上不存在于fs上时,我无法提供能够检测到这种情况而不屏蔽"真正的"FileNotFoundException的解决方案.

我想出了通过File.exists检查存在的想法,然后如果在打开流时抛出FileNotFoundException,我将能够推断该文件已被锁定.我愿意接受任何意见!

谢谢!

java nio locking watchservice nio2

9
推荐指数
1
解决办法
3788
查看次数

Java7 nio2的任何可用的内存中FileSystem实现?

我一直在寻找内存中的nio2 FileSystem实现,这将使我能够更轻松地测试我的IO相关代码.

看起来本质上,Java只提供(在我的JDK中)a Win32FileSystem和a ZipFileSystem.

似乎ShrinkWrap有类似的东西,但似乎主要处理ZIP文件系统或任何东西.

我想现在,有些人已经在你自己的项目中加入了新的nio FileSystem IO,可以帮助我吗?

谢谢

java filesystems testing nio2

8
推荐指数
2
解决办法
2266
查看次数

Java 7 NIO.2 Files.getLastModifiedTime时区

我正在编写一个程序,需要确定上次修改时间的文件/目录.我想使用Joda Time处理这次,我正在使用Java 7 NIO.2类Files来获取文件的最后修改时间.它的getLastModifiedTime()方法返回一个FileTime类的实例,它有方便的方法toMillis(),其结果我传递给Joda Time DateTime类构造函数:

new DateTime(Files.getLastModifiedTime(path).toMillis());
Run Code Online (Sandbox Code Playgroud)

但是,我觉得我做错了,因为DateTime(long)构造函数明确提到DateTime将使用默认时区创建实例.FileTime但是,docs在任何地方都没有提到它的时区.我查看了FileTime代码; 它似乎非常简单,它的toString()方法表明它使用UTC时区(它Calendar在UTC时区创建一个并直接设置其毫秒).

那么,确实FileTime使用UTC或当地时间吗?什么是转换正确的方式FileTimeDateTime

java datetime date jodatime nio2

8
推荐指数
1
解决办法
5178
查看次数

Java 7 NIO watchservice vs jpathwatch

我正在使用的项目一直在使用Java 6和jpathwatch(.95),现在正在升级到Java 7.目前在Windows 7和2008 Server上.我正在重构代码区域以使用新的Java 7 NIO并且相对简单 - 甚至使用NIO.2来替换jpathwatch.但是,我们代码的文件监视区域开始无法进行单元测试.似乎Java 7 NIO不会获取UNC路径到其他机器的变化 -

\\otherMach\path\to\watch.  
Run Code Online (Sandbox Code Playgroud)

为了测试,我实现了Java NIO教程站点http://docs.oracle.com/javase/tutorial/essential/io/fileio.html中的代码,然后在jpathwwatch导入而不是Java NIO中创建了一个重复的类交换.进口.jpathwatch适用于UNC路径,但Java NIO不适用.它似乎注册甚至返回该位置的初始事件键:(示例输出)

INFO: Watching: \\otherMach\path\to\watch
DEBUG: Added: \\otherMach\path\to\watch
INFO: Got event key: sun.nio.fs.WindowsWatchService$WindowsWatchKey@1f26ecd2
INFO: event key for: \\otherMach\path\to\watch
Run Code Online (Sandbox Code Playgroud)

但后来从未发现任何进一步的变化.

jpathwatch注册并报告目录和文件事件(尽管它在注册后不会立即报告初始事件).

INFO: Watching: \\otherMach\path\to\watch
DEBUG: Added: \\otherMach\path\to\watch
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \\otherMach\path\to\watch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \\otherMach\path\to\watch\New folder
INFO: Got event key: name.pachler.nio.file.impl.WindowsPathWatchService$WatchRecord@79a7bd3b
INFO: event key for: \\otherMach\path\to\watch
INFO: EVENT RECEIVED: ENTRY_CREATE file/dir created - \\otherMach\path\to\watch\New …
Run Code Online (Sandbox Code Playgroud)

java nio watchservice nio2

8
推荐指数
1
解决办法
1932
查看次数

你如何干净地关闭AsynchronousSocketChannel?

我的服务器使用a AsynchronousServerSocketChannel来侦听客户端连接CompletionHandler.当接受客户端连接时,将AsynchronousSocketChannel再次使用a CompletionHandler来读取,以便在没有超时的情况下接收数据.

到目前为止,我的客户端连接,写入服务器读取的数据,它能够响应通过同一个套接字将数据发送回客户端.

当我的客户端终止时,它会调用AsynchronousSocketChannel.close(),以关闭套接字.进行此调用时,服务器正在等待从套接字读取数据.

我曾期望AsynchronousSocketChannel.close()客户端上的调用转换为服务器上CompletionHandler.completed读取长度为的回调-1,表明套接字已关闭,但回调是CompletionHandler.failed以下异常:

java.io.IOException: The specified network name is no longer available.
  at sun.nio.ch.Iocp.translateErrorToIOException(Iocp.java:309)
  at sun.nio.ch.Iocp.access$700(Iocp.java:46)
  at sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:399)
  at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:744)    
Run Code Online (Sandbox Code Playgroud)

客户端应如何关闭套接字,以免在服务器上看到错误?

java nio nio2

8
推荐指数
1
解决办法
1691
查看次数

使用Files.newBufferedReader()读取文件并直接构建读者的结果不同

似乎Files.newBufferedReader()对UTF-8比对天真的替代品更严格.

如果我创建一个单字节128的文件---所以,不是一个有效的UTF-8字符---如果我在结果上构造一个BufferedReaderon ,但是抛出异常会很高兴.InputStreamReaderFiles.newInputStream()Files.newBufferedReader()

这段代码

try (
    InputStream in = Files.newInputStream(path);
    Reader isReader = new InputStreamReader(in, "UTF-8");
    Reader reader = new BufferedReader(isReader);
) {
    System.out.println((char) reader.read());
}

try (
    Reader reader = Files.newBufferedReader(path);
) {
    System.out.println((char) reader.read());
}
Run Code Online (Sandbox Code Playgroud)

有这个结果:

?
Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.read(BufferedReader.java:182)
    at TestUtf8.main(TestUtf8.java:28)
Run Code Online (Sandbox Code Playgroud)

这记录了吗?是否有可能获得宽松的行为Files.newBufferedReader()

java file utf-8 java-8 nio2

8
推荐指数
2
解决办法
1591
查看次数

在jdk7监视服务API中,什么时候会抛出OVERFLOW事件?

对溢出文件规定:

OVERFLOW - 表示事件可能已丢失或丢弃.

它没有说在什么情况下我应该期望事件丢失或丢弃?起初我以为这是将很多文件写入文件夹的结果.我创建了几千个零大小的文件,并将它们移动到受监控的目录.没有溢出.

我错过了什么?

java io java-7 nio2

7
推荐指数
3
解决办法
3820
查看次数

是否存在嵌套归档的有效java.net.URI?

虽然可能是不明智的,但是通过使用URI方案来读取基本上重命名的.zip文件(.ear,.war,.jar等)的存档格式是可能的.jar:

例如,当uri变量求值为单个顶级归档时,以下代码可以正常工作,例如当uri等于时jar:file:///Users/justingarrick/Desktop/test/my_war.war!/

private FileSystem createZipFileSystem(Path path) throws IOException {
    URI uri = URI.create("jar:" + path.toUri().toString());
    FileSystem fs;

    try {
        fs = FileSystems.getFileSystem(uri);
    } catch (FileSystemNotFoundException e) {
        fs = FileSystems.newFileSystem(uri, new HashMap<>());
    }

    return fs;
}
Run Code Online (Sandbox Code Playgroud)

然而,getFileSystemnewFileSystem调用失败的IllegalArgumentException时候URI包含嵌套压缩文件,例如,当uri平等jar:jar:file:///Users/justingarrick/Desktop/test/my_war.war!/some_jar.jar!/(一的.jar一个内部的.war).

java.net.URI嵌套存档文件是否有有效的方案?

java uri jar archive nio2

7
推荐指数
1
解决办法
405
查看次数

SSLEngine握手完成后打印解码数据

SSL握手完成后如何获取解码数据?

目前它似乎只解密了一些数据.

重现步骤

  1. 保存并运行此代码
  2. 转到https:// localhost:1500 - 您应该注意到请求的开头和结尾具有以下内容:

?GET ......#$?+ {??? u7Y ???

java ssl nio nio2 sslengine

7
推荐指数
0
解决办法
328
查看次数

标签 统计

java ×10

nio2 ×10

nio ×4

java-7 ×2

watchservice ×2

archive ×1

date ×1

datetime ×1

file ×1

filesystems ×1

io ×1

jar ×1

java-8 ×1

jodatime ×1

locking ×1

ssl ×1

sslengine ×1

testing ×1

uri ×1

utf-8 ×1