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.能引用这些对象的任何线程都能修改这些对象
- 设计理念
安全性(并发类型安全)
活跃度
性能
重用性
安全性是指:不管同时发生多少操作都能确保对象保持自相一致
- 系统开销之源:
锁与监测
环境切换次数
线程的个数
调度
内存的局部性
算法设计
scala
部分
1.类的定义(就他的参数而言)和类的构造方法是同一个东西,
scala
中也有辅助函数
2.类默认是公开的,所以没有必要加上public
关键字的
3.方法的返回值是通过类型推断确定的,但要在定义方法的def从句中用等号告诉编译器做类型推断
4.scala
不像java
有原始类型,数字也是对象
5.关键字object
告诉scala
这是一个单利类
6.scala
用方括号来表示泛型,所以类型参数的表示方法是Array[String]
而不是String[]
7.Array
是纯正的泛型
8.集合类型必须指明泛型(不能像java
那样声明raw type like: List list = new ArrayList
)
9.单个case
不会像java
中那样进入下一个case
,所以不需要break
10.数组的访问用圆括号,例如args(0)
11.类型推断有两个例外(1):方法声明中的参数类型(2):递归函数,scala
编译器不能推断递归函数的返回类型
12.scala
中没有static
关键字,必须放在obejct
半生对象中
13.scala
中局部函数
,定义在函数内部的函数...不想暴露细节给外部...
14.Any
的子类AnyVal
和AnyRef
,AnyVal
的子类Unit
Boolean
Fload
Long
,null
是AnyRef
的所有子类,Nothing
是所有(AnyVal和AnyRef
)的子类
15.scala
类必须有个主构造方法来定义该类的所需的参数,辅助构造函数只提供一个默认参数
16.如果类里面的方法没有括号
,调用时也没有括号
17.伴生对象在相关类那里有特权,既可以访问私有函数和私有构造函数
18.在创建新的case
类实例时,关键字new
可以省略,实际上case
类的底层实现上是一个创建新实例的工厂方法
19.scala
默认是不可变集合,但也有可变集合