File & String 輸入輸出
Posted on 2009-07-23 16:06 Gavin.lee 閱讀(1630) 評論(0) 編輯 收藏 所屬分類: Log && File Operate
多靈活多變的功能是由它們的子類來擴充完成的。知道了Java輸入輸出的基本層次結構以后,本文在這里想給大家一些以后可以反復應用例子,對于所有子類的細節及其功能并不詳細討論。
import java.io.*;
public class IOStreamDemo {
public void samples() throws IOException {
//1. 這是從鍵盤讀入一行數據,返回的是一個字符串
BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter a line:");
System.out.println(stdin.readLine());
//2. 這是從文件中逐行讀入數據
BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));
String s, s2 = new String();
while((s = in.readLine())!= null)
s2 += s + "\n";
in.close();
//3. 這是從一個字符串中逐個讀入字節
StringReader in1 = new StringReader(s2);
int c;
while((c = in1.read()) != -1)
System.out.print((char)c);
//4. 這是將一個字符串寫入文件
try {
BufferedReader in2 = new BufferedReader(new StringReader(s2));
PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
int lineCount = 1;
while((s = in2.readLine()) != null )
out1.println(lineCount++ + ": " + s);
out1.close();
} catch(EOFException e) {
System.err.println("End of stream");
}
}
}
對于上面的例子,需要說明的有以下幾點:
1. BufferedReader是Reader的一個子類,它具有緩沖的作用,避免了頻繁的從物理設備中讀取信息。它有以下兩個構造函數:
BufferedReader(Reader in)
BufferedReader(Reader in, int sz)
這里的sz是指定緩沖區的大小。
它的基本方法:
void close() //關閉流
void mark(int readAheadLimit) //標記當前位置
boolean markSupported() //是否支持標記
int read() //繼承自Reader的基本方法
int read(char[] cbuf, int off, int len) //繼承自Reader的基本方法
String readLine() //讀取一行內容并以字符串形式返回
boolean ready() //判斷流是否已經做好讀入的準備
void reset() //重設到最近的一個標記
long skip(long n) //跳過指定個數的字符讀取
2. InputStreamReader是InputStream和Reader之間的橋梁,由于System.in是字節流,需要用它來包裝之后變為字符流供給BufferedReader使用。
3. PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
這句話體現了Java輸入輸出系統的一個特點,為了達到某個目的,需要包裝好幾層。首先,輸出目的地是文件IODemo.out,所以最內層包裝的是 FileWriter,建立一個輸出文
件流,接下來,我們希望這個流是緩沖的,所以用BufferedWriter來包裝它以達到目的,最后,我們需要格式化輸出結果,于是將PrintWriter包在最外層。
Java提供了這樣一個功能,將標準的輸入輸出流轉向,也就是說,我們可以將某個其他的流設為標準輸入或輸出流,看下面這個例子:
import java.io.*;
public class Redirecting {
public static void main(String[] args) throws IOException {
PrintStream console = System.out;
BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java"));
PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out")));
System.setIn(in);
System.setOut(out);
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
String s;
while((s = br.readLine()) != null)
System.out.println(s);
out.close();
System.setOut(console);
}
}
在這里java.lang.System的靜態方法
static void setIn(InputStream in)
static void setOut(PrintStream out)
提供了重新定義標準輸入輸出流的方法,這樣做是很方便的,比如一個程序的結果有很多,有時候甚至要翻頁顯示,這樣不便于觀看結果,這是你就可以將標準輸出流定義為
一個文件流,程序運行完之后打開相應的文件觀看結果,就直觀了許多。