201521123117 《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的數據讀出。(截圖關鍵代碼,出現學號)

//201521123117
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 生成文件大小多少?分析該文件大小

生成文件大小:50字節
分析:第一行的「3」表明數組的大小,佔3個字節;一個id佔1個字節,共佔3個字節;英文字符串每一個字母佔1個字節,故共佔11個字節;age佔2個字節,共6個字節;grade佔4個字節,共佔12個字節;分隔符有3個,共佔3個字節;行末尾共佔2個字節。

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

0字節
close方法中會自動調用flush()函數,flush()函數做用爲清空緩衝區數據。若調用PrintWriter的println方法,但在後面不close的話,緩衝區中的數據就會丟失。

參考:本題具體要求見流與文件實驗任務書-題目1-2.1正則表達式

參考代碼:TextFileTest.java編程

2. 緩衝流

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

BufferedReader是在字符輸入流中讀取文本,緩衝各個字符,從而提供字符、數組和行的高效讀取,使用緩衝能夠減小IO次數。讀取數據的速度要比Scanner塊。

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

使用BufferedWriter寫入文件的速度要更快;由於BufferedWriter使用了緩衝技術。

參考:本題具體要求見流與文件實驗任務書-題目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編碼來解析,會出現亂碼狀況。

解決辦法編輯器

//201521123117  
pubilc class InputStreamReaderTest{
    public static void main(Srting[] args) throws Exception{
          BuffererdReader br = null;
          try {
               br = new BufferedReader(new InputStreamReader(new FileInputStream("d:/EncodeTest.txt"),"UTF-8));
               String line = null;
               while((line=br.readLine())!=null)
                   System.out.println(line);
           }finally{
                if (br!=null){
                    br.close();
                }
           }
      }
}

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

//201521123117  
public static void main(Srting[] args) throws Exception{
          String dst = "e:/dst.txt";
          String src = "e:/src.txt";
          convertGBK2UTF8( src, dst);
}
public static void convertGBK2UTF8(String src, String dst)throws IOException{
          BufferedReader br = null;
          br = new BufferedReader(new FileReader(src));
          OutputStreamWriter osw=new OutputStreamWriter(FlieOutputStream(dst),"UTF-8");
          String line =null;
          while((line=br.readLine())!=null){
            osw.write(line+"\n");
          }
         br.close();
        osw.close();

參考:InputStreamReaderTest.java與教學PPT函數

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

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

Student[] student=new Student[3];
        student[0] = new Student(1,"zheng", 20,98);
        student[1] = new Student(2,"chen",19,80);
        student[2] = new Student(3,"li",21,85);
 //201521123117
           DataOutputStream dos=null;
           try{
               dos=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("student2.txt")));
               for(int i=0;i<3;i++){
                   dos.writeInt(student[i].getId());
                   dos.writeUTF(student[i].getName());
                   dos.writeInt(student[i].getAge());
                   dos.writeDouble(student[i].getGrade());
               }
           }finally{
               dos.close();
           }
//201521123117
           DataInputStream dis=null;
           try{
               dis=new DataInputStream(new BufferedInputStream(new FileInputStream("student2.txt")));
               Student[] student2=new Student[3];
               for(int i=0;i<3;i++){
                   Student student1=new Student(dis.readInt(),dis.readUTF(),dis.readInt(),dis.readDouble());
                   student2[i]=student1;
               }
               for(int i=0;i<3;i++)
               {
                   System.out.println("student"+"[id=" + student2[i].getId() + ",name=" + student2[i].getName() + ",age=" +  
                       student2[i].getAge()+",grade="+ student2[i].getGrade()+"]");
               }
           }catch(Exception e){
               System.out.println(e);
           }finally{
               dis.close();
           }

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

生成文件大小:65字節
分析:一個int型4字節,id和age共24字節;一個double型8字節,grade共24字節;一個英文字符1字節,name共11字節;一個標識符2字節,共6字節;故文件大小爲65字節。
將該文件大小和題目1生成的文件對比是大了。由於DataOutputStream寫入文件是按照不一樣的數據類型寫入,每一個數據類型佔必定的大小,如int佔4個字節。

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


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

//201521123117
    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 readStudents(String fileName)從fileName指定的文本文件中讀取全部學生,並將其放入到一個List中。應該使用那些IO相關的類?說說你的選擇理由。 編碼

運行結果:
3d

FileInputStream:從文件中讀取數據;
InputStreamReader:讀UTF-8格式的文件;
BufferedReader:使用緩衝技術,讀取速度更快;

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

7. 文件操做

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

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

//201521123117
public class findFilename{
      public static void main(String[] args){
          //TODO Auto-generated method stub
        findFile("E:\\做業","src.txt");
       }

       public static void findFile(String path,String filename) {
           //TODO Auto-generated method stub
           File file =new File(path);
           String[] fileName = file.list();
           for(String string:fileName){
               File files =new File(file.getAbsolutePath(),string);
               if(string.equals(filename))
                   System.out.println(files.getAbsolutePath());
               if(files.isDirectory())
                   findFile(files.getAbsolutePath(),filename);
           }
       }

}

運行結果:

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

關鍵代碼:

//201521123117
    Queue<File> queue=new LinkedList<>();
    queue.offer(new File(path));
    while(!queue.isEmpty()){
        File file =queue.poll();
        String[] fileName = file.list();
        for(String string:fileName){
            File files =new File(file.getAbsolutePath(),string);
            if(string.equals(filename))
                System.out.println(files.getAbsolutePath());
            if(files.isDirectory())
                queue.offer(files);
    }
 }

運行結果:

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

8. 正則表達式

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

//201521123117
Public class checknumber{
   Public static void main (string[] aegs) {
      //TODO Atuto-generated method stub
   Scanner in =new Scanner(System.in);
   While(in.hasNext()){
   String str=in.nextline();
   System .out.printLn(checknumber(str));
  }
 }
   public static boolean checknumber (string str){
    String patternstring ="[+-]?[0-9]";
    return pattern.matches(patternstring,str);
 }
}

運行結果:

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

3. 碼雲及PTA

相關文章
相關標籤/搜索