1. 程式人生 > >201521123088《Java程序設計》第12周學習總結

201521123088《Java程序設計》第12周學習總結

正則 ted 底層 文本文 throw filename ise 網頁 編程

1. 本周學習總結

1.1 以你喜歡的方式(思維導圖或其他)歸納總結多流與文件相關內容。
技術分享


2. 書面作業

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

1. 字符流與文本文件:使用 PrintWriter(寫),BufferedReader(讀)
1.1 生成的三個學生對象,使用PrintWriter的println方法寫入student.txt,每行一個學生,學生的每個屬性之間用|作為分隔。使用Scanner或者BufferedReader將student.txt的數據讀出。(截圖關鍵代碼,出現學號)

//201521123088
Student類:
         public void writeData(PrintWriter out)
       {
          out.println(id + "|" + name + "|" + age + "|" + grade );
       }

     public void readData(Scanner in)
     {
          String line = in.nextLine();
          String[] tokens = line.split("\\|");
          id 
=Integer.parseInt(tokens[0]); name =tokens[1]; age = Integer.parseInt(tokens[2]); grade = Double.parseDouble(tokens[3]); } Main函數: try { // save all employee records to the file employee.txt PrintWriter out = new PrintWriter("student.txt"); writeData(stu, out); out.close();
// retrieve all records into a new array Scanner in = new Scanner(new FileReader("student.txt")); Student[] newStaff = readData(in); in.close(); for (Student e : newStaff) System.out.println(e); } catch (IOException exception) { exception.printStackTrace(); } } private static void writeData(Student[] students, PrintWriter out) throws IOException { out.println(students.length); for (Student e : students) e.writeData(out); } private static Student[] readData(Scanner in) { int n = in.nextInt(); in.nextLine(); Student[] students = new Student[n]; for (int i = 0; i < n; i++) { students[i] = new Student(); students[i].readData(in); } return students; }

技術分享

1.2 生成文件大小多少?分析該文件大小
技術分享

生成文件大小為51字節。

1.3 如果調用PrintWriter的println方法,但在後面不close。文件大小是多少?為什麽?
技術分享

  分析:第一行的“3”代表數組的大小,占3個字節;一個id占1個字節,共占3個字節;英文字符串每個字母占1個字節,故共占11個字節;age占2個字節,共6個字節;grade占4個字節,共占12個字節;分隔符有3個,共占3個字節;行末尾共占2個字節。

  • 參考:本題具體要求見流與文件實驗任務書-題目1-2.1
  • 參考代碼:TextFileTest.java

2. 緩沖流
2.1 使用PrintWriter往文件裏寫入1千萬行(隨便什麽內容都行),然後對比使用BufferedReader與使用Scanner從該文件中讀取數據的速度(只讀取,不輸出),使用哪種方法快?請詳細分析原因?提示:可以使用junit4對比運行時間

技術分享

使用BufferedReader更快,因為BufferedReader是將數據先寫到緩沖區,再寫到硬盤,使用緩沖方式可以減少真正的底層I/O操作,效率就比Scanner更高。

2.2 將PrintWriter換成BufferedWriter,觀察寫入文件的速度是否有提升。記錄兩者的運行時間。試分析原因。
技術分享

有提升,因為BufferedWriter也同樣是使用了緩沖方式,減少對底層的I/O操作,提高了效率。

  • 參考:本題具體要求見流與文件實驗任務書-題目1-2.2到2.3
  • 參考代碼:BufferedReaderTest.java
  • JUnit4常用註解
  • JUnit4學習

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

技術分享

技術分享

出現亂碼;因為FileReader會按照系統默認的字符集(如GBK)來解碼,但是EncodeTest.txt 文件使用了UTF-8編碼。將UTF-8編碼的字符使用GBK編碼來解析,會出現亂碼情況。

解決方案:
技術分享

技術分享

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

  • 參考:InputStreamReaderTest.java與教學PPT

4. 字節流、二進制文件:DataInputStream, DataOutputStream、ObjectInputStream
4.1 參考DataStream目錄相關代碼,嘗試將三個學生對象的數據寫入文件,然後從文件讀出並顯示。(截圖關鍵代碼,出現學號)

技術分享

技術分享

技術分享

技術分享

4.2 生成的文件有多大?分析該文件大小?將該文件大小和題目1生成的文件對比是大了還是小了,為什麽?66個字節

相比第一題大了,因為使用UTF-8編碼時,漢字所占字節會變大。

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

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

//201521123088
    ObjectOutputStream out =new ObjectOutputStream(new FileOutputStream("student.txt"));
    out.writeObject(student);
    out.close();
    
    ObjectInputStream in =new ObjectInputStream(new FileInputStream("student.txt"));
    Student[] newStudent =(Student[]) in.readObject();
    in.close();
    for(Student e: newStudent)
      System.out.println(e);
  • 參考:本題具體要求見流與文件實驗任務書-題目1-1

5. Scanner基本概念組裝對象
編寫public static List

技術分享

技術分享

使用BufferedReader使文件讀取更高效;因為要讀取UTF-8編碼的文件,所以使用InputStreamReader防止亂碼;使用FileInputStream從文件中讀取。

  • 實驗文件:Students.txt
  • 參考:TextFileTest目錄下TextFileTest.java

6. 選做:RandomAccessFile
6.1 使用RandomAccessFile實現題目1.1。(截圖關鍵代碼,出現學號)

6.2 分析文件大小**


7. 文件操作
編寫一個程序,可以根據指定目錄和文件名,搜索該目錄及子目錄下的所有文件,如果沒有找到指定文件名,則顯示無匹配,否則將所有找到的文件名與文件夾名顯示出來。
7.1 編寫public static void findFile(String path,String filename)函數,以path指定的路徑為根目錄,在其目錄與子目錄下查找所有和filename相同的文件名,一旦找到就馬上輸出到控制臺。(截圖關鍵代碼,出現學號)

技術分享

7.2 加分點:使用隊列、使用圖形界面、使用Java NIO.2完成(任選1)
7.3 選做:實現刪掉指定目錄及其子目錄下的所有空文件夾。

  • 參考代碼:FindDirectories.java
  • 參考:本題具體要求見流與文件實驗任務書-題目2

7.4 選做:將指定目錄及子目錄下的所有.java文件,轉化成UTF-8編碼格式,並測試。

  • 參考資料:判斷文件的編碼格式

8. 正則表達式
8.1 如何判斷一個給定的字符串是否是10進制數字格式?嘗試編程進行驗證。(截圖關鍵代碼,出現學號)

技術分享

8.2 選做:修改HrefMatch.java,嘗試匹配網頁中的數字字符串、匹配網頁中的圖片字符串。

  • 參考:本題具體要求見流與文件實驗任務書-題目3

8.3 選做(較難):進一步改造上面的程序,獲得圖片的鏈接,如IMG src="images/mail1.gif",然後經過處理,生成該圖片的實際鏈接地址http://cec.jmu.edu.com/images/mail1.gif。最後將生成的若幹地址,放入一個隊列。編寫方法,可以依照該隊列的所有圖片地址,一次將圖片下載下來。

  • 正則表達式參考文章

3. 碼雲及PTA

3.1. 碼雲代碼提交記錄

在碼雲的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然後搜索並截圖

4.選做:課外閱讀

4.1 嘗試翻譯Lesson: Basic I/O中的Summary
4.2 嘗試完成Questions and Exercise
4.3 字符集與編碼
4.4 Java正則表達式的語法與示例

201521123088《Java程序設計》第12周學習總結