1. 程式人生 > >java學習筆記(9)-Java I/O系統

java學習筆記(9)-Java I/O系統

第九章 Java I/O系統

1、題目

1.1、 何為流?根據流的方向,流可分為哪兩種?

流表示檔案傳播的方向和傳播的檔案資訊的集合。根據流的方向,流可分為輸入與輸出流。
PPT:流是在計算機的輸入、輸出操作中流動的資料序列。

1.2、 InputStream,OutputStream,Reader和Writer類的功能有何異同?

其中InputStream與Reader同為輸入流,程式可以通過它們從檔案讀取資訊;而OutputStream與Writer同為輸出流,程式可以通過它們向檔案輸出資訊。
PPT:
這裡寫圖片描述
位元組流類主要用於讀寫諸如圖象或聲音等的二進位制資料。字元流類用於向字元流讀寫16位二進位制字元。

1.3、 編寫一個程式,將兩個檔案中的內容合併到一個檔案中。

(這裡只實現了從1和2檔案讀取輸出到3檔案,還不能從1複製到2而不改變2原有的值)

package xiti9;
//以位元組流方式,將一個檔案中的資訊複製到另一個檔案
//讀入:程式<-FileInputStream<-檔案(資訊源)
//寫出:程式->FileOutputStream->檔案(資訊去向)
//未考慮異常處理

import java.io.*;
public class xiti9_3 {

public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
      int b = 0;
      FileInputStream in1 = null,in2 = null;
      FileOutputStream out = null;

      //資料來源,用於向程式中讀取資訊
      in1 = new FileInputStream("e://source1.txt");
      //目標檔案,程式將資訊寫到此檔案中,會自動建立檔案
      in2 = new FileInputStream("e://source2.txt");
      out = new FileOutputStream("e://dest.txt");
      while((b=in1.read())!=-1){//一次讀一個位元組,判斷是否讀到檔案結尾
          out.write(b);//一次寫一個位元組
      }
      while((b=in2.read())!=-1){//一次讀一個位元組,判斷是否讀到檔案結尾
          out.write(b);//一次寫一個位元組
      }
      in1.close();
      in2.close();
      out.close();

      System.out.println("檔案已複製");
}
}

這裡寫圖片描述

1.4、 程式設計實現以下功能

在螢幕上顯示:輸入姓名,然後將使用者輸入的姓名儲存到文字檔案中,重複進行,直到使用者輸入空字串為止。 

package xiti9;
import java.io.*;
public class xiti9_4 {
public static void main(String[] args) throws Exception{
    // TODO Auto-generated method stub
    //使用System.in建立InputStreamReader類物件iin
    InputStreamReader iin = new InputStreamReader(System.in);
    //建立BufferedReader類物件bin,並關聯到iin
    BufferedReader bin = new BufferedReader(iin);

    //或者合併寫成如下
    //BufferedReader stdin= new BufferedReader( new InputStreamReader(System.in));
    String str;
    //System.out.println("請輸入姓名:");
    //str = bin.readLine();


    //建立檔案輸出 FileWriter類物件fw1
    FileWriter fw = new FileWriter("e:\\name.txt");

    //建立帶緩衝的BufferedWriter類物件bw,並關聯到fw1
    BufferedWriter bw = new BufferedWriter(fw);   
  //迴圈讀入字串
    while(true){

        System.out.println("請輸入姓名: ");
        //清空輸出緩衝區
        System.out.flush();

        //讀入輸入的一行
        str = bin.readLine();

        //若遇到空行則break,結束讀-寫工作
        if(str.length()==0)break;

        //將本行字串寫出到物件bw
        bw.write(str);

        //在物件bw中建立新行,為下一行輸出做準備
        bw.newLine();           
    }
    //關閉輸出物件
    bin.close();
    bw.close();

}
}

這裡寫圖片描述

1.5、 使用 字元流 程式設計實現以下功能

(1)從鍵盤輸入姓名、學號、成績,並儲存到文字檔案中,重複進行,直到輸入空字串為止
(2)從檔案中讀取各學生的成績,並計算所有學生成績的平均值、最大值和最小值

package xiti9;
import java.io.*;
public class xiti9_5 {
public static void main(String[] args) throws Exception{
    InputStreamReader iin = new InputStreamReader(System.in);
    BufferedReader bin = new BufferedReader(iin);
    String str;  
    FileWriter fw = new FileWriter("e:\\student.txt");        
    //建立帶緩衝的BufferedWriter類物件bw,並關聯到fw1
    BufferedWriter bw = new BufferedWriter(fw);               

  //迴圈讀入字串
    while(true){        
        System.out.println("請輸入姓名、學號: ");
        //清空輸出緩衝區
        System.out.flush();          
        //讀入輸入的一行
        str = bin.readLine();            
        //若遇到空行則break,結束讀-寫工作
        if(str.length()==0)break;            
        //將本行字串寫出到物件bw
        bw.write(str);            
        //在物件bw中建立新行,為下一行輸出做準備
        bw.newLine();  
        System.out.println("請輸入成績: ");//為了方便提取成績資訊,將其單獨作為一行寫入檔案
        System.out.flush();
        str = bin.readLine();
        if(str.length()==0)break;
        bw.write(str);
        bw.newLine();  
    }
    //關閉輸出物件
    bin.close();
    bw.close();
    System.out.println("姓名、學號、成績已儲存到文字");
    ////

    //對student.txt檔案的操作   
    FileReader fr = new FileReader("e:\\student.txt");
    BufferedReader bin1 = new BufferedReader(fr);
  //建立緩衝BufferedReader物件bin1,關聯到fr

    String str2;  
    str2=bin1.readLine(); 
    double temp=0,ave=0,min=1000,sum=0,max=0;
    int linenum=0;//以行數的奇偶判斷成績所在的行
    while(str2!=null) {
        linenum++;
        if(linenum%2==0) {//偶數行為成績
            temp = Double.parseDouble(str2);
            sum+=temp;//求和
            if(min>temp) {
                min=temp;
            }
            if(max<temp) {
                max=temp;
            }
        }
        str2=bin1.readLine();
    }
    ave = sum/(linenum/2);
    System.out.println("學生成績的平均值為:"+ave);
    System.out.println("學生成績的最大值為:"+max);
    System.out.println("學生成績的最小值為:"+min);
}
}

這裡寫圖片描述

2、論述