Java IO流

IO流框架

IO框架

IO流概述

IO即輸入與輸出,Java把不一樣來源和目標的數據抽象爲流,在此基礎上對流進行數據操做java

IO流分類

  • 按流向分:
    1. 輸入流
    2. 輸出流
  • 按操做類型分:
    1. 字節流 : 面向字節,非必須緩衝區,可處理任意文件
    2. 字符流 : 面向字符(多是多個字節),必須緩衝區,通常處理文本

IO流頂層父類皆爲抽象類

頂層父類 描述
InputStrream 輸入字節流
OutputStream 輸出字節流
Reader 輸入字符流
Writer 輸出字符流

IO使用流程

  1. 使用前,導入IO包中的類
  2. 使用時,進行IO異常處理
  3. 使用後,釋放資源

字節流

FileInputStream,FileOutputStream(簡單字節流)

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即爲追加模式

BufferedInputStream,BufferOutputStream(自建緩衝區)

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

  • flush()方法用來刷新緩衝區的,將緩衝中的數據寫入
  • close()方法用來關閉流釋放資源的的,若是是帶緩衝區的流對象的close()方法,會先調用flush()在調用close()關閉流

SequenceInputStream(序列流)

序列流能夠把多個字節輸入流整合成一個輸入流, 從序列流中讀取數據時, 按照整合順序一一讀取對象

整合兩個字節流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();

ByteArrayInputStream,ByteArrayOutputStream(內存流)

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,ObjectOutputStream(對象流)

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,FileWriter(簡單字符流)

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,BufferedWriter(自建緩衝區)

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()方法內存

  • readLine()方法能夠讀取一行字符(不包含換行符號)
  • newLine()能夠輸出一個跨平臺的換行符號"\r\n"
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,OutputStreamWriter(指定字符編碼)

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 (記錄行號)

  • LineNumberReader是BufferedReader的子類, 具備相同的功能, 而且能夠統計行號
    • 調用getLineNumber()方法能夠獲取當前行號
    • 調用setLineNumber()方法能夠設置當前行號
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();

IO流異常處理

方法一

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);
    }
}
  • 在try()中建立的流對象必須實現了AutoCloseable這個接口,若是實現了,在try後面的{}(讀寫代碼)執行後就會自動調用,流對象的close方法將流關掉
相關文章
相關標籤/搜索