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

Java 第十一週總結

第十一週的做業。
html

目錄
1.本章學習總結
2.Java Q&A
3.碼雲上代碼提交記錄及PTA實驗總結
4.課後閱讀java


1.本章學習總結

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

  1. File既能表明一個特定文件的名稱,又能表明一個目錄下的一組文件的名稱。若是它指的是一個文件集,咱們就能夠對此集合調用list()方法,這個方法會返回一個字符串數組。
  2. 經過繼承,任何自InputStream或Reader派生而來的類都含有名爲read()的基本方法,用於讀取單個字節或者字節數組。一樣任何自OutputStream或Writer派生而來的類都含有名爲write()的基本方法,用於寫單個字節或者字節數組。
  3. 與輸入有關的全部類都應該從InputStream繼承,而與輸出有關的全部類都應該從OutputStream繼承。
  4. 經過疊合多個對象來提供多種不一樣功能的組合,這就是裝飾器的設計模式。
  5. 與InputStream和OutputStream面向字節IO不一樣的是,Reader和Writer是兼容Unicode與面向字符的IO。
  6. RandomAccessFile適用於由大小已知的記錄組成的文件,因此咱們可使用seek()進行記錄的讀取或者修改。
  7. I/O流的典型使用方式:
    • BufferedReader用於緩衝輸入文件,經過減小實際對磁盤的讀寫來提升速度。
    • 格式化的輸入可使用DataInputStream,available()方法能夠查看還有多少可供存取的字符。雖然PrintWriter也能夠對數據進行格式化,可是爲了輸出一個可供另外一個流恢復的數據,用DataOutputStream寫入數據,用DataInputStream恢復數據更好。

2.Java Q&A

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

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

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


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

生成文件大小:48字節編程

屬性 字節數
num 1
name 4
age 2
score 4
分隔符(共三個) 3
行末尾 2
一行 16

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

0字節
由於數據寫到緩衝區上,原來有close()方法自動調用flush()來刷新,可是如今沒有close()了,因此數據在緩衝區上直接丟失了。設計模式


2.緩衝流

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


用BufferedReader更快,由於使用緩衝能夠減小IO次數,能夠防止每次讀取時都得進行實際的讀操做。其實Scanner也有緩衝區,可是相比於BufferedReader要小很多。數組


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


有提高,一樣是由於BufferedWriter使用了緩衝技術瀏覽器


3. 字符編碼

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


有亂碼,由於FileReader並無實現父類中帶字符集參數的構造函數,只能按系統默認的字符集來解碼。多線程

這樣解決:
app


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


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

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



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

51字節:一個int4字節,一個double8字節,名字都只有3個字符,再加上正文結束標識符(兩個字符),每一個名字有5個字符,一個字符一字節,每一個名字5個字節。一個學生17個字節,一共三名學生,51字節。


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


分析數據是這樣存儲的:
0000 000c -> 12
4055 c000 0000 0000 -> 87.50
0003 7177 65 -> qwe
00 0000 0a -> 10
40 52e0 0000 0000 00 -> 75.5
00 0366 6666 -> fff
0000 0008 -> 8
404f 0000 0000 0000 -> 62.0
0003 6376 62 -> cvb


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


5. Scanner基本概念組裝對象

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


首先使用BufferedReader,使用緩衝技術,讓讀寫更高效!
而後由於要讀UTF-8格式的文件,因此須要用到InputStreamReader,而後輸入流由FileInputStream提供支持。

固然使用Scanner也不錯的。


6.RandomAccessFile

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




6.2 分析文件大小

72字節

屬性 字節數
num 4
name(兩個中文字符) 6
字符串結尾 2
age 4
score 8
一行 24

7.文件操做

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

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



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

DFS改爲BFS,EZ:


7.3 選作:實現刪掉指定目錄及其子目錄下的全部空文件夾

(見題4.3)
稍做改動就能夠刪了


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


8. 正則表達式

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

題目是這個意思嗎= =,可是應該用個比較厲害的,好比


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

String patternDigitString = "[+-]?[0-9]+";

倒數第二張圖:


8.3 選作(較難):進一步改造上面的程序,得到圖片的連接,如IMG src="images/mail1.gif",而後通過處理,生成該圖片的實際連接地址http://cec.jmu.edu.com/images/mail1.gif。最後將生成的若干地址,放入一個隊列。編寫方法,能夠依照該隊列的全部圖片地址,一次將圖片下載下來。


3.碼雲上代碼提交記錄

題目集:多線程(4-4到4-10)

3.1 碼雲代碼提交記錄

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


4. 課外閱讀

4.1 嘗試翻譯Lesson: Basic I/O中的Summary

概要

  該java.io包中包含不少類可使你的程序用來讀取和寫入數據。大多數類實現順序訪問流。順序訪問流能夠分爲兩類:讀寫字節和讀寫Unicode字符。每一個順序訪問流都具備各自的特性,例如讀取或寫入一個文件,當 讀寫的時候篩選數據,或序列化一個對象。

  java.nio.file包爲文件和文件系統I/O提供普遍支持。這是一個很是全面的API,但關鍵切入點以下:

  • Path類有幾個操做路徑的方法。
  • Files類有文件操做方法,如移動,複製,刪除,也有用於檢索和設置文件屬性的方法。
  • FileSystem類有各類用於獲取有關文件系統的信息的方法。

  關於NIO.2的更多信息能夠在java.net的OpenJDK:NIO項目網頁中被找到。該網站包括不少NIO.2的本教程沒有說起的功能,如多播,異步I/O,並建立本身的文件系統。


4.2 嘗試完成Questions and Exercise

Questions

  1. What class and method would you use to read a few pieces of data that are at known positions near the end of a large file?
    想用RandomAccessFile來實現,可是標答說newByteChannel會更好,還沒研究過,有時間看看,這都是nio的東西。

  2. When invoking format, what is the best way to indicate a new line?
    %n是相對於\n更好的選擇,由於後者不具備平臺獨立性。

    下面關於NIO的我都是先搬過來,後面再深刻了解。

  3. How would you determine the MIME type of a file?
    MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。MIME_百度百科
    Files中的probeContentType()方法用來判斷。

  4. What method(s) would you use to determine whether a file is a symbolic link?
    symbolic link符號連接,又稱爲軟連接,是做爲另外一個文件的引用。軟連接對於應用來講是透明的,對於軟連接的操做都會被從新定向到連接的目標文件中去。軟鏈接的刪除對於指向的文件沒有任何影響,可是若是指向的文件被刪除以後,軟連接便會失效。Files類重有isSymbolicLink()來判斷一個文件是不是一個符號連接。

Exercises
Exercise 1. Write an example that counts the number of times a particular character, such as e, appears in a file. The character can be specified at the command line. You can use xanadu.txt as the input file.

String line = null;
while ((line = bufferedReader.readLine()) != null) {
    for (int i = 0; i < line.length(); i++)  {
        if (line.charAt(i) == lookFor) {
            cnt++;
        }
    }
}
System.out.println(cnt);
bufferedReader.close();

Exercise 2. The file datafile begins with a single long that tells you the offset of a single int piece of data within the same file. Write a program that gets the int piece of data. What is the int data?
文件損壞了……


4.3 字符集與編碼

這個頗有趣


4.4 Java正則表達式的語法與示例

匹配驗證:

//編譯正則表達式
Pattern pattern = Pattern.compile(regex)
//CASE_INSENSITIVE表示對大小寫不敏感
Matcher matcher = pattern.matcher(str);
// 字符串是否與正則表達式相匹配
return matcher.matches;
//()返回一個boolean值,表示是否匹配

Java正則表達式的語法與示例

字符串中查詢字符或者字符串:
matcher.find()用來查找主串當中是否有包含咱們須要的字符串,若是有包含,咱們就能夠調用matcher.start()和matcher.end()來獲取該匹配字符串的開始和結尾。


看的不過癮的請點下面
回到頂部


又是作的很糙的一次,笑容尬住

相關文章
相關標籤/搜索