黑馬程序員java學習,IO字符流

  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;
}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章