201621123061《Java課程設計》第12次學習總結

1. 本週學習總結

1.1 以你喜歡的方式(思惟導圖或其餘)概括總結多流與文件相關內容。javascript

  • 底層具體讀寫操做使用字節流。
  • 若是不關閉一個s輸出流,數據可能會丟失,常常使用flush()來強制寫出緩衝區的字符。
  • 與輸入有關的類都應該從InputStream繼承,與輸出有關的類都應該從OutputSteam繼承。

2. 面向系統綜合設計-圖書館管理系統或購物車

使用流與文件改造你的圖書館管理系統或購物車。java

2.1 簡述如何使用流與文件改造你的系統。文件中數據的格式如何?

  • 將書籍導入該圖書管理系統用了File類,建立新文件以寫入存儲書籍信息,用InputSteam的子類FileInputSteam,將書籍數據寫入file文件中,再用ObjectOutputStream打包,再用writeObject()方法將書籍數據寫入到系統中。將書籍從該圖書管理系統讀出也是用了File類,讀取文件後,並封裝成實例返回。借書系統中,借了書籍後,書籍的信息仍要寫入文件,還書也是要再寫入文件。
  • 由於是集美大學這個學生羣裏在用這個系統,全部還要導入學生讀者的信息,操做如導入書籍。
  • 數據的格式:主要是採用了字節流FileInputStream,再用ObjectInputStream打包。正則表達式

    2.2 簡述系統中文件讀寫部分使用了流與文件相關的什麼接口與類?爲何要用這些接口與類?

  • 接口: Serializable。緣由:ObjectOutputStream提供readObject()writeObject()來把數據讀入對象和將對象寫到目的地,能夠被這兩種方法處理的對象,必須操做java.io.Serializable接口。
  • 類:FileFileOutputStreamObjectOutputStream緣由:File用來建立新文件名和實例化一個文件,而fos = new FileOutputStream(file);//把數據寫入到file文件中 oos = new ObjectOutputStream(fos);//打包file編程

    2.3 截圖讀寫文件相關代碼。關鍵行須要加註釋。

public void writeToFile()//把數據寫入文件中
    {
        try {
        file = new File("Books_info.obj");//建立新文件名爲Books_info.obj
        file.delete();
        file.createNewFile();
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        fos = new FileOutputStream(file);//把數據寫入到file文件中
        oos = new ObjectOutputStream(fos);//打包file
        oos.writeObject(allBooks);//寫入allBooks裏
        oos.flush();//
        oos.close();
        } catch(Exception e)
        {
            System.out.println(e);
        }
    }
    @SuppressWarnings("unchecked")
    public void readFromFile()//把數據從文件中讀出來
    {
        try {
        file = new File("Books_info.obj");
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        fis = new FileInputStream(file);
        ois = new ObjectInputStream(fis);
        allBooks.clear();
        allBooks = (HashMap<Integer,Book>) ois.readObject();
        ois.close();
        } catch(Exception e)
        {
            System.out.println(e);
        }
    }
public void writeToFile()//把讀者寫進文件
    {
        try {
        file = new File("Readers_info.obj");
        file.delete();
        file.createNewFile();
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        fos = new FileOutputStream(file);
        oos = new ObjectOutputStream(fos);
        oos.writeObject(allReaders);
        oos.flush();
        oos.close();
        } catch(Exception e)
        {
            System.out.println(e);
        }
    }
    @SuppressWarnings("unchecked")
    public void readFromFile()//從文件中讀出全部讀者
    {
        try {
        file = new File("Readers_info.obj");
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        fis = new FileInputStream(file);
        ois = new ObjectInputStream(fis);
        allReaders.clear();
        allReaders = (Map<String, Reader>) ois.readObject();
        ois.close();
        } catch(Exception e)
        {
            System.out.println(e);
        }
    }
public void borrowBookSystem(Book book)//借書系統
    {
        if(allBooks.containsKey(book.getId()))
        {
            Book temp = allBooks.get(book.getId());
            temp.setNum(temp.getNum() - 1);
            allBooks.replace(book.getId(), temp);
            writeToFile();
        }
    }
    public void returnBookSystem(Book book)//還書系統
    {
        book.setNum(book.getNum() + 1);
        allBooks.replace(book.getId(), book);
        writeToFile();
    }
    public boolean addBook(Book book)//添加書
    {
        if(!allBooks.containsKey(book.getId()))
        {
            allBooks.put(book.getId(), book);
            writeToFile();//寫入文件
            return true;
        }
        else
            return false;
    }

3. 代碼量統計

3.1 統計本週完成的代碼量

須要將每週的代碼統計狀況融合到一張表中。
編輯器

周次 行數 新增行數 文件數 新增文件數
1 91 91 5 5
2 504 413 18 13
3 1092 588 28 10
5 1158 129 34 6
6 1539 381 40 6
7 2023 484 49 9
8 2477 454 57 8
9 2709 232 63 6
10 3156 447 70 7
11 3531 375 79 9
12 4083 552 91 12
13 4850 106 15

選作:4. 流與文件學習指導(底下的做業內容所有都是選作)

1. 字符流與文本文件:使用 PrintWriter(寫),BufferedReader(讀)

將Student對象(屬性:int id, String name,int age,double grade)寫入文件student.data、從文件讀出顯示。函數

1.1 生成的三個學生對象,使用PrintWriter的println方法寫入student.txt,每行一個學生,學生的每一個屬性之間用|做爲分隔。使用Scanner或者BufferedReader將student.txt的數據讀出。(截圖關鍵代碼,出現學號)

1.2 生成文件大小多少(使用右鍵文件屬性查看)?分析該文件大小

  • 48字節
  • 分析:在每行中,id爲1字節,name爲4字節,age爲2字節,grade爲4字節,三個分隔符爲3字節,最後加上換行符2字節,因此一行一共16字節,三行則爲48字節。學習

    1.3 若是調用PrintWriter的println方法,但在後面不close。文件大小是多少?爲何?

  • 大小爲0字節。
  • printWrite是將數據寫在緩衝區裏,沒有close()就會致使數據在緩衝區裏丟失。則找不到數據了。
    參考:本題具體要求見流與文件實驗任務書-題目1-2.1
    參考代碼:TextFileTest.java測試

2. 緩衝流

2.1 使用PrintWriter往文件裏寫入1千萬行(隨便什麼內容都行),而後對比使用BufferedReader與使用Scanner從該文件中讀取數據的速度(只讀取,不輸出),使用哪一種方法快?截取測試源代碼,出現學號。請詳細分析緣由?提示:可使用junit4對比運行時間

  • 使用BufferedReader讀取數據速度快!緣由是Scanner每次讀取數據都是從文件中開始讀取,也就是直接從底層os處理,效率低;但BufferedReader是先訪問緩衝區,只有緩衝區空的時候才進行底層操做。

2.2 將PrintWriter換成BufferedWriter,觀察寫入文件的速度是否有提高。記錄二者的運行時間。試分析緣由。

  • 速度會提高。由於數據先寫到緩衝區,再轉到文件中。

3. 字符編碼

3.1 現有EncodeTest.txt 文件,該文件使用UTF-8編碼。使用FileReader與BufferedReader將EncodeTest.txt的文本讀入並輸出。是否有亂碼?爲何會有亂碼?如何解決?(截圖關鍵代碼,出現學號)

  • 會出現亂碼。
  • FileReader按照系統默認的字符集來解碼,但該.txt文件卻使用UTF-8來編碼。
  • 解決方法:

3.2 編寫一個方法convertGBK2UTF8(String src, String dst),能夠將以GBK編碼的源文件src轉換成以UTF8編碼的目的文件dst。

參考:InputStreamReaderTest.java與教學PPTthis

4. 字節流、二進制文件:DataInputStream, DataOutputStream、ObjectInputStream

4.1 參考DataStream目錄相關代碼,嘗試將三個學生對象的數據寫入文件,而後從文件讀出並顯示。(截圖關鍵代碼,出現學號)

\\陳錦霞201621123061
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//4.1 參考DataStream目錄相關代碼,嘗試將三個學生對象的數據寫入文件,而後從文件讀出並顯示
public class Student1 {
    private int id;
    private String name;
    private int age;
    private double grade;
    
    public Student1(){
        
    }
    public Student1(int id, String name, int age, double grade) {
        this.id = id;
        this.setName(name);
        this.setAge(age);
        this.setGrade(grade);
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        if (name.length()>10){
            throw new IllegalArgumentException("name's length should <=10 "+name.length());
        }
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        if (age<=0){
            throw new IllegalArgumentException("age should >0 "+age);
        }
        this.age = age;
    }
    public double getGrade() {
        return grade;
    }
    public void setGrade(double grade) {
        if (grade<0 || grade >100){
            throw new IllegalArgumentException("grade should be in [0,100] "+grade);
        }
        this.grade = grade;
    }
    
    public static void main(String[] args) throws IOException{
    FileOutputStream fos=new FileOutputStream(new File("Student.txt"));//寫入文件
    DataOutputStream dos=new DataOutputStream(fos);
    Student[] stu=new Student[3];
    stu[0]=new Student(1,"張三",19,65.0);
    stu[1]=new Student(1,"李四",19,75.0);
    stu[2]=new Student(1,"王五",20,85.0);
    try{
        for(int i=0;i<3;i++){
            dos.writeInt(stu[i].id);
            dos.writeUTF(stu[i].name);
            dos.writeInt(stu[i].age);
            dos.writeDouble(stu[i].grade);
        }
    }finally{
        dos.close();
    }
    
    FileInputStream fis=new FileInputStream("Student.txt");//從文件輸出
    DataInputStream dis=new DataInputStream(fis);
    try{
        for(int i=0;i<3;i++){
            System.out.println("id:"+dis.readInt() );
            System.out.println("name:"+dis.readUTF() );
            System.out.println("age:"+dis.readInt() );
            System.out.println("grade:"+dis.readDouble() );
        }
    }finally{
        dis.close();
    }
}}

4.2 生成的文件有多大?分析該文件大小?將該文件大小和題目1生成的文件對比是大了仍是小了,爲何?

  • 如圖,72字節。
  • 一個int爲4字節,一個double爲8字節,一個漢字2字節,一個英文字符爲2字節。則一共(4+4+4+4+8)3=72字節。
  • 變大了
  • 由於編碼方式不一樣。編碼

    4.3 使用wxMEdit的16進制模式(或者其餘文本編輯器的16進制模式)打開student.data,分析數據在文件中是如何存儲的。

    4.4 使用ObjectInputStream(讀), ObjectOutputStream(寫)讀寫學生。(截圖關鍵代碼,出現學號) //參考ObjectStreamTest目錄

5. Scanner基本概念組裝對象

編寫public static List readStudents(String fileName)從fileName指定的文本文件中讀取全部學生,並將其放入到一個List中。應該使用那些IO相關的類?說說你的選擇理由。

7. 文件操做

編寫一個程序,能夠根據指定目錄和文件名,搜索該目錄及子目錄下的全部文件,若是沒有找到指定文件名,則顯示無匹配,不然將全部找到的文件名與文件夾名顯示出來。

7.1 編寫public static void findFile(String path,String filename)函數,以path指定的路徑爲根目錄,使用遞歸方式,在其目錄與子目錄下查找全部和filename相同的文件名,一旦找到就立刻輸出到控制檯。(截圖關鍵代碼,出現學號)

7.2 使用隊列、使用圖形界面、使用Java NIO.2完成(任選1)

8. 正則表達式

8.1 使用正則表達式判斷給定的字符串是不是10進制數字格式?嘗試編程進行驗證,要給測試數據集及運行結果(能夠轉化爲PTA)。(截圖關鍵代碼,出現學號)

相關文章
相關標籤/搜索