IO流分爲字符流和字節流,字符流的抽象基類是Reader和Writer,而字節流的抽象基類OutputStream InputStream.
當然也可以將IO流分爲輸入流和輸出流。
代碼示例:
public static voia main(String[] args)throws IOException {//爲了演示,拋出異常
FileWriter fw=new FileWriter("kingkong.txt");
fw.write("I am hero.");
fw.flush();
//close和flush區別是,flush刷新後會繼續使用
fw.close();
}
對於異常處理方式:
FileWriter fw=null;
try{
fw=new FileWriter("demo.txt");
fw.write("weizhenhua");
}
catch(IOException e){e.printStack();}
finally
{
try{
//當fw創建不成功的時候,fw不能使用close方法,所以進行判斷
if(fw!=null)
fw.close();
}
catch(IOException e) {e.printStack();}
}
文本文件的讀取流對象
FileReader fr=new FileReader("demo.txt");
fr.read();
read一次讀一個字符,且自動往下讀
定義一個字符數組,用於存儲讀到字符
該read(char[])返回的是讀到字符個數
char[] buf=new char[4];
int num=fr.read(buf);
fr.close();
實例代碼:
public static void main(String[] args)throws IOException
{
FileReader fr=new FileReader("demo.txt");
char[] buf=new char[1024];
int num=0;
while((num=fr.read(buf))!=-1){System.out.println(new String(buf,0,num));}
fr.close();
}
//在D盤創建一個文件,用於存儲C盤文件中的數據
//定義讀取流和C盤文件關聯
//通過不斷的讀取完成數據存儲
//關閉資源
class CopyText{
public static void copy_1()throws IOException{
//創建目的地址
FileWriter fw=new FileWriter("d:\destination.txt");
//C盤文件中讀取一個字符,再往D盤寫一個字符
FileReader fr=new FileReader("c:\resourse.txt");
int ch=0;
while((ch=fr.read())!=-1){
fw.write(ch);
}
fw.close();
fr.close();
}
public static void copy_2()
{
FileWriter fw=null;
FileReader fr=null;
try{
fw=new FileWriter("d:\destination.txt");
fr=new FileReader("c:\resourse.txt");
char[] buf=new char[1024];
int len=0;
while((len=fr.read(buf))!=-1){
fw.write(buf,0,len);
}
}
catch()
{
throw new RuntimeException("讀寫失敗");
}
finally{
if(fr!=null)
try{fr.close();}
catch(IOException e){}
if(fw!=null)
try{fw.close();}
catch(IOException e){}
}
}
}
-------------------------------------------------
字符流的緩衝區
緩衝在創建緩衝區之前,必須要先有流對象
//創建一個字符寫入流對象
FileWriter fw=new FileWriter("buf.txt");
BufferedWriter bufw=new BufferedWriter(fw);
bufw.write("weizhenhua");
//只要用到緩衝區,必須刷新
bufw.flush();
//關閉緩衝區就是在關閉緩衝區中的流對象
bufw.close();
fw.close();
BufferedReader
//創建一個讀取流對象和文件相關聯
FileReader fr=new FileReader("buf.txt");
BufferedReader bufr=new BufferedRead(fr);
//readLine是整行讀取
String line=null;
while((line=bufr.readLine())!=null){}
bufr.close();
運用緩衝區複製文本文件
public static void main(String[] args){
BufferedReader bufr=null;
BufferedWriter bufw=null;
try{
bufr=new BufferedReader(new FileReader("a.txt"));
bufw=new BufferdeWriter(new FileWriter("b.txt"));
String line=null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.flush();
}
}
catch(IOException e)
{throw new RuntimeException("failed");}
finally{
try{
if(bufr!=null)
bufr.close);
}catch(IOException e){throw new RuntimeException("failed");}
try{
if(bufw!=null)
bufw.close();
}catch(IOException e){throw new RuntimeException("failed");}
}
}
readLine方法返回的時候不返回回車符
readLine方法原理:無論是讀一行,還是讀取多個字符,都是一個一個的讀取字符,read()
readLine實例代碼:
Public String myReadLine()throws IOException{
FileRaader fr=new FileReader("a.txt");
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=fr.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
裝飾設計模式
class MyBufferedReader{
private FileReader r;
MyBufferedReader(FileReader r){
this.r=r;
}
}
當想要對已有的對象進行功能增強時,可以定義類,將已經有的對象傳入,基於已有功能,並提供加強功能
那麼自定義的類稱爲裝飾類。
裝飾比繼承靈活,避免了繼承體系的臃腫。
FileReader fr=new FileReader("a.txt");
LineNumberReader lnr=new LineNumberReader(fr);
String line=null;
lnr.setLineNumber(22);
while((line=lnr.readerLine())!=null){}lnr.close();
包裝類MyLineNumberReader
class MyLineNumberReader{
private Reader r;
private int lineNumber=0;
MyLineNumberReader(Reader r){
this.r=r;
}
public int getLineNumber(){
return this.lineNumber;
}
public void setLineNumber(int lineNum){
this.lineNumber=lineNum;
}
Public String myReadLine()throws IOException{
lineNumber++;
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
}