Java中的IO
IO流也是種對象,Java中的一切都是對象。
IO操作的目標(biāo):從數(shù)據(jù)源中讀取數(shù)據(jù),以及將數(shù)據(jù)讀寫到數(shù)據(jù)目的地當(dāng)中。
IO分類
1.輸入流/輸出流。
2.字節(jié)流/字符流。
每次讀寫1~n個字節(jié)或字符。
字節(jié)流的核心類,InputStream(abstract)<----FileInputStream Int read(byte[] b, int off, int len),以字節(jié)的形式讀取數(shù)據(jù),放入byte型的數(shù)組b中。Int off,是偏移量,len為長度。
OutPutStream(abstract)<----FileOutputStream Void write(byte[]b, int off, int len);
*字節(jié)流讀取:
import java.io.*;
class test{
public static void main(String argsrgs[]){
//聲明輸入,輸出流引用
FileInputStream fis = null;
FileOutputStream fos = null;
try{
//生成代表輸入,輸出流的對象
fis = new FileInputStream("e:/notpad/from.txt");
fos = new FileOutputStream("e:/notpad/to.txt");
//生成一個字節(jié)數(shù)組
byte [] buffer = new byte[100];
//read()返回值為int類型,這一次我們讀取了多少字節(jié)的數(shù)據(jù)
//調(diào)用輸入字節(jié)流的read()方法,讀取數(shù)據(jù)
//調(diào)用輸出字節(jié)流的write()方法,讀取數(shù)據(jù)
int temp = fis.read(buffer, 0 ,buffer.length);
fos.write(buffer, 0 ,temp);
/* 按字節(jié)依次取出在屏幕上
for(int i = 0 ; i <= buffer.length; i++){
System.out.println(buffer[i]);
} *//* 將字節(jié)轉(zhuǎn)換成字符串,存放于S中
String s = new String(buffer);
s = s.trim();
System.out.println(s); */
}
catch(Exception e){
e.printStackTrace();
}
finally{ }
}
}
當(dāng)讀取大文件時:
//生成一個字節(jié)數(shù)組
byte [] buffer = new byte [1024];
//read()返回值為int類型,這一次我們讀取了多少字節(jié)的數(shù)據(jù)
//調(diào)用輸入字節(jié)流的read()方法,讀取數(shù)據(jù)
//調(diào)用輸出字節(jié)流的write()方法,讀取數(shù)據(jù)
//讀取大文件時,應(yīng)循環(huán)讀取,
//當(dāng)read()返回值為-1時,表示已經(jīng)讀完文件,利用break跳出當(dāng)前循環(huán)
while(true){
int temp = fis.read(buffer, 0 , buffer.length);
if(temp == -1){
break;
}
fos.write(buffer, 0 ,temp);
}
finally{
//關(guān)閉輸入輸出管道
try{
fis.close();
fos.close();
}
catch(Exception e){
e.printStackTrace();
}
}
字符流讀取大文件時:
//字符流:讀寫時以字符為基礎(chǔ)
//字符輸入流都是Reader的子類<-- FileReader
//int read(char [] c , int off , int len)
//字符輸出流都是Writer的子類<---FileWriter
// void writer(char [] c ,int off ,int len)
3.節(jié)點流/處理流。
處理流是在節(jié)點流的基礎(chǔ)上對數(shù)據(jù)在進行加工。(eg:水管外邊的加熱管道)
字節(jié)流是被裝飾者,處理流BufferedReader是裝飾者。
-
字符輸入處理流BufferedReader的使用
處理流中的方法:一次讀取一行public String readLine() throws IOException
生成BufferedReader的對象:
BufferedReader in= new BufferedReader(new FileReader("foo.in"));public static void main(String args[]){ FileReader fr = null; BufferedReader br = null; try{ fr = newFileReader("e:/notpad/34/users.txt"); br = new BufferedReader(fr); String line = null; //讀取大文件時 while(true){ line = br.readLine(); if(line == null){ break; } System.out.println(line); } }
設(shè)計模式之裝飾著模式
接口工人worker下有兩個子類水管工plumber,與木匠工carpenter。均實現(xiàn)接口下的doSth()方法。A公司Aworker實現(xiàn)接口worker,Agongs 員工(水管&木匠)說“你好,A公司員工”。。。
//將水管工的對象作為參數(shù)傳入Aworker()這個構(gòu)造函數(shù)中,
//則現(xiàn)在A公司現(xiàn)在worker這個成員變量為水管工。
class Aworkerimplements worker{
private worker worker;
Aworker(worker worker){
this.worker = worker;
}
public void doSth(){
System.out.println("你好,A公司員工");
worker.doSth();
}
}
在test類中:
public static void main(String args[]){
plumber p = new plumber();
//p向上轉(zhuǎn)型為worker類型的參數(shù),傳入Aworker中。Aworker為裝飾著
Aworker A = new Aworker(p);
A.doSth();
}