實例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(),每次讀取一行