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

1. 本週學習總結

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


2. 書面做業

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

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

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

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

生成的文件大小:54字節
正則表達式

id佔3字節 name 4個字節 age 2個字節 grade 4個字節 分隔符 3個字節 行末尾2個字節 平均下來一行 18個字節 3行就是54個字節。編程

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

0字節,由於PrintWriter內部使用了緩衝區,因此也有flush方法。close()方法自動調用flush()來刷新,緩衝區的數據就會被強制寫出。因此不用close,數據會在緩衝區丟失。

2. 緩衝流

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

用BufferedReader更快,由於BufferedReader使用緩衝區,能夠不用每次都向磁盤讀取。dom

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

用BufferedWriter更快,由於BufferedReader使用緩衝區能夠防止每次寫入時都得進行實際的寫操做。編輯器

3. 字符編碼

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

  • 會亂碼。FileReader只能按系統默認的字符集來解碼。

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

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

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

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

66字節。變大了 一個學生信息中,兩個int數據,一個int佔4個字節=>int所有佔8個字節,一個double數據8個字節,一個String4個字母,佔4個字節,行末尾佔2個字節,一個學生信息總共22個字節=>3個學生信息66個字節函數

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

按字節來儲存例如的第一行 00 00 00 64 ->id 43 61 72 6c->Carl學習

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

5. Scanner基本概念組裝對象

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

  • 有緩衝技術的BufferedReader速度快,用InputStreamReader讀取UTF-8格式文件。

6. 選作:RandomAccessFile

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

6.2 分析文件大小

66字節 一個學生信息中,兩個int數據,一個int佔4個字節=>int所有佔8個字節,一個double數據8個字節,一個String4個字母,佔4個字節,行末尾佔2個字節,一個學生信息總共22個字節=>3個學生信息66個字節編碼

7. 文件操做

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

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

//201521123014
        public static void findFile(String pathName,String filename){
            try{
                File fir=new File(pathName,filename);
                if(fir.isDirectory()){
                    System.out.println(fir.getAbsolutePath());
                    main(new String[]{fir.getPath()})
                }
                
            }catch(Exception e){
                System.out.println(e);
            }
        }

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

//201521123014
        public static void findFile(String pathName,String filename){
            Queue<File> queue=new LinkedList<>();
            queue.offer(new File(path));
            while(!queue.isEmpty()){
                File file=queue.poll();
                String[] fileNames=file.list();
                for(int i=0;i<fileNames.length;i++){
                    File f= new File(file,getPath(),fileNames[i]);
                    if(f.isDirectory()){
                        System.out.println(f.getCanonicalPath());
                        main()
                    }
                }
            }
        }

8. 正則表達式

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

//201521123014
        public static boolean isOctNumberRex(String str){
            boolean flag=false;
            for(int i=0,n=str.length();i<n;i++){
                char c=str.charAt(i);
                if(c=='0'|c=='1'|c=='2'|c=='3'|c=='4'|c=='5'|c=='6'|c=='7'|c=='8'|c=='9'|){
                    flag=true;
                }
            }
            return flag;
        }

3. 碼雲及PTA

3.1. 碼雲代碼提交記錄

3.2 PTA之前未完成的題目

相關文章
相關標籤/搜索