• 20145211 《Java程序设计》第8周学习总结——自在飞花轻似梦


    教材学习内容总结

    认识NIO

    • Java NIO(New Input/Output)——新的输入/输出API包——是2002年引入到J2SE 1.4里的。Java NIO的目标是提高Java平台上的I/O密集型任务的性能。过了十年,很多Java开发者还是不知道怎么充分利用NIO,更少的人知道在Java SE 7里引入了更新的输入/输出 API(NIO.2)。NIO和NIO.2对于Java平台最大的贡献是提高了Java应用开发中的一个核心组件的性能:输入/输出处理。不过这两个包都不是很好用,并且它们也不是适用于所有的场景。如果能够正确地使用的话,Java NIO和NIO.2可以大大减少一些常用I/O操作所花的时间。这就是NIO和NIO.2所具有的超能力.

    Channel 和 Buffer

    • 基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。如图所示:

    • JAVA NIO中的Channel实现

      1. FileChannel
      2. DatagramChannel
      3. SocketChannel
      4. ServerSocketChannel
        这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。
        通过使用FileChannel可以从文件读或者向文件写入数据;通过SocketChannel,以TCP来向网络连接的两端读写数据;通过ServerSocketChanel能够监听客户端发起的TCP连接,并为每个TCP连接创建一个新的```SocketChannel``来进行数据读写;通过DatagramChannel,以UDP协议来向网络连接的两端读写数据。

    • Java NIO的Buffer实现
      1. ByteBuffer
      2. CharBuffer
      3. DoubleBuffer
      4. FloatBuffer
      5. IntBuffer
      6. LongBuffer
      7. ShortBuffer

    API

    • 日志
        Java诞生后不久log4j就发布了,并且得到了广大程序员的支持,但SUN死活不肯接受log4j 非要自己搞个log框架,自JDK 1.4发布java.util.logging日志包一来直到现在Java 1.7,许多开发者依然使用log4j或者通用的日志工具,而不是使用JDK logger。
        JSR-047(Logging API Specification)
        还有一些正在起草当中的JSR:
        
    	JSR 317: Java Persistence 2.0(替代Hibernate)
      JSR 107: JCACHE - Java Temporary Caching API(替代EhCache)
      JSR 353: JavaTM API for JSON Processing (阿里的温绍锦是该JSR的专家组成员)
      ```
      Java的规范是有名的多而且复杂,有兴趣大家可以看看http://jcp.org/en/jsr/all,目前都排到JSR 362了。
    - 资源释放
     在发生异常时,如果想释放资源,我们不得不先做空判断,然后再关闭,而关闭的时候还有可能继续发生异常:
    
    

    Reader in = null;

    try {  
        in = new BufferedReader(new FileReader("文件名"));  
      
          
    } catch (IOException e) {  
      
    } finally {  
        if (in != null) {  
            try {  
                in.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
    
    
    
    private static void customBufferStreamCopy(File source, File target) {  
        try (InputStream fis = new FileInputStream(source);  
            OutputStream fos = new FileOutputStream(target)){  
             
            byte[] buf = new byte[8192];  
      
            int i;  
            while ((i = fis.read(buf)) != -1) {  
                fos.write(buf, 0, i);  
            }  
        }  
        catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
    
    - 精度计算 
    Java做大数操作需要用到java.math.BigDecimal和java.text.DecimalFormat。float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。
      由于Java没有运算符重载的支持,简单的乘法也不得不写成以下这个样子:
    
    
    BigDecimal num1 = new BigDecimal("123456.789");  
    BigDecimal num2 = new BigDecimal("111.111");  
    BigDecimal result = num1.multiply(num2);  
    

      Java中long的最大值是2的63次方减1,如果你想定义一个

    超过int上限的long;```long a = 9223372036854775807; // NG [The literal 9223372036854775807 of type int is out of range]``` 可以加个“L”:```long a = 9223372036854775807L; // OK  ```
      同样的有long-L、double-d、float-f。
    - 字符串处理
      字符串处理应该是程序中使用最频繁的了,但Java提供的String方法太过于局限,虽然有StringTokenizer但是使用太复杂,所以往往我们不得不使用Commons Lang的StringUtils或者去写自己的StringUtils。
      ```java.lang.String / java.util.StringTokenizer```
      ```java.lang.StringBuffer / java.lang.StringBuilder```
    - 基本类型和包装类
      int/Integer、double/Double等共存,代码中不得不充斥着各种各样的Integer.parseInt()、Integer.valueOf()。而Java5.0开始提供基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing) ,但对于我们经常处理的比如NOT NULL限制的DB字段,很容易发生NullPointerException。
      而Map、List、Set集合类中又无法使用基本型,不得不再导入比如:Trove、Google Guava等lib。
    - 一些易错的API
      比如:  File.mkdir()方法  String.equals()方法  以对象为Key的Map  ......
      当然,任何语言都不会是完美的,编程语言也都在不断的进化当中。Java中也还有很多相当优秀的API,比如,Doug Lea大师的java.util.concurrent包,就是功能齐全,性能卓越,优秀完美的并发库。互联网进入大数据处理时代,更加突显这个并发库的重要性。
    ##教材学习中的问题和解决过程
    - 这是一段测试代码
    
    

    package NIO;
    import java.util.logging.*;

    public class Trd {
    public static void main(String[] args) {
    Logger log = Logger.getLogger("lavasoft" );
    log.setLevel(Level.INFO);
    Logger log1 = Logger.getLogger("lavasoft" );
    System.out.println(log==log1);
    Logger log2 = Logger.getLogger("lavasoft.blog" );
    log2.setLevel(Level.WARNING);

        log.info("HaHa" );
        log2.info("nihao" );
        log2.fine("GG" );
    }
    

    }

    ![](http://images2015.cnblogs.com/blog/885886/201604/885886-20160424195904491-639429873.png)
    
    
    
    ##代码调试中的问题和解决过程
    我尝试创建了一个20M的文件example_memory_mapped_file.txt,并且用字符A对它进行填充,然后读取前30个字节。在实际的应用中,内存映射不仅仅擅长提高I/O的原始速度,同时它也允许多个不同的reader和writer同时处理同一个文件镜像。
    ![](http://images2015.cnblogs.com/blog/885886/201604/885886-20160424195936070-747654236.png)
    
    
    
    ## 其他(感悟、思考等,可选)
      时光荏苒,于是再也不能拂去她的痕迹。昨日之事不可留,“十大”已去,喧嚣浮躁的心也该沉静。
      有道是,“自在飞花轻似梦,无边丝雨细如愁。”学习有时候会有点愁苦,不过更多的时候,还是想做一只蝴蝶,围绕着空中飞舞的花瓣尽情陶醉。
      或许还没有掌握学习java的最好途径,但我已在这条路上砥砺前行!
    ## 学习进度条
    
    |            | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|重要成长|
    | --------   | :----------------:|:----------------:|:---------------:  |:-----:|
    | 目标        | 5000行            |   30篇           | 400小时            |       |
    | 第一周      | 100/100           |   2/2            | 15/15             |    学会搭建Java环境,学会写一些简单程序,掌握一些小技巧   |
    | 第二周      | 100/200           |   2/4            | 22/37             |   学会使用IDEA    |
    | 第三周      | 400/650          |   1/5            | 24/61             |     深入了解面向对象  |
    | 第四周      | 750/1450          |   1/6            | 30/91             |    理解继承、多态、接口   |
    | 第五周      | 750/2200          |   2/10            | 30/120             |    接触异常处理与Map   |
    | 第六周      | 400/2600          |   2/12            | 30/150             |    感悟输入输出流与线程   |
    | 第七周      | 600/3200         |   1/13            | 16/176             |    掌握日期和时间的运用   |
    | 第八周      | 700/3900         |   1/14            | 16/192             |    逐步了解API  |
    【附1】本周学习的代码已经成功托管,截图如下:
    ![](http://images2015.cnblogs.com/blog/885886/201604/885886-20160424203008476-1795165696.png)
    
    ![](http://images2015.cnblogs.com/blog/885886/201604/885886-20160424203015945-1177911917.png)
    【附2】利用wc统计代码行数,截图如下:
    ![](http://images2015.cnblogs.com/blog/885886/201604/885886-20160424203728132-1424876378.png)
    
    ![](http://images2015.cnblogs.com/blog/885886/201604/885886-20160424203739070-111346831.png)
    
    
    ## 参考资料
    -  [Java学习笔记(第8版)](http://book.douban.com/subject/26371167/) 
    -  [《Java学习笔记(第8版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)
    -  ...![](http://images2015.cnblogs.com/blog/885886/201604/885886-20160424203021273-1613649240.png)
  • 相关阅读:
    2018常用网站 图片处理
    iOS判断当前时间是否处于某个时间段内
    iOS 页面跳转和返回,持续编写
    模板引擎-freemarker
    HibernateTemplate使用注意点
    hibernate-注解及配置
    hibernate 异常
    javaEncode
    eclipse 创建注释模板
    eclipse 和 javaClass
  • 原文地址:https://www.cnblogs.com/nostalgia-/p/5422764.html
Copyright © 2020-2023  润新知