java7相关的注意点
Path
path
并不仅仅限于传统的文件系统,也能表示zip
或者jar
文件
path
不一定真实的文件或目录,可以随意的创建
path
中可能有其他冗余项,比如符号链接,获取真实位置可以使用toRealPath()
或者normalize()
合并两个path
使用resolve()
,或者获取相对位置relative()
转化Path
file.toPath()
path.toFile()
处理单个文件目录
String path = "F:\\mavenproject\\SpringProject";
Files.newDirectoryStream(Paths.get(path),"*.xml")
.forEach(e-> System.out.println(e.getFileName()));
递归处理文件件
static class FileFindXMLVisitor extends SimpleFileVisitor<Path>{
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if(file.toString().endsWith(".xml")&& (!file.toString().startsWith("Maven")))
System.out.println(file.getFileName());
return FileVisitResult.CONTINUE;
}
}
String path = "F:\\mavenproject\\SpringProject";
Files.walkFileTree(Paths.get(path),new FileFindXMLVisitor());
Asynchronous IO
这是将来式
,例如用Future.get()
返回结果如果在创建AsynchronousFileChannel 时没有为其指明线程池,那就会为其分配一个系统默认的线程池(可能会和其他通道共用),默认线程池是由AsynchronousChannelGroup类定义的系统属性进行配置的.
回调式
主线程回派一个侦查员CompletionHandler到独立的线程中执行IO操作,这个侦查员会将IO操作的结果返回到主线程中,这个结果会触发他自己的completed或者failed方法(一般重写这两个方法)
String filepath = "C:\\code\\temp.txt";
Path filePath = Paths.get(filepath);
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(filePath);
ByteBuffer byteBuffer = ByteBuffer.allocate(1000);
fileChannel.read(byteBuffer, 0, byteBuffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
System.out.println("Bytes read: "+result);
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
System.out.println(exc.getMessage());
}
});
并发安全
- Java线程模型建立在
(1)共享的,默认可见的可变状态``(2)抢占式线程调度
1.所有线程可以很容易的
共享同一进程中的对象
2.能引用这些对象的任何线程都能修改这些对象
- 设计理念
安全性(并发类型安全)
活跃度
性能
重用性
安全性是指:不管同时发生多少操作都能确保对象保持自相一致
- 系统开销之源:
锁与监测
环境切换次数
线程的个数
调度
内存的局部性
算法设计