標籤:java-io java流 reader writer stream
Scanner類
1 從鍵盤讀取
public class ScannerTest { public static void main(String[] args ) { Scanner input = new Scanner(System.in); System.out.println("請輸出一個整數:"); int i = input.nextInt(); System.out.println("你輸入的整數是:" + i); }}
結果:
2 從字串讀取
public class ScannerTest2 { public static void main(String[] args ) { //這裡的\r\n是分行符號,Linux下其實只用\n即可 Scanner input = new Scanner("hello\r\nworld\r\n"); //迴圈讀取,hasNext()方法和集合架構裡面的一樣使 while(input.hasNext()) { //每次讀取一行,別的讀取方法見API,比較簡單 String s = input.nextLine(); System.out.println(s); } }}
結果
3 從檔案讀取
public class ScannerTest3 { public static void main(String[] args ) { String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demoTest.txt"; File f = new File(path); Path path2 = f.toPath(); Scanner input = null; try { //從檔案構造Scanner對象,有可能產生異常 input = new Scanner(path2); System.out.println(f.getAbsolutePath()); System.out.print(input.hasNext()); while(input.hasNext()) { String s = input.nextLine(); System.out.println(s); } } catch (IOException e) { e.printStackTrace(); } finally { input.close(); } }}
結果圖:
從可以看出編碼格式不同,對於中文掃描輸出是亂碼。
還有一點需要注意:
public class ScannerTest3 { public static void main(String[] args ) { String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demoTest.txt"; File f = new File(path); Scanner input = null; try { //從檔案構造Scanner對象,有可能產生異常 input = new Scanner(f); System.out.println(f.getAbsolutePath()); System.out.print(input.hasNext()); while(input.hasNext()) { String s = input.nextLine(); System.out.println(s); } } catch (IOException e) { e.printStackTrace(); } finally { input.close(); } }}
在我進行測試的時候,使用如上的方式進行檔案的讀取操作,讀取不到檔案的內容。不知為何!!!??請大家誰知道的話,不吝賜教~~~!!
PrintWriter類
4 向檔案寫入內容
public class PrintWriterToFile { public static void main(String[] args) { String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demoTest.txt"; //建立檔案對象 File file = new File(path); PrintWriter p = null; try { //此處建構函式還可以傳其他對象,具體參考API文檔 p = new PrintWriter(file); //向檔案寫入一行,此外還有print()和printf()方法 p.println("如果有一天我回到從前"); p.println("回到最原始的我"); p.println("你是否會覺得我不錯"); //重新整理流 p.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { p.close(); } }}
結果圖:
與PrintWriter類似的還有一個PrintStream類,此處以PrintWriter舉例是因為文字檔具有人為可讀性
而二進位檔案(位元組模式)則需要使用專門的程式來讀取
可能有人會問:FileOutputStream、 FileWriter都能寫檔案,那麼為何還需要PrintWriter和PrintStream類
如果細看API文檔,可以知道前者單純的字元寫入流和位元組寫入流操作的方式大多用數組進行
對檔案的細化處理非常不方便,而PrintWriter和PrintStream則很好的解決了這一問題,提供print()等方法
並且,PrintWriter和PrintStream對於不存在檔案對象的情況下會直接建立,如果已有檔案對象
它們則會把原有檔案給覆蓋掉,卻沒有增加方法
解決這問題也很簡單,再看API文檔
PrintWriter有一個構造方法PrintWriter(Writer out),也就是能夠傳入Writer對象
PrintStream有一個構造方法PrintStream(OutputStream out),也就是能傳入OutputStream對象
因此,我們這樣寫就可以了
new PrintWriter(new FileWriter(file,true))
new PrintStream(new FileOutputStream(file,true))
既能增加資料,也能更高效的處理檔案
5 實現PrintWriter的資料追加功能
public class PrintWriterAppendFile { public static void main(String[] args) { String path = "D:\\Program Files (x86)\\ADT\\workspace\\JavaIO\\demoTest.txt"; //建立檔案對象 File file = new File(path); PrintWriter p = null; try { //利用FileWriter方式構建PrintWriter對象,實現追加 p = new PrintWriter(new FileWriter(file,true)); p.println("wqnmglb 這一句就是追加的 看到沒"); p.flush(); } catch (IOException e) { e.printStackTrace(); } finally { //我們來小心翼翼的關閉流,好吧^_^ p.close(); } }}
結果:
System類對IO的支援
6 System類中的寫入
public class SystemOutTest { public static void main(String[] args) { //別忘了,OutputStream是所有位元組寫入流的父類 OutputStream out = System.out; try { //寫入資料,只能是數組,所以用getBytes()方法 out.write("Hello,son of bitch!\r\n".getBytes()); } catch (IOException e) { e.printStackTrace(); } }}
結果:
7 System類中的讀取
public class SystemInTest { public static void main(String[] args) { //別忘了InputStream是所有位元組輸入資料流的父類 InputStream in = System.in; System.out.print("請輸入文字: "); byte[] buf = new byte[1024]; int len = 0; try { //將輸入的資料保證到數組中,len記錄輸入的長度 len = in.read(buf); } catch (IOException e) { e.printStackTrace(); } //用字串的方式列印數組中的資料 System.out.println("你的輸入是: " + new String(buf,0,len)); }}
結果:
不過對於上面的情況,如果輸入中文,則輸出為亂碼。請大家注意。原因在於讀取的是位元組的緣故。如果讀取字元,則不存在亂碼的情況。
其實,對於目前可能出現的亂碼情況,大家大可不必糾結。因為在實際開發過程中,都會基本一定的環境當中。例如:進行android開發,android上面預設的字元編碼是utf-8,你是知道的,所以即使出現了亂碼的情況,使用字元格式設定轉換Charset類就可以糾正。在例如:進行WEB開發,在WEB開發的過程中需要指定字元編碼格式,或者GBK 或者UTF-8 不過推薦使用utf-8,因為平台移植性好。
8 利用BufferedReader實現對鍵盤的讀取
public class BufferedReaderFromScanner { public static void main(String[] args) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); System.out.print("請輸入文本:"); try { String str = bufferedReader.readLine(); System.out.println("你輸入的是:" + str); } catch (IOException e) { e.printStackTrace(); } try { //關閉流,不耐煩的就直接拋 bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } }}
結果:
如果有什麼問題或者錯誤 請留言!謝謝~~~~【握手】
源碼稍後提供下載
Java IO流詳解(三)