Java IO學習筆記二

流的概念

  • 在程序中所有的數據都是以流的方式進行傳輸或保存的,程序需要數據的時候要使用輸入流讀取數據,而當程序需要將一些數據保存起來的時候,就要使用輸出流完成。
  • 程序中的輸入輸出都是以流的形式保存的,流中保存的實際上全都是字節文件。

字節流和字符流

  • 實際上字節流在操作時本身不會用到緩衝區(內存),是文件本身直接操作的,而字符流在操作時使用了緩衝區,通過緩衝區再操作文件
  • 在java.io包中操作文件內容的主要有兩大類:字節流、字符流,兩類都分為輸入和輸出操作。在字節流中輸出數據主要是使用OutputStream完成,輸入使的是InputStream,在字符流中輸出主要是使用Writer類完成,輸入流主要使用Reader類完成。(這四個都是抽象類)

操作流程

在Java中IO操作也是有相應步驟的,以文件操作為例,主要的操作流程如下:

  1. 使用File類打開一個文件
  2. 通過字節流或字符流的子類,指定輸出的位置
  3. 進行讀/寫操作
  4. 關閉輸入/輸出

字節流

字節流主要是操作byte類型數據,以byte數組為準,主要操作類就是OutputStreamInputStream

FileOutputStream

  • 文件輸出流是用於將數據寫入 File 或 FileDescriptor 的輸出流。文件是否可用或能否可以被創建取決於基礎平台。特別是某些平台一次只允許一個 FileOutputStream(或其他文件寫入對象)打開文件進行寫入。在這種情況下,如果所涉及的文件已經打開,則此類中的構造方法將失敗。

  • FileOutputStream 用於寫入諸如圖像數據之類的原始字節的流。要寫入字符流,請考慮使用 FileWriter。

  • 主要的功能就是用來向文件中寫入內容的

構造函數

  • FileOutputStream(File file) 創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。
  • FileOutputStream(File file, boolean append) 如果在文件後面追加內容,如果append為true則追加內容
  • FileOutputStream(String name) 創建一個向具有指定名稱的文件中寫入數據的輸出文件流。
  • FileOutputStream(String name, boolean append) 創建一個向具有指定 name 的文件中寫入數據的輸出文件流。

常用的方法

  • close() 關閉文件輸出流
  • void write(byte[] b) 將 b.length 個字節從指定 byte 數組寫入此文件輸出流中。
  • void write(byte[] b, int off, int len) 將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此文件輸出流,這裏需要注意的是中文所佔字節數為3,英文所佔字節數為1
  • void write(int b) 將指定字節寫入此文件輸出流,這個是按照ascii碼寫入文件的,並不是直接寫入的是整數

實例

package File_demo;

import java.io.*;

public class demo {
    public static void main(String[] args) {
        FileOutputStream outputStream = null;
        File file = new File("/tmp" + File.separator + "test.txt");
        try {
            outputStream = new FileOutputStream(file);
            try {
                int data = 48;
                String name = "陳加兵\n";  //使用\n換行
                byte[] bytes = name.getBytes();   //將字符串轉換成byte數組
                outputStream.write(bytes, 0, 3);   //將中文字符串的第一個字寫入,這裏一个中文佔了三個字節
                String age = "chenjiabing\n";  
                outputStream.write(age.getBytes());
                outputStream.write(data);  //這裏的寫入的acsii碼中的(


            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();  //關閉文件流
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }

    }
}

當然也可以一個一個的字節輸出

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Test11 {
    public static void main(String[] args) throws IOException {
        File f = new File("d:" + File.separator+"test.txt");
        OutputStream out=new FileOutputStream(f);//如果文件不存在會自動創建
        String str="Hello World";
        byte[] b=str.getBytes();
        for(int i=0;i<b.length;i++){
            out.write(b[i]);
        }
        out.close();
    }
}

FileInputStream

  • FileInputStream 從文件系統中的某個文件中獲得輸入字節。哪些文件可用取決於主機環境。
  • FileInputStream 用於讀取諸如圖像數據之類的原始字節流。要讀取字符流,請考慮使用 FileReader。
  • 主要的功能是讀取文件中的內容

構造函數

  • FileInputStream(File file) 通過打開一個到實際文件的連接來創建一個 FileInputStream,該文件通過文件系統中的File對file指定。
  • FileInputStream(String name) 通過打開一個到實際文件的連接來創建一個 FileInputStream,該文件通過文件系統中的路徑名 name 指定。

常用方法

  • int read() 從輸入流中讀取數據字節,如果到達文件的末尾就返回-1
  • int read(byte[] b) 將文件中的內容讀取到byte數組中,如果到達文件末尾返回-1
  • int read(byte[] b, int off, int len) 從此輸入流中將最多 len 個字節的數據讀入一個 byte 數組中,這個用於截取字節流,注意這裏中文是佔三個字節
  • long skip(long n) 從輸入流中跳過並丟棄 n 個字節的數據,一旦跳過字節那麼就從跳過的字節的後面開始讀取
  • int available()返回的數據是輸入流中的字節數,如果沒有字節就返回0,因此可以用這個函數判斷文件中是否還有內容

實例

  • 針對知道的文件的大小然後創建一個數組存儲,之後將數組轉換成字符串,當然我們也可以一個一個的讀取
File file=new File("/tmp"+File.separator+"test.txt");
        FileInputStream inputStream=null;
        try {
            inputStream=new FileInputStream(file);

            try {
                byte[] bytes=new byte[(int)file.length()];  //file.length返迴文件的大小,這樣就不會浪內存空間了
                int flag=inputStream.read(bytes);    //將文件的內容讀入到數組中
                System.out.println(new String(bytes));    //將bytes數組轉換成字符串輸出
                System.out.println(flag);
            }catch (IOException e)
            {
                e.printStackTrace();
            }
        }catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }finally {
            if(inputStream!=null)
            {
                try {
                    inputStream.close();
                }catch (IOException e)
                {
                    e.printStackTrace();
                }

            }
        }
  • 一個一個的讀文件
File file=new File("/tmp"+File.separator+"test.txt");
        FileInputStream inputStream=null;
        try {
            inputStream=new FileInputStream(file);

            try {
                int len=0;  //讀取的字節
                int i=0;   //下標
                byte[] bytes=new byte[(int)file.length()];  //創建數組
                while((len=inputStream.read())!=-1)   //判斷是否讀取到文件的末尾
                {
                    bytes[i]=(byte)len;   //將讀到的整形數據轉換成bytes類型的,存儲在數組中
                    i++;
                }
                System.out.println(new String(bytes));   //轉換成字符串

            }catch (IOException e)
            {
                e.printStackTrace();
            }
        }catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }finally {
            if(inputStream!=null)
            {
                try {
                    inputStream.close();
                }catch (IOException e)
                {
                    e.printStackTrace();
                }

            }
        }
  • 使用available控制結束
File file = new File("/tmp" + File.separator + "test.txt");
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);

            try {

                byte[] bytes = new byte[(int) file.length()];  //file.length返迴文件的大小,這樣就不會浪內存空間了
                int i = 0;
                while (inputStream.available() != 0) {
                    try {
                        bytes[i] = (byte) inputStream.read();
                        i++;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }


                }
                System.out.println(new String(bytes));


            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }

字符流

  • 在程序中一個字符等於兩個字節,那麼java提供了Reader、Writer兩個專門操作字符流的類。
  • 前面已經說過字符流要用到緩衝區,因此在關閉字符流的時候一定要刷新緩衝區,清空緩衝區中的內容

字符輸出流

FileWriter

  • 用來寫入字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩衝區大小都是可接受的。
  • FileWriter 用於寫入字符流。要寫入原始字節流,請考慮使用 FileOutputStream
  • 主要功能是向文件中寫入內容

構造函數

  • FileWriter(File file) 根據給定的 File 對象構造一個 FileWriter 對象。
  • FileWriter(File file,boolean append) 追加
  • FileWriter(String fileName) 根據給定的文件名構造一個 FileWriter 對象。
  • FileWriter(String fileName, boolean append) 根據給定的文件名以及指示是否附加寫入數據的 boolean 值來構造 FileWriter 對象。

常用方法

  • write(String str) 將字符寫入文件
  • write(String str,int offest,int len) 截取字符串部分內容寫入文件
  • write(int c) 寫入單個字符,並不是整數
  • close() 關閉流,在關閉之前必須刷新緩衝區
  • flush() 刷新緩衝區

實例

File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
        File f1=new File("/tmp"+File.separator+"test");
        if(!f1.exists())
        {
            f1.mkdir();
            System.out.println("文件創建成功");
        }
        FileWriter fileWriter=null;

        try {
            fileWriter=new FileWriter(file);
            String str="hello chenjiabing\n";
            String name="陳加兵";
            int data=48;
            fileWriter.write(str);   //寫入字符串
            fileWriter.write(name);   //寫入中文字符串,這裏直接寫入不用轉換成byte數組了
            fileWriter.write(data);  //寫入單個字符
        }catch (IOException e)
        {
            e.printStackTrace();
        }finally {
            if(fileWriter!=null)
            {

                try {
                    fileWriter.flush();  //刷新緩衝區
                    fileWriter.close();  //關閉字符流
                }catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }

注意: 這裏字符流如果不關閉的話,那麼就會就會寫入文件失敗,文件中沒有內容,但是如果只有flush而沒有close文件還是會寫入成功的

字符輸入流

FileReader

  • 用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩衝區大小都是適當的
  • 主要的功能是讀取文件內容

構造函數

  • FileReader(File file) 在給定從中讀取數據的 File 的情況下創建一個新 FileReader
  • FileReader(String fileName) 在給定從中讀取數據的文件名的情況下創建一個新 FileReader

常用函數

  • int read(char[] cbuf) 將字符讀入數組。
  • int read() 讀取單個字符,之後使用char類型強制轉換成字符就行
  • read(char[] cbuf, int off, int len) 將字符讀入數組的某一部分。
  • boolean ready() 判斷是否準備讀取此流,如果讀到文件末尾那麼就返回false
  • long skip(long n) 跳過字符。

實例

  • 用字符數組讀取
    “`java
    File file = new File(“/tmp” + File.separator + “test” + File.separator + “test.txt”);
      FileReader fileReader = null;
      try {
          fileReader = new FileReader(file);
          char[] c = new char[(int) file.length()];  //根據文件的大小申請數組大小,不浪費
          try {
              int len = fileReader.read(c);   //將文件的內容讀取到字符數組中
              for (int i = 0; i < c.length; i++) {     
                  System.out.println(c[i]);    //將一個一個字符輸出
              }
          } catch (IOException e) {
              e.printStackTrace();
          }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        if (fileReader != null) {
            try {
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
>* 使用`ready`控制是否讀到文件末尾,當然也可以使用`int read()==-1`判斷

```java
File file = new File("/tmp" + File.separator + "test" + File.separator + "test.txt");
        FileReader fileReader = null;
        try {
            fileReader = new FileReader(file);
            char[] c = new char[(int) file.length()];  //根據文件的大小申請數組大小,不浪費
            try {
                while(fileReader.ready())    //判斷是否讀到文件末尾
                {
                    System.out.println((char)fileReader.read());   //轉換成字符
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

參考文章

  • http://www.cnblogs.com/lich/archive/2011/12/11/2283700.html
  • http://www.cnblogs.com/absfree/p/5415092.html
  • http://blog.csdn.net/zxman660/article/details/7875799
  • http://blog.csdn.net/cynhafa/article/details/6882061
分享