【Java基礎】IO流(1) —— 簡介
【Java基礎】IO流(2) —— 字符流
【Java基礎】IO流(3) —— 字節流
【Java基礎】IO流(4) —— 轉換流、打印流
【Java基礎】IO流(5) —— 序列流、內存流
【Java基礎】IO流(6) —— 隨機訪問文件流、數據流
字符流
文件流
文件輸出流
FileWriter
write(String str)
文件輸入流
FileReader
從文本文件中讀取數據:因為是文本文件所以使用字符流,又因為是讀取,所以使用字符讀取流
因為是文件,所以使用Reader的子類FileReader
int read( ) 一次讀一個字符
int read(char [] arr) 返回的是讀取的字符的個數
復制文件
import java.io.*; class Demo9{public static void main(String[] args){FileWriter fw=null;FileReader fr=null;try{fr=new FileReader("Demo3.java");fw=new FileWriter("Demo3_copy.java");char[] arr=new char[1024];int num;while((num=fr.read(arr))!=-1){fw.write(arr,0,num);}}catch (IOException e){e.printStackTrace();}finally{if (fr!=null)try{fr.close();}catch (IOException e){e.printStackTrace();}if (fw!=null)try{fw.close();}catch (IOException e){e.printStackTrace();}}System.out.println("Hello World!");} }
字符緩沖流
是為了提高讀或寫的效率,緩沖流本身不具備讀或寫的功能,使用緩沖流必須結合讀流或寫流使用。
BufferedReader(Reader r):字符緩沖輸入流
BufferedWriter(Writer w):字符緩沖輸出流
字符緩沖輸出流
newLine() 跨平臺的寫入換行符
//使用字符緩沖輸出流向文本文件中輸出數據
//1. 創建文件輸出流對象和文件向關聯
FileWriter fw=new FileWriter("tt.txt");
//2. 為了提高輸出效率,使用字符緩沖輸出流
//把需要提高效率的輸出流對象作為參數傳遞給
BufferedWriter bw=new BufferedWriter(fw);
for (int i=1;i<=3;i++)
{bw.write("abc"+i);bw.newLine();bw.flush();
}
bw.close();//關閉緩沖流其實就是關閉寫入流
字符緩沖輸入流
readLine() 一次讀一行,返回的一行不包括換行符
//使用字符緩沖輸入流實現讀取文本文件
//1. 創建文件讀取流對象和文件相關聯
FileReader fr=new FileReader("tt.txt");
//2.為了提高讀的效率,把文件讀取流對象作為參數傳遞給BufferedReader
BufferedReader br=new BufferedReader(fr);
String line=null;
while ((lin=br.readLine())!=null){System.out.println(line);
}
br.close();
行號LineNumberReader
FileReader fr=new FileReader("tmp.txt");
LineNumberReader bnr =new LineNumberReader(fr);
String line=null;
while((line=bnr.readLine())!=null){System.out.println(bnr.getLineNumber()+":"+line);
}
bnr.close();
模擬
模擬BufferedReader,自定義一個MyBufferedReader
提高效率,提供一個緩沖區
class MyBufferedReader{private char[] arr=new char[1024]; //緩沖區private int index; //記錄緩沖區使用的下標private int count; //記錄緩沖區中字符的個數private Reader r; //具備讀功能的流MyBufferedReader(Reader r){this.r=r;}//一次讀一個字符的功能public int myRead()throws IOException{//判斷緩沖區中是否有字符if(count==0){//讀取一批count = r.read(arr);index=0;}if(count<0)return -1;int num = arr[index];index++;count--;return num;}//一次讀一行的功能public String myReadLine()throws IOException{//反復調用一次讀一個字符的功能,當夠一行時返回StringBuilder sb=new StringBuilder();int num;while((num=myRead())!=-1){if(num=='\r')continue;else if(num=='\n')return sb.toString();elsesb.append((char)num);}return null;}public void myClose()throws IOException {r.close();}
}class Demo1 {public static void main(String[] args) throws IOException{FileReader fr=new FileReader("tmp.txt");MyBufferedReader mbr=new MyBufferedReader(fr);String line=null;while((line=mbr.myReadLine())!=null){System.out.println(line);}mbr.myClose();}
}