20145223 《Java程序设计》第6周学习总结

教材学习内容总结

·Java中将数据从来源取出或是将数据写入目的地,使用输入、输出串流,其分别的代表对象为java.io.InputStream实例和java.io.OutputStream实例

·在不使用InputStream或者OutputStream实例的时候必须使用close()方法关闭串流。

  1. FileInputStream fileInputStream =
  2. new FileInputStream(new File(args[0]));
  3. FileOutputStream fileOutputStream =
  4. new FileOutputStream(new File(args[1]));

  5. fileInputStream.close();
  6. fileOutputStream.close();
  7. while(true) {
  8. if(fileInputStream.available() < 1024) {
  9. //剩余的资料比1024字节少
  10. //一位一位读出再写入目标文件
  11. int remain = -1;
  12. while((remain = fileInputStream.read())
  13. != -1) {
  14. fileOutputStream.write(remain);
  15. }
  16. break;
  17. }
  18. else {
  19. //从来源档案读取数据至缓冲区
  20. fileInputStream.read(buffer);
  21. //将数组数据写入目标文件
  22. fileOutputStream.write(buffer);
  23. }
  24. }

·FileInputStream是InputStream的子类,可指定文件名创建实例,文档创建后就可以直接读取数据。FileOutputStream是OutputStream的子类,同样可指定文件名创建实例读取数据。但是以上两者在不使用的时候也同样需要使用close()方法关闭文档。

·File实例用作一个档案或目录的抽象表示

  1. File file = new File(args[0]);
  2. if(file.isFile()) { //是否为档案
  3. System.out.println(args[0] + "檔案");
  4. System.out.print(
  5. file.canRead() ?"可读" :"不可读");
  6. System.out.print(
  7. file.canWrite() ?"可写" :"不可写");
  8. System.out.println(
  9. file.length() +"位組");
  10. }
  11. else {
  12. //列出所有的档案及目录
  13. File[] files = file.listFiles();
  14. ArrayList<File> fileList =
  15. new ArrayList<File>();
  16. for(int i = 0; i < files.length; i++) {
  17. //先列出目录
  18. if(files[i].isDirectory()) {//是否为目录
  19. //取得路径名
  20. System.out.println("[" +
  21. files[i].getPath() + "]");
  22. }
  23. else {
  24. //档案先存入fileList,待会再列出
  25. fileList.add(files[i]);
  26. }
  27. }
  28. //列出档案
  29. for(File f: fileList) {
  30. System.out.println(f.toString());
  31. }
  32. System.out.println();
  33. }

·ByteArrayStream是InputStream的子类,可指定byte数组创建实例,创建后可将byte数组当做数据源进行数据的读取。(与此类似的还有OutputStream的子类ByteArrayOutStream)

·InputStream、OutS太热门提供串流基本操作。想要为输入或者输出的数据进行打包处理,可以使用打包器类。

·FileReader、FileWriter可以对文档做读写和写入,同时默认使用操作系统默认的编码进行编码的转换。

·想要存取的是一个文本文件,可直接使用java.io.FileReader、java.io.FileWriter类别

  1. FileReader fileReader =
  2. new FileReader(args[0]);
  3. FileWriter fileWriter =
  4. new FileWriter(args[0] + ".txt");
  5. int in = 0;
  6. char[] wlnChar = {'\r', '\n'};
  7. while((in = fileReader.read()) != -1) {
  8. if(in == '\n') {
  9. //写入"\r\n"
  10. fileWriter.write(wlnChar);
  11. }
  12. else
  13. fileWriter.write(in);
  14. }
  15. fileReader.close();
  16. fileWriter.close();

·想要目前流程暂停操作时间,可使用java.lang.Thread的静态sleep()方法,指定单位是毫秒,调用这个方法必须处理java.lang.InterruptedException。

·如果您的类别已经要继承某个类别,那么您就不能继承Thread类别

·继承了Thread类别,您就不能再继承其它类别

·实作java.lang.Runnable接口来定义具线程功能的类别

·Runnable接口中定义一个run()方法要实作

·在实例化一个Thread对象时,可以传入一个实作Runnable接口的对象作为自变量

·简单的继承Thread的例子:

  1. public class EraserThreadextends Thread {
  2. private boolean active;
  3. private String mask;

  4. //重新定义run()方法
  5. public void run () {
  6. while(isActive()) {
  7. System.out.print(mask);
  8. try {
  9. //暂停目前的线程50毫秒
  10. Thread.currentThread().sleep(50);
  11. }
  12. catch(InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. }
  18. //启动Eraser线程
  19. EraserThread eraserThread = new EraserThread('#');
  20. eraserThread.start();
  21. String password = scanner.next();
  22. eraserThread.setActive(false);

·Runable

  1. public class EraserimplementsRunnable { //实作Runnable
  2. private boolean active;
  3. private String mask;

  4. //重新定义run()方法
  5. public void run () {
  6. while(isActive()) {
  7. System.out.print(mask);
  8. try {
  9. //暂停目前的线程50毫秒
  10. Thread.currentThread().sleep(50);
  11. }
  12. catch(InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. }
  18. //Eraser实作Runnable界面
  19. Eraser eraser = new Eraser('#');
  20. //启动Eraser线程
  21. Thread eraserThread = new Thread(eraser);
  22. eraserThread.start();
  23. String password = scanner.next();
  24. eraser.setActive(false);

·进入Blocked状态,以下的几个对应情况让线程回到Runnable状态

--输入输出完成

--呼叫interrupt()

--取得对象锁定

--呼叫notify()或notifyAll()

  1. Thread thread = new Thread(new Runnable() {
  2. public void run() {
  3. try {
  4. //暂停99999毫秒
  5. Thread.sleep(99999);
  6. }
  7. catch(InterruptedException e) {
  8. System.out.println("I'm interrupted!!");
  9. }
  10. }
  11. });
  12. thread.start();
  13. thread.interrupt(); // interrupt it right now

·线程完成run()方法,就会进入Dead,进入(或者已经调用过start()方法)的线程,不可以再次调用start()方法,否则会抛出错误。

·如果要停止线程,最好自行操作,让程序走完应有流程,而不是调用syop()方法

·wait()、notify()与notifyAll()是由Object类别所提供的方法

·当物件的wait()方法被调用,目前的线程会被放入对象的等待池中,线程归还对象的锁定

  1. public synchronized void setProduct(int product) {
  2. if(this.product != -1) {
  3. try {
  4. //目前店员没有空间收产品,请稍候!
  5. wait();
  6. }
  7. catch(InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. this.product = product;
  12. System.out.printf("生产者设定(%d)%n", this.product);
  13. //通知等待区中的一个消费者可以继续工作了
  14. notify();
  15. }
  16. public synchronized int getProduct() {
  17. if(this.product == -1) {
  18. try {
  19. //缺货了,请稍候!
  20. wait();
  21. }
  22. catch(InterruptedException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. int p = this.product;
  27. System.out.printf("消费者取走(%d)%n", this.product);
  28. this.product = -1; //取走产品,-1表示目前店员手上无产品
  29. //通知等待区中的一个生产者可以继续工作了
  30. notify();
  31. return p;
  32. }

教材学习中的问题和解决过程

·如果一个对象所持有的数据可以被多线程同时共享存取时,您必须考虑到「数据同步」的问题

·数据同步指的是两份数据整体性、一致性

·在学习的过程中,数据的不同步而可能引发的错误通常不易察觉,可能是在程序执行了几千几万次之后,才会发生错误。网上对于同步化有这样一个说法,这通常会发生在您的产品已经上线之后,甚至是程序已经执行了几年之后。

·所以,在程序一开始进行编译的过程中就要对同步化问题加以重视。

其他(感悟、思考等,可选)

随着往后的学习,我觉得java的内容越来越抽象和难以理解,很多时候你知道是这个一个东西,但是你不一定知道它是用来做什么的,在使用它的过程中应该注意些什么问题,甚至会和其他概念搞混。所以越往后,我觉得我投入java 的时间应该逐渐变多,不然书上的知识就很难完全消化理解了,也没有充足的时间进行动手实践了。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 4000行 20篇 400小时
第一周 200/200 1/1 15/12
第二周 180/380 1/1 18/12
第三周 600/980 1/1 17/16
第四周 400/380 1/1 16/15
第五周 300/680 1/1 14/14
第六周 200/200 2/2 10/10

代码托管截图

参考资料

20145223《Java程序设计》第6周学习总结的更多相关文章

  1. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  2. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  3. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  9. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  10. 《Java程序设计》第二周学习总结

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. 【leetcode】Valid Sudoku (easy)

    题目:就是判断已有的数字是否冲突无效,若无效返回flase 有效返回true 不要求sudo可解 用了char型的数字,并且空格用‘.'来表示的. 思路:只要分别判断横向 竖向 3*3小块中的数字是否 ...

  2. 【mongo】mongo数据转json时特殊类型处理

    mongo数据库中的有些数据类型是无法用json序列化的,比如ObjectId或者datetime.datetime类型. 可以通过json.JSONEncoder来处理 import json im ...

  3. AutoLayout 图解各种约束

  4. 创建INnodb的compress表

    需要将innodb_file_per_table=1 ,innodb_file_format=Barracuda;; 如: Creating a Compressed Table in a Gener ...

  5. 消息队列MQ - Apache ActiveMQ

    Apache ActiveMQ是Apache软件基金会所研发的开放源码消息中间件:由于ActiveMQ是一个纯Jave程式,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行. 1.que ...

  6. GB2312、GBK和UTF-8三种编码以及QT中文显示乱码问题

    1.GB2312.GBK和UTF-8三种编码的简要说明 GB2312.GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码.只是对于我们中国人的应用来说,用这三种编码 比较多.简单的说一下, ...

  7. 数据结构和算法 – 5.模式匹配和文本处理

    了使用正则表达式,需要把 RegEx 类引入程序.大家可以在 System.Text.RegularExpression 名字域中找到这种类.一旦把这种类导入了程序,就需要决定想要用 RegEx 类来 ...

  8. Delphi中的变量作用域简介

    1.在函数或过程中声明的变量是局部变量,只能在函数或过程中使用 2.在单元的implementation部分声明的变量是单元级的(又称模块级.窗体级)变量,该单元的所有函数与过程都能使用,其他引用该单 ...

  9. 学习ASP.NET缓存机制

    缓存是大型BS架构网站的性能优化通用手段,之前知道有这个概念,并且也知道很重要,但是一直没静下心来了解.这次借着学习PetShop源码的机会熟悉一下ASP.NET基本的缓存机制(生产环境中的真实缓存有 ...

  10. PHPCMS 多站点管理切换问题

    打开系统函数库global.func.php 可以看到获取站点ID的函数如下 /** * 获取当前的站点ID */ function get_siteid() { static $siteid; if ...