說實話,其實我並不是很喜歡Java這門語言,盡管它很強大,有很多現成的API可以調用
但我總感覺它把簡單的事情弄得太過復雜,甚至有時候會讓人迷失
弄不清到底是為了寫出東西,還是為了語言本身
我學習的第一門編程語言是Python,雖然學的不深
但是它的簡單優雅至今令人難忘(呃,其實也就兩年前的事……)
我接觸的第二門語言是C,它給我的感覺是一種純粹,一種高效的靈活
而不是類似java,寫一堆含糊的代碼來實現一個小小的功能
坦白講,如果一個人在學習自己不感興趣的東西,那會很累
支撐我的是,我對移動開發有着異常的向往,對Android也相當喜歡,無奈開發Android的主要語言便是Java
雖然已經學了半年,但是我卻到現在都不能解釋神馬企業級開發到底有哪些東西
我想要的,無非就是把編程當作生活中的一種調情,如果想要某個功能,就去實現,用盡可能簡單的方式
甚至我的猜想是,等到日后發展,編程這門技術如同每個人使用office一般的時候
那么作為程序員的你們是該有多艱辛?
要知道,一個人將自己內心的利益蓋過真正的想法,這是相當可怕的……
因此,每個人都應該用自己喜歡的,覺得高效的方式,做自己最想要做的
好了,說了那么多,我的目的其實只有一個
難道我會告訴你,我根本就搞不懂,也不想搞懂java那些復雜的垃圾語法么?
我只用那些最簡單最好用的東西……
java以前的那些io寫法我就懶得記錄了,主要是System類對IO的支持
如果你覺得我寫的代碼不夠深沉,那你就噴吧,可噴完之后你還能干些什么呢?
現在,步入正題……
這一節我們來講Scanner類和PrintWriter類的用法
Scanner類
實例1:從鍵盤讀取
import java.util.Scanner; public class Demo { public static void main(String[] args ) { Scanner input = new Scanner(System.in); System.out.println("請輸出一個整數:"); int i = input.nextInt(); System.out.println("你輸入的整數是:" + i); } }
以上演示的只是讀取一個整數,當然還有讀取浮點數和其他數據類型的方法,比較簡單,查看API即可
實例2:從字符串讀取
import java.util.Scanner; public class Demo { 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:從文件讀取
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Demo { public static void main(String[] args ) { String path = File.separator + "home" + File.separator + "siu" + File.separator + "work" + File.separator + "demo.txt"; File f = new File(path); Scanner input = null; try { //從文件構造Scanner對象,有可能產生異常 input = new Scanner(f); while(input.hasNext()) { String s = input.nextLine(); System.out.println(s); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { input.close(); } } }
這里要注意的是,從文件創建Scanner對象得先要有File對象,當然你可以使用匿名對象來創建
此外,還需捕捉異常和關閉文件流
PrintWriter類
實例4:向文件寫入內容
import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; public class Demo { public static void main(String[] args) { String path = File.separator + "home" + File.separator + "siu" + File.separator + "work" + File.separator + "demo.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的數據追加功能
import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Demo { public static void main(String[] args) { String path = File.separator + "home" + File.separator + "siu" + File.separator + "work" + File.separator + "demo.txt"; //創建文件對象 File file = new File(path); PrintWriter p = null; try { //利用FileWriter方式構建PrintWriter對象,實現追加 p = new PrintWriter(new FileWriter(file,true)); p.println("尼瑪 這一句就是追加的 看到沒"); p.flush(); } catch (IOException e) { e.printStackTrace(); } finally { //我們來小心翼翼的關閉流,好吧^_^ p.close(); } } }
看,這樣就能實現追加效果了,最后一行便是
System類對IO的支持
實例6:System類中的寫入
import java.io.IOException; import java.io.OutputStream; public class Demo { public static void main(String[] args) { //別忘了,OutputStream是所有字節寫入流的父類 OutputStream out = System.out; try { //寫入數據,只能是數組,所以用getBytes()方法 out.write("Hello,bitch!\r\n".getBytes()); } catch (IOException e) { e.printStackTrace(); } } }
注意,此處正好印證了System.out的覆寫行為
如果想學好io,整個io體系中的多態需要了解清楚才能駕輕就熟
實例7:System類中的讀取
import java.io.IOException; import java.io.InputStream; public class Demo { 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)); } }
看,這樣就能從鍵盤獲取內容並且打印了
需要注意的是,這里的數組大小是1024字節
一旦輸入的數據超過1024字節,那么超過的內容將被截取掉,所以此程序有局限性
並且,一個中文占兩個字節,輸入中文有時候會被意外截取掉
相信我,每個程序都是俺親自編寫編譯的~!!!
實例8:利用BufferedReader實現對鍵盤的讀取
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Demo { public static void main(String[] args) { BufferedReader b = new BufferedReader(new InputStreamReader(System.in)); System.out.print("請輸入文本:"); try { String str = b.readLine(); System.out.println("你輸入的是:" + str); } catch (IOException e) { e.printStackTrace(); } //循環讀取方式 /* while(true) { System.out.print("請輸入文本:"); String str = null; try { str = b.readLine(); } catch (IOException e) { e.printStackTrace(); } //如果輸入over就結束循環 if("over".equals(str)) { break; } System.out.println("你輸入的是:" + str); } */ try { //關閉流,不耐煩的就直接拋 b.close(); } catch (IOException e) { e.printStackTrace(); } } }
這樣做相對於上面一個方法的好處是:不用關心數組大小的問題
BufferedReader有一個最重要的方法就是readLine(),每次讀取一行