zoukankan      html  css  js  c++  java
  • # 20145334赵文豪 《Java程序设计》第6周学习总结

    20145334赵文豪 《Java程序设计》第6周学习总结

    教材学习内容总结

    第十章 输入/输出

    数据流

    I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出。
    Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象.如果要将数据从来源取出,可以使用输入传流,如果要将数据写入目的地,可以使用输出串流。
    在java中,输入串流代表对象为java.io.InputStream实例,输出串流代表对象为java.io.OutStream实例。
    InputStream与OutputStream
    InputStream不关心数据源来自何种设备(键盘,文件,网络);
    OutputStream不关心数据的目的是何种设备(键盘,文件,网络)

    提供串流基本操作,如果想要为输入/输出的数据做加工处理,则可以使用打包器类。

    子类一: FileInputStream,FileOutputStream。适用于文件的创建和读写。这两个子类在不使用时都要用close()关闭文档。

    子类二:ByteArryInputStream,ByteArryOutputStream。指定byte数组创建实例,一旦创建就可将byte数组当做数据源进行读写。

    Reader与Writer
    字符数据的读取:java.io.Reader类,其抽象化了字符数据读入的来源;字符数据的写入:java.io.Writer类。其抽象化了数据写出的目的地。
    第十一章 线程与并行API线程
    线程
    单线程:
    启动的程序从main()程序进入点开始至结束只有一个流程。

    多线程:要设计程序可以拥有多个程序。即在main以外独立设计流程。

    实现多线程
    撰写类操作**java.lang.Runnable接口。操作进入点:run();
    创建Thread实例来执行Runnable实例定义的run()方法,启动线程执行指定的线程,调用Thread实例的start()方法。
    继承Thread类。
    并行API
    使用Thread建立多线程程序,必须亲自处理synchornized、对象锁定、wait()、notify()、notifyAll()等细节,如果需要的是线程池、读写解锁高等级操作,从JDK5之后提供了java.util.concurrent,可基于其中的API建立更稳固的并行应用程序。
    并行API可以分为以下几个类.
    1.Lock、ReadWriter与Condition
    2.使用Executor
    3.并行Collection

    Lock、ReadWriteLock
    lock接口主要操作类之一为ReentrantLock,可以达到synchronized的作用。

    ReadWriteLock接口定义了读取锁定与写入锁定行为,可以使用readLock()、writeLock()方法返回Lock操作对象。
    StampedLock类可支持了乐观读取操作。也就是若读取线程很多,写入线程很少的情况下,你可以乐观地认为,写入与读取同时发生的机会很少,因此不悲观的使用哇暖的读取锁定,程序可以查看数据读取之后,是否遭到写入线程的变更,再采取后续的措施。

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

    DataInputStream与DataOutputStrea用来装饰InputStream、OutputStream、DataInputStream、DataOutputStream 提供读取、写入 java 基本数据类型的方法,像是s读写int double boolean 等的方法。这些方法会自动在指定的类型与字节间转换。
    代码如下:

    package cc.openhome;
    
    import java.io.*;
    
    public class Member {
        private String number;
      
      private String name;
        private int age;
    
        public Member(String number, String name, int age) {
            this.number = number;
            this.name = name;
            this.age = age;
        }
    
        public String getNumber() {
            return number;
        }
    
        public void setNumber(String number) {
            this.number = number;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        
        @Override
        public String toString() {
            return String.format("(%s, %s, %d)", number, name, age);
        }
        
        public void save() throws IOException {
            try(DataOutputStream output = 
                    new DataOutputStream(new FileOutputStream(number))) {
                output.writeUTF(number);
                output.writeUTF(name);
                output.writeInt(age);
            } 
        }
        
        public static Member load(String number) throws IOException {
            Member member;
            try(DataInputStream input = 
                    new DataInputStream(new FileInputStream(number))) {
                member = new Member(
                        input.readUTF(), input.readUTF(), input.readInt());
            } 
            return member;
        }
    }
    

    代码调试中的问题和解决过程

    ObjectInputStream 提供 readObject() 方法将数据读入为对象,ObjectOutputStream 提供 writeObject() 方法将对象写至目的地。
    代码如下:

    package cc.openhome;
    
    import java.io.*;
    
    public class Member2 implements Serializable {
        private String number;
        private String name;
        private int age;
    
        public Member2(String number, String name, int age) {
            this.number = number;
            this.name = name;
            this.age = age;
        }
    
        public String getNumber() {
            return number;
        }
    
        public void setNumber(String number) {
            this.number = number;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        
        @Override
        public String toString() {
            return String.format("(%s, %s, %d)", number, name, age);
        }
        
        public void save() throws IOException {
            try(ObjectOutputStream output = 
                    new ObjectOutputStream(new FileOutputStream(number))) {
                output.writeObject(this);
            } 
        }
        
        public static Member2 load(String number) 
                        throws IOException, ClassNotFoundException {
            Member2 member;
            try(ObjectInputStream input = 
                    new ObjectInputStream(new FileInputStream(number))) {
                member = (Member2) input.readObject(); 
            } 
            return member;
        }
    }
    

    本周代码托管截图

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

    本周只是粗略的看了看书,照着课本敲了几段代码,上传到了上面,我会在后面的学习中努力跟上大家的步伐,娄老师辛苦了

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 3000行 20篇 300小时
    第一周 200/200 2/2 20/20
    第二周 300/500 2/4 18/38
    第三周 500/600 1/2 22/60
    第四周 300/700 1/2 30/50

    第五周 100/800 1/3 2/60

    参考资料

  • 相关阅读:
    54-Spiral Matrix
    查找、排序算法
    Java中Timer的使用
    2017/5/8总结 js数组及json(对象数组)操作
    asp.net 中文件上传的两种方式
    2017/4/24combox 使用
    2017/4/24 静态页,评论,购物车总结
    2017/4/23星期日 总结
    2017.4.16关于在线图书商城注册界面总结
    c#中的委托和事件
  • 原文地址:https://www.cnblogs.com/bestizwh/p/5404031.html
Copyright © 2011-2022 走看看