java學習筆記之IO編程—字節流和字符流

1. 流的基本概念

在java.io包裏面File類是惟一一個與文件自己有關的程序處理類,可是File只可以操做文件自己而不能操做文件的內容,或者說在實際的開發之中IO操做的核心意義在於:輸入與輸出操做。輸入和輸出實質上傳遞的就是一種數據流的處理形式,數據流指的是字節數據 。而對於這種流的處理形式在java.io包裏面提供有兩類支持。java

  • 字節處理流:OutputStream(輸出字節流)InputStream(輸入字節流)
  • 字符處理流:Writer(輸出字符流)Reader(輸入字符流) 

流操做的統一處理步驟(以文件處理流程爲例):數組

  • 果如今要進行的是文件的讀寫操做,則必定要經過File類找到一個文件路徑
  • 經過字節流或字符流中的方法來實現數據的輸入與輸出操做
  • 流的操做屬於資源操做,資源操做必須進行關閉處理

2.字節輸出流:OutputStream類

字節的數據是以byte類型爲主實現的操做,在進行字節內容的輸出的時候可使用OutputStream類完成app

類的基本定義:spa

  • public abstract class OutputStream extends Object implements Closeable, Flushable

三個內容輸出的方法:code

  • 輸出一組字節數據:public void write​(byte[] b) throws IOException
  • 輸出部分字節數據:public void write​(byte[] b,int off,int len)throws IOException
  • 輸出單個字節數據:public abstract void write​(int b)throws IOException

注意:對象

OutputSream是一個抽象類,若是想要得到實例化對象應該經過對子類實例的向上轉型完成,若是說如今要進行的是文件處理操做,則可使用FileOutputStream子類blog

FileOutputStream構造方法:資源

  • public FileOutputStream​(File file)throws FileNotFoundException
  • public FileOutputStream​(File file,boolean append)throws FileNotFoundException

 

範例:使用OutputStream類實現內容輸出(符合上述的流操做的統一處理步驟)開發

import java.io.*;

public class OutputStreamDemo {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        File file = new File("D:"+File.separator+"hello"
        +File.separator+"demo.txt");         //1.指定要操做的文件路徑
        if(!file.getParentFile().exists()) { //文件不存在
            file.getParentFile().mkdirs();   //建立父目錄
        }
        try (OutputStream output = new FileOutputStream(file,true)) {//2.經過子類實例化
        String str = "hello world\r\n"; //要輸出的文件內容
        output.write(str.getBytes());//3.將字符串變爲字節數組並輸出
        } catch (IOException e) {
            e.printStackTrace();
        }//4.AutoCloseable 自動關閉
        //執行後會自動幫助用戶建立文件
    }

}

 

3.字節輸入流:InputStream類

類的基本定義:字符串

  • public abstract class InputStream extends Object implements Closeable

核心方法:

  • 讀取單個字節數據,若是以及讀取到底,返回-1:public abstract int read() throws IOException
  • 讀取一組字節數據,返回的是讀取的個數,若是沒有則返回-1:public int read​(byte[] b) throws IOException
  • 讀取一組字節數據的部份內容(只佔數組的部分):public int read​(byte[] b,int off,int len) throws IOException

InputoutStream和OutputStream同樣都屬於抽象類,要依靠子類來實例化對象

FileInputStream構造方法:

  • public FileInputStream​(File file) throws FileNotFoundException

 

範例:讀取數據

import java.io.*;

public class InputStreamDemo {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        File file = new File("D:"+File.separator+"hello"
                +File.separator+"demo.txt");//讀取的文件路徑
        InputStream input = new FileInputStream(file);
        byte[] data = new byte[1024];//用於存放讀取出的內容的緩衝區
        int len = input.read(data);//讀取的內容長度
        System.out.println("【"+new String(data,0,len)+"】");//輸出緩衝區讀取的內容
        input.close();
    }

}

 

4.字符輸出流:Writer類

OutputStream數據輸出的時候使用的是字節,而不少時候字符串的輸出是比較方便的,因此在JDK1.1時推出字符輸出流

類的基本定義:

  • public abstract class Writer extends Object implements Appendable, Closeable, Flushable

兩個主要的輸出方法:

  • 輸出字符數組:public void write​(char[] cbuf)throws IOException
  • 輸出字符串:public void write​(String str)throws IOException

 

範例:使用Writer輸出

import java.io.*;

public class WriterDemo {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        File file = new File("D:"+File.separator+"hello"
                +File.separator+"demo.txt");         //1.指定要操做的文件路徑
        if(!file.getParentFile().exists()) { //文件不存在
            file.getParentFile().mkdirs();   //建立父目錄
        }
        Writer out = new FileWriter(file,true);
        String str = "goodbye world\r\n";
        out.write(str);
        out.append("hahahaha");//追加輸出內容
        out.close();
    }

}

 

5.字符輸入流:Reader類

類的基本定義:

  • public abstract class Reader extends Object implements Readable, Closeable

輸入方法:

  • 讀取單個字節數據,若是以及讀取到底,返回-1:public abstract int read() throws IOException
  • 讀取一組字節數據,返回的是讀取的個數,若是沒有則返回-1:public int read​(byte[] b) throws IOException
  • 讀取一組字節數據的部份內容(只佔數組的部分):public int read​(byte[] b,int off,int len) throws IOException

字符流讀取的時候只可以按照數組的形式來實現處理操做,不可以直接按照字符串的形式

 

範例:實現數據讀取

import java.io.*;

public class ReaderDemo {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        File file = new File("D:"+File.separator+"hello"
                +File.separator+"demo.txt");   
        if(file.exists()) {
            Reader in = new FileReader(file);
            char[] data = new char[1024];
            int len = in.read(data);
            System.out.println(new String(data,0,len));
            in.close();
        }
    }

}

 

6.字節流和字符流大的區別

    在使用OutputStream類輸出的時候若是沒有使用close()方法關閉輸出流發現內容依然能夠實現正常的輸出
可是若是在使用Writer的時候沒有使用close()方法關閉輸出流,那麼這個內容將沒法進行輸出,由於Writer使
用到緩衝區,當使用了close()方法的時候實際上會出現有強制刷新緩衝區的狀況,因此這個時候會將內容進行
輸出操做,因此此時若是在不關閉的狀況下想要將所有內容輸出可使用flush()方法強制狀況緩衝區

    字符流的優點在於處理中文數據上

 

7.轉換流

    轉換流就是能夠實現字節流與字符流操做的功能轉換,例如:進行輸出的時候OutputStream須要將內容變
爲字節數組後才能夠輸出,而Writer能夠直接輸出字符串,這一點是方便的,因此不少人就認爲須要提供一種
轉換的機制,來實現不一樣的流類型的轉換操做,爲此在java.io包裏面提供有兩個類:InputStreamReader
OutputStreamWriter。

類:           OutputStreamWriter                                                            InputStreamReader

定義:       public class OutputStreamWriter extends Writer                public class InputStreamReader extends Reader

構造方法:public OutputStreamWriter​(OutputStream out)                   public InputStreamReader​(InputStream in)

從構造方法能夠看出,所謂的轉換處理,就是將接收到的字節流對象向上轉型變爲字符流對象

 

範例:轉換流

import java.io.*;

public class OutputStreamWriterDemo {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        File file = new File("D:"+File.separator+"hello"
                +File.separator+"demo.txt");   
        if(!file.getParentFile().exists()) { //文件不存在
            file.getParentFile().mkdirs();   //建立父目錄
        }
        OutputStream output = new FileOutputStream(file,true);
        Writer out = new OutputStreamWriter(output);
        out.write("i am back");
        out.close();
    }

}
相關文章
相關標籤/搜索