IO即輸入與輸出,Java把不一樣來源和目標的數據抽象爲流,在此基礎上對流進行數據操做java
頂層父類 | 描述 |
---|---|
InputStrream | 輸入字節流 |
OutputStream | 輸出字節流 |
Reader | 輸入字符流 |
Writer | 輸出字符流 |
demo數組
import java.io.*; public class IoTest { public static void main(String[] args) throws IOException { FileInputStream fi=new FileInputStream("a.txt"); FileOutputStream fo=new FileOutputStream("b.txt"); int len; byte[] buffer=new byte[1024*8];//緩衝區大小 while ((len=fi.read(buffer))!=-1)//read()返回-1表示到結尾,返回正數表示讀到的有效字節數 fo.write(buffer,0,len); fi.close(); fo.close(); } }
FileOutputStream的追加模式app
FileOutputStream(File file, boolean append) //建立文件輸出流,將append設置爲1即爲追加模式
demo框架
import java.io.*; public class IoTest { public static void main(String[] args) throws IOException { BufferedInputStream fi=new BufferedInputStream(new FileInputStream("a.txt")); BufferedOutputStream fo=new BufferedOutputStream(new FileOutputStream("b.txt")); int temp; while ((temp=fi.read())!=-1)//read()返回-1表示到結尾 fo.write(temp); fi.close(); fo.close(); } }
默認緩衝區大小是8192字節編碼
private static int DEFAULT_BUFFER_SIZE = 8192;
flush和close方法的區別code
序列流能夠把多個字節輸入流整合成一個輸入流, 從序列流中讀取數據時, 按照整合順序一一讀取對象
整合兩個字節流blog
FileInputStream fis1 = new FileInputStream("a.txt"); //建立輸入流對象,關聯a.txt FileInputStream fis2 = new FileInputStream("b.txt"); //建立輸入流對象,關聯b.txt SequenceInputStream sis = new SequenceInputStream(fis1, fis2); //將兩個流整合成一個流 FileOutputStream fos = new FileOutputStream("c.txt"); //建立輸出流對象,關聯c.txt int b; while((b = sis.read()) != -1) { //用整合後的讀 fos.write(b); //寫到指定文件上 } sis.close(); fos.close();
整合多個字節流接口
FileInputStream fis1 = new FileInputStream("a.txt"); //建立輸入流對象,關聯a.txt FileInputStream fis2 = new FileInputStream("b.txt"); //建立輸入流對象,關聯b.txt FileInputStream fis3 = new FileInputStream("c.txt"); //建立輸入流對象,關聯c.txt Vector<InputStream> v = new Vector<>(); //建立vector集合對象 v.add(fis1); //將流對象添加 v.add(fis2); v.add(fis3); Enumeration<InputStream> en = v.elements(); //獲取枚舉引用 SequenceInputStream sis = new SequenceInputStream(en); //傳遞給SequenceInputStream構造 FileOutputStream fos = new FileOutputStream("d.txt"); int b; while((b = sis.read()) != -1) { fos.write(b); } sis.close(); fos.close();
FileInputStream fi=new FileInputStream("a.txt"); ByteOutputStream bo=new ByteOutputStream(); int temp; while ((temp=fi.read())!=-1)//read()返回-1表示到結尾 bo.write(temp);//將字節寫入內存 System.out.println(bo);//將內存中的字節轉換爲字符再打印 fi.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.txt")); Person p1 = (Person) ois.readObject(); Person p2 = (Person) ois.readObject(); System.out.println(p1); System.out.println(p2); ois.close();
FileReader fr = new FileReader("aaa.txt");//建立字符輸入流,關聯aaa.txt FileWriter fw = new FileWriter("bbb.txt");//建立字符輸出流,關聯bbb.txt int len; char[] arr = new char[1024*8];//建立字符數組 while((len = fr.read(arr)) != -1) {//將數據讀到字符數組中 fw.write(arr, 0, len);//從字符數組將數據寫到文件上 } fr.close();//關流釋放資源 fw.close();
BufferedReader br = new BufferedReader(new FileReader("aaa.txt"));//建立字符輸入流對象,關聯aaa.txt BufferedWriter bw = new BufferedWriter(new FileWriter("bbb.txt"));//建立字符輸出流對象,關聯bbb.txt int ch; while((ch = br.read()) != -1) {//read一次,會先將緩衝區讀滿,從緩衝去中一個一個的返給臨時變量ch bw.write(ch);//write一次,是將數據裝到字符數組,裝滿後再一塊兒寫出去 } br.close();//關流 bw.close();
readLine()和newLine()方法內存
BufferedReader br = new BufferedReader(new FileReader("a.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt")); String line; while((line = br.readLine()) != null) { bw.write(line); bw.newLine();//跨平臺的 } br.close(); bw.close();
InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt"),"utf-8");//按照urf-8讀a.txt OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("b.txt"),"gbk");//按照gbk寫入到b.txt int temp; while ((temp=isr.read())!=-1)//read()返回-1表示到結尾 osw.write(temp); isr.close(); osw.close();
LineNumberReader lnr = new LineNumberReader(new FileReader("a.txt")); String line; lnr.setLineNumber(100);//設置行號,從101開始打印,但仍是對應第一行 while((line = lnr.readLine()) != null) { System.out.println(lnr.getLineNumber() + ":" + line);//獲取行號 } lnr.close();
FileInputStream fis =null; FileOutputStream fos =null; try( fis = new FileInputStream("aaa.txt"); fos = new FileOutputStream("bbb.txt"); int b; while((b = fis.read()) != -1) { fos.write(b); } )finally{ try{ if(fis!=null)//輸入流若是打開了 fis.close; }finally{ if(fos!=null)//輸出流若是打開了 fos.close; } }
try( FileInputStream fis = new FileInputStream("aaa.txt"); FileOutputStream fos = new FileOutputStream("bbb.txt"); ){ int b; while((b = fis.read()) != -1) { fos.write(b); } }