java標準IO操作(二)
阿新 • • 發佈:2018-12-01
java按照讀寫的資料單位將流劃分為兩大類
位元組流,字元流
位元組流是以位元組為單位讀寫資料的流,由於計算機底層都是2進位制,所以位元組流可以讀寫任意資料
字元流是以字元為單位讀寫資料的流,實際底層還是讀寫位元組
但是字元流會自動將位元組與字元進行對應的轉換工作,
因此字元流天生具備字元編解碼能力,對此字元流也僅適用於讀寫文字資料
java.io.Reader,java.io.Writer他們是所有字元輸入流
與字元輸出流的超類,規定了讀寫字元的相關方法
轉換流
java.io.InputStreamReader,java.io.OutputStreamWriter
它們是字元流常用的一堆實現類,同時也是一對高階流.在流連結中
起到非常重要的一環,承上啟下,銜接位元組流與其他字元流使用
轉換流是唯一一個可以與位元組流連線 的字元流
(因為低階流通常都是位元組流,而讀寫字元時我們會使用功能更多的字元高階流,而字元流通常只能連線其他字元流)
OutputStreamWriter演示
public class OSWDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("OSW.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
osw.write("兮兮");
osw.write("黼黻");
System.out .println("寫出完畢");
osw.close();
}
}
InputStreamReader演示
public class ISRDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("osw.txt");
InputStreamReader isr = new InputStreamReader(fis,"gbk");
/**
* 字元流提供的讀取字元操作
* int read()
* 該方法會一次讀取一個字元,具體實際讀取了多少位元組取決於指定的字符集以及對應的字元(字元流會自行判定)
* 讀取字元後還是以int形式返回,若該值為-1依然表示流讀取到了末尾.否則該資料表示的就是讀取到的對應字元,轉換為char即可
*/
int d = -1;
while((d = isr.read())!=-1){
char c = (char)d;
System.out.print(c);
}
isr.close();
}
}
java.io.PrintWriter
具有自動行重新整理的緩衝字元輸出流,
特點是可以按行寫出字串,並且可以自動行重新整理
注:
java.io.BufferedWriter是緩衝字元輸出流,內部有緩衝區
可以進行塊寫操作提高效率,而PrintWriter就是通過連線它實現的緩衝功能(PW的很多構造方法內自動連線它)
PrintWriter演示
public class PWDemo {
public static void main(String[] args) throws FileNotFoundException, IOException {
/*
* PW支援兩個直接對檔案寫操作的構造方法:
* PrintWriter(File f)
* PrintWriter(String path)
*
* 以上兩種構造方法都支援一個過載,就是再傳入一個引數允許我們指定寫出字元時的字符集
*/
PrintWriter pw = new PrintWriter("pw.txt","GBK");
pw.println("A");
pw.println("B");
System.out.println("寫入完畢");
pw.close();
}
}
在流連結中使用PW
public class PWDemo2 {
public static void main(String[] args) throws IOException {
/*
*使用流連結形式向檔案中 寫出字串
*/
FileOutputStream fos = new FileOutputStream("pw2.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk");
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw);
/* PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(FileOutputStream("pw2.txt"),"gbk")));*/
pw.println("a");
pw.println("b");
System.out.println("over");
pw.close();
}
}
java.io.BufferedReader
緩衝字元輸入流
特點:可以按行讀取字串
BufferedReader演示
public class BRDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src/io/BRDemo.java");
InputStreamReader isr = new InputStreamReader(fis,"GBK");
BufferedReader br = new BufferedReader(isr);
/*
* String readLine()
* 連續讀取若干字元,知道讀取到了換行符為止,然後將換行符之前的所有字元組成一個字串返回
* 注意:返回的字串中不包含最後讀取到的換行符
* 當讀到了末尾,則返回null.
*/
String line = null;
while((line = br.readLine())!= null){
System.out.println(line);
}
br.close();
}
}
完成簡易記事本功能
public class Note {
public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入檔名:");
String fileName = sc.nextLine();
/*
* 當建立PW時第一個引數為一個流時,那麼就可以再傳入一個boolean值型別引數
* 若該值為true.那麼當前PW就具有了自動行重新整理功能,即:
* 每當使用println方法寫出一行字串後就會自動flush
*
* 注:使用自動行重新整理可以提高寫出資料的即時性,但是由於會提高寫出次數,必然導致寫效率降低
*
*/
PrintWriter pw = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(fileName),"GBK"
)
),true //開啟自動行重新整理功能 不需要之後使用flush方法
);
System.out.println("請輸入內容(鍵入exit程式退出):");
String str;
while(true){
str = sc.nextLine();
if("exit".equals(str.toLowerCase())){
break;
}
pw.println(str);
// pw.flush();
}
System.out.println("再見");
sc.close();
pw.close();
}
}