《Java核心技术卷2·高级特性》

书名

《Java核心技术卷2 高级特性》(原书第10版)

基本信息

  1. 作者:霍斯特曼
  2. 出版社:机械工业出版社
  3. 阅读进度:70%

重点摘录

  1. 并行流工作的前提是数据规模较大,否则搭建并行计算的代价就没意义

  2. 字节流的输入输出是InputStream/outPutStream,Unicode的字符流的输入输出是Reader/Writer (Page 42,43)

  3. 所有实现了AutoCloseable的接口都可以使用try-with-resource的语法(但是一定要保证try里的资源都有自己的本地变量而不要使用嵌套资源),由于Closeable也实现了AutoCloseable接口,所以所有实现Closeable的接口可以使用该语法,这两个接口的区别是Closeable的接口是在1.7以前的版本就已经存在,close方法只能够抛出IOException,而AutoCloseable.close可以抛出所有异常

  4. 所有Java.io的类都会将相对路径名解释为已用户工作目录开始,可以通过System.getProperty(“user.dir)获得,System.getProperty(“file.separator”)获得换行符

  5. 英语中用到的所有字符的ASCII字符集中每个字符使用UTF-8编码会将都只会占一个字节

  6. 微软记事本会在UTF-8编码的文本开头加一个字节顺序标记(\uFEFF,这也是Unicode认为的好的做法),但是实际上UTF-8编码不会合UTF-16一样存在低位优先或者高位优先的问题,所以Java读取微软记事本输入的文本可能存在问题,需要自己剥离顺序标记

  7. 不存在任何可靠的方式自动探出字节流中使用的字符编码方式

  8. DataOutpu接口wirteUTF方法输出的字符串编码和标准UTF-8编码会有点不一致,它是首先用UTF-16表示字节,然后用UTF-8编码,这种修订的编码会在处理编码大于0xFFFF时有所不同,所以如果使用Java虚拟机平台输出和读取才可以使用WriteUTF方法,其他场景应使用writeChars

  9. Zip文档通常以压缩格式存储了一个或者多个文件,Zip文档头会包含这些文件的名字和所使用的的压缩方法等信息(ZipInputStream)

  10. 枚举的序列化本身是类型安全的,但是如果自己实现了序列化接口,需要注意的是即使构造方法是私有的,序列化机制也可以创建新的对象并且和原来的任意枚举都不是相同的,所以要自己重写readResolve方法,这个方法的返回值会成为readObject的返回值

  11. 序列化和反序列化可以实现深拷贝

  12. Files是一个强大的工具类,可以创建输入输出流,可以创建、安全删除目录或者文件(包括递归创建),或者创建一个临时目录和文件,还可以实现复制、移动,读取文件大小等功能

  13. Files.list和Files.walk都可以用来处理文件目录中的项,但是只有后者才会进入目录(https://gitee.com/guitar_coder/netty-learning.git)

  14. Paths类会在默认文件系统中查找路径,默认文件系统是本地磁盘中文件,但是可以自定义一个ZIP文件系统,比如FileSystem fs = FileSystems.newFileSystem(paths.get(zipname), null),然后就可以很便捷对压缩文件里的任务文件进行复制等操作,或者使用Files.walkFileTree进行高级遍历

  15. FileChannel是磁盘文件的一种抽象,方便进行内存映射、文件加锁机制以及文件间快速数据传递等操作系统特性

  16. 通过FileChannel实例的lock方法可以获得文件锁(可以指定锁定范围,或者Long.MAX_VALUE锁定所有字节),通过share标志来区分是读写锁还是共享锁,共享锁的作用是允许多个进程从文件中读入,独占锁的目的是用于读写

  17. 文件锁依赖操作系统,某些文件系统中文件加锁仅仅是建议性的,如果一个应用无法获得锁,它仍旧可以向被另一个应用并发锁定的文件执行写操作,并且关闭一个通道会释放由Java虚拟机持有的底层文件上的所有锁,所以应该尽量避免在同一个锁定文件上使用多个通道

  18. Java库提供了两类XML解析器((https://gitee.com/guitar_coder/netty-learning.git)com.joy.xml):

    1. DOM 文档对象模型,能够将读入的XML文档转换成树结构 ,大文件时内存消耗高
    2. SAX 流机制解析器,读入文档时生成对应事件,然后需要自己处理和存储数据,DOM解析器就是在SAX流解析器的基础上,在生成事件时构建DOM对象
    3. StAX 在6中出现的现代解析器,采用pull机制生成事件可以进行方便的遍历
  19. URI和URL的区别在于URI类只可以用于解析(比如相对化和绝对化),而URL类作为URI的一个子集标识Java能够处理的资源,所以它能够打开一个输入流InputStream

  20. JDBC中ResultSet的type值和concurrency值:

    1. TYPE_FORWARD_ONLY 默认,不可滚动
    2. TYPE_SCROLL_INSENSITIVE 结果集可以滚动,对数据库变化不敏感
    3. TYPE_SCROLL_SENSITIVE 结果集可以滚动,对数据库变化敏感
    4. CONCUR_READ_ONLY 默认,结果集不能用于更新数据库
    5. CONCUR_UPDATABLE 结果集可以用于更新数据库
  21. Java中Instant表示时间线上的某个点,Date.from(instant),Date.toInstant()

  22. 注解是由编译器计算过来的,所以所有元素值必须是编译期常量

  23. Target:注解可以作用的范围;Retention:注解可以保留多久;Documented:注解应该包含在注解项的文档中;Inherited:指明当这个注解应用于一个类时,该类的子类能继承该注解;Repeatable:指明这个注解可以在同一个项上应用多次

  24. 如果不做特殊操作 ,那么所有线程都会将他们的上下文类加载器设置为系统类加载器,如果需要编写一个按名字来加载类的方法,那么让调用者在传递显式的类加载器或者使用上下文类加载器,不要直接使用该方法所属类的类加载器

  25. javac+javah是生成本地方法的好搭档

    1. 在java类中声明一个本地方法
    2. 运行javah获得包含该方法的C声明的头文件
    3. 用C实现该方法
    4. 将代码置于共享类库中
    5. 在Java程序中加载该类库(System.loadLibrary)
  26. C语言没有提供异常防护,所以必须使用Throw或者ThrowNew函数创建一个新的异常对象进行发布,然后使用return退出虚拟机

坚持原创、技术分享。请作者喝杯茶吧!