1. 程式人生 > >Java Api之IO流輸入與輸出

Java Api之IO流輸入與輸出

1輸入與輸出

input

某個裝置或者環境進行資料的輸入

output

某個裝置或者環境進行資料的輸出

在java中,java將輸入輸出抽象為流物件(IO流)來解決,我們以檔案裝置來解釋:

 輸入流

從檔案讀取資料或者從鍵盤輸入資料

輸出流

向檔案寫入資料

Io流在java中又分為位元組流和字元流:

位元組流

所有檔案的儲存是都是位元組(byte)的儲存,在磁碟上保留的並不是檔案的字元而是先把字元編碼成位元組,再儲存這些位元組到磁碟。在讀取檔案(特別是文字檔案)時,也是一個位元組一個位元組地讀取以形成位元組序列

字元流

字元流處理的單元為2個位元組的Unicode字元,分別操作字元、字元陣列或字串,而位元組流處理單元為1個位元組,操作位元組和位元組陣列。所以字元流是由Java虛擬機器將位元組轉化為2個位元組的Unicode字元為單位的字元而成的,所以它對多國語言支援性比較好!

2、字元流

 字元輸出流超類

字元輸出流子類

Writer

FileWriter

BufferedWriter

字元輸入流超類

字元輸入流子類

 Reader

FileReader

BufferedReader

(1)  字元輸出流FileWriter

FileWriter的構造方法:

  FileWriter(File file)

根據給定的file物件構造一個FileWriter物件

  FileWriter(String filename)

根據給定的檔名物件構造一個FileWriter物件


舉例:使用字元流向一個檔案輸出Hello World!

步驟:

1) 建立檔案;

2) 建立輸出流物件;

3) 把輸出流物件指向檔案;

4) 清空快取。

5) 關閉輸出流

package com.file;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileCreate {
    public static void main(String[] args) {
        //建立file物件
        File file=null;
        FileWriter fw=null;
        try {
            //建立檔案
            file=new File("D:/test/newFile.txt");
            file.createNewFile();
            //建立檔案輸出流
            fw=new FileWriter(file);
            //把內容寫入檔案
            fw.write("Hello World!");
            //清空快取,把內容寫入檔案
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fw!=null){
                try {
                    //關閉輸出流
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

      當我們每次使用輸出流向檔案裡寫輸出資料的時候,寫入資料會覆蓋檔案裡原有資料,若是我們想要檔案裡原有資料不被覆蓋,我們可使用FileWrite的追加構造方法:

FileWriter(File file,boolean append)

構造方法的第二個boolean引數用來表示是否追加

FileWriter(String filename, boolean append)

     例如我們再向上例中Hello World!後追加Hello China!

package com.file;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileCreate {
    public static void main(String[] args) {
        //建立file物件
        File file=null;
        FileWriter fw=null;
        try {
            //建立檔案
            file=new File("D:/test/newFile.txt");
            file.createNewFile();
            //建立檔案輸出流,輸出資料將追加在檔案中原有資料後面
            fw=new FileWriter(file,true);
            //把內容寫入檔案
            fw.write("Hello China!");
            //清空快取,把內容寫入檔案
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fw!=null){
                try {
                    //關閉輸出流
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

從上裡可以看出,兩次輸入的資料(Hello World!Hello China!)是在一行,如果我們想讓追加後的資料另起一行呢

在輸入資料時“\r\n”表示換行,效果如下:

package com.file;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileCreate {
    public static void main(String[] args) {
        //建立file物件
        File file=null;
        FileWriter fw=null;
        try {
            //建立檔案
            file=new File("D:/test/newFile.txt");
            file.createNewFile();
            //建立檔案輸出流,輸出資料將追加在檔案中原有資料後面
            fw=new FileWriter(file,true);
            //把內容寫入檔案,並換行
            fw.write("Hello Beijing!\r\n");
            //清空快取,把內容寫入檔案
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fw!=null){
                try {
                    //關閉輸出流
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在windows系統中“\r\n”表示換行

在Linux系統中“\n”表示換行

在ios系統中“\r”表示換行

FilterWriter的writer方法還有其他寫入功能:

writer(Char[ ] chuf)

寫入字元陣列

writer(Char[ ] chuf,int offset,int length)

寫入字元陣列的某一部分

writer(int i)

寫入單個字元(int轉換為ASCII)

writer(String str)

寫入字串

writer(String [ ] str,int offset,int length)

寫入字串的某一一部分

其他相關方法清查與API

(2)字元輸入流FileReader

FileReader的構造方法:

FileReader(File file)

在給定從中讀取資料的File的情況下傳建一個新的FileReader

FileReader(String fileName)

在給定從中讀取資料的File檔名的情況下傳建一個新的FileReader


舉例:使用字元流從一個檔案讀取資料!

  步驟:

1) 建立輸入流物件;

2) 把輸出流物件指向檔案;

3) 讀取資料;

4) 關閉輸入流。

package com.file;

import java.io.*;

public class FileIO {
    public static void main(String[] args) {
        //建立FileReader物件
        FileReader fr=null;
        try {
            //把輸入流指向需要讀取的檔案
            fr=new FileReader("D:/test/newFile.txt");
            //建立字元陣列
            char[] chars=new char[1024];
            int num=-1;
            //讀取資料,如果讀取完畢,則num將返回-1
            while ((num=fr.read(chars))!=-1){
                //將字元陣列中資料轉換為字串並輸出到控制檯
                String str=new String(chars,0,num);
                System.out.println(str);
            }

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

  (3)字元輸入流之BufferedReade

       BufferedReader 由Reader類擴充套件而來,提供通用的緩衝方式文字讀取,而且提供了很實用的readLine,讀取一個文字行,從字元輸入流中讀取文字,緩衝各個字元,從而提供字元、陣列和行的高效讀取。

BufferedReader提供了readLine()方法來讀取一行資料

package com.file;

import java.io.*;

public class FileIO {
    public static void main(String[] args) {
        //建立FileReader物件
        FileReader fr=null;
        //BufferedReader
        BufferedReader br=null;
        try {
            //把輸入流指向需要讀取的檔案
            fr=new FileReader("D:/test/newFile.txt");
            //用BufferedReader包裝FileReader
            br=new BufferedReader(fr);
            //建立字串
            String str=null;
            //讀取資料,如果讀取完畢,則str將返回null
            while ((str=br.readLine())!=null){
                //將字串輸出到控制檯
                System.out.println(str);
            }

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


(4)字元輸入流之BufferedWriter

       將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入。可以指定緩衝區的大小,或者接受預設的大小。在大多數情況下,預設值就足夠大了。 該類提供了 newLine() 方法,它使用平臺自己的行分隔符概念。

package com.file;

import java.io.*;

public class FileCreate {
    public static void main(String[] args) {
        //建立file物件
        File file=null;
        FileWriter fw=null;
        BufferedWriter bw=null;
        try {
            //建立檔案
            file=new File("D:/test/newFile.txt");
            if (!file.exists()){
                file.createNewFile();
            }
            //建立檔案輸出流,輸出資料將追加在檔案中原有資料後面
            fw=new FileWriter(file,true);
            //用BufferedWriter包裝FileWriter
            bw=new BufferedWriter(fw);
            //把內容寫入檔案,並換行
            bw.write("Hello Xian!");
            bw.newLine();
            bw.write("Hello madi");
            //清空快取,把內容寫入檔案
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fw!=null){
                try {
                    //關閉輸出流
                    bw.close();
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


3、位元組流

(1)位元組輸出流OutputStream

       OutputStream是整個IO包中位元組輸出流的最大父類,此類是一個抽象類,如果想要使用此類的話,則首先必須通過子類例項化物件,那麼如果現在要操作的是一個檔案,則可以使用:FileOutputStream類。通過向上轉型之後,可以為OutputStream例項化。具體事例如下:

package com.file;

import java.io.*;

public class OutputStreamDemo {
    public static void main(String[] args) {
        //建立檔案物件
        File file = new File("D:/test/newFile2.txt");
        //宣告輸出流
        OutputStream os=null;
        try {
            //將輸出流指向檔案物件
            os=new FileOutputStream(file);
            String str="Hello World";
            byte[] bytes=str.getBytes();
            //向指定檔案輸出資料
            os.write(bytes);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(os!=null){
                try {
                    //關閉輸出流
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }}}


2)位元組輸入流InputStream

      既然程式可以向檔案中寫入內容,則就可以通過InputStream從檔案中把內容讀取進來,

     與OutputStream類一樣,InputStream本身也是一個抽象類,必須依靠其子類,如果現在是從檔案中讀取,就用FileInputStream來實現。具體事例如下:

package com.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamDemo {
    public static void main(String[] args) {
        //構造一個檔案輸入流物件
        InputStream is=null;
        try {
            //將輸入流物件指向檔案
            is=new FileInputStream("D:/test/newFile2.txt");
            byte[] bytes=new byte[1024];
            //temp用來儲存讀入的位元組長度
            int temp;
            //迴圈讀取資料
            while ((temp=is.read(bytes))!=-1){
                String str=new String(bytes,0,temp);
                System.out.print(str);
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (is!=null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    }

3)位元組輸入流之InputStreamReader

        InputStreamReader將位元組流轉換為字元流。是位元組流通向字元流的橋樑。如果不指定字符集編碼,該解碼過程將使用平臺預設的字元編碼。

    構造方法:

構造一個預設編碼集的InputStreamReader類

InputStreamReader isr = new InputStreamReader(InputStream in);

構造一個指定編碼集的InputStreamReader類

InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName);

package com.file;

import java.io.*;

public class InputStreamDemo {
    public static void main(String[] args) {
        //構造一個檔案輸入流物件
        InputStream is=null;
        InputStreamReader isr=null;
        try {
            //將輸入流物件指向檔案
            is=new FileInputStream("D:/test/newFile2.txt");
            //用InputStreamReader包裝FileInputStream
            isr=new InputStreamReader(is);
            char[] chars=new char[1024];
            //temp用來儲存讀入的位元組長度
            int temp;
            //迴圈讀取資料
            while ((temp = isr.read(chars))!= -1){
                String str=new String(chars,0,temp);
                System.out.print(str);
            }

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

    }
    }

4)位元組輸出流之OutputStreamWriter

       OutputStreamWriter將位元組流轉換為字元流。是位元組流通向字元流的橋樑。如果不指定字符集編碼,該解碼過程將使用平臺預設的字元編碼。

    構造方法:

構造一個預設編碼集的OutputStreamWriter類

OutputStreamWriter osw = new OutputStreamWriter(OutputStream out);

構造一個指定編碼集的OutputStreamWriter類

OutputStreamWriter osw = new OutputStreamWriter(OutputStream out,String charsetName);

package com.file;

import java.io.*;

public class OutputStreamDemo {
    public static void main(String[] args) {
        //建立檔案物件
        File file = new File("D:/test/newFile2.txt");
        //宣告輸出流
        OutputStream os=null;
        //宣告OutputStreamWriter物件
        OutputStreamWriter osw=null;
        try {
            //將輸出流指向檔案物件
            os=new FileOutputStream(file,true);
            //用OutputStreamWriter包裝OutputStream
            osw=new OutputStreamWriter(os);
            String str="\r\nHello China!";
            //向指定檔案輸出資料
            osw.write(str);
            osw.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (osw!=null){
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(os!=null){
                try {
                    //關閉輸出流
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }
}





相關推薦

Java ApiIO輸入輸出

1輸入與輸出 input 某個裝置或者環境進行資料的輸入 output 某個裝置或者環境進行資料的輸出 在java中,java將輸入輸出抽象為流物件(IO流)來解決,我們以檔案裝置來解釋:  輸入流 從檔案讀取資料或者從鍵盤輸入資料 輸出流

python路--day1--輸入輸出&&數據類型

test 整體 lis 相同 msg app 字符類型 身份證 [] 輸入與輸出 輸出print() 在括號中加上字符,輸出相應字符。 >>>print("hello world!") hello world! 多行輸出 >>>pr

Java學習IO

今天 bit string轉換 tin path 編碼表 父類 二進制 指定編碼 轉載鏈接:https://blog.csdn.net/zhaoyanjun6/article/details/54292148 Java流類圖結構: 流的概念和作用 流是一組有順序的,有起點

java基礎IO(一)

目標 構造方法 play pub io流 ted ima str 有一個 java基礎之IO流(一)之字節流   IO流體系太大,涉及到的各種流對象,我覺得很有必要總結一下。   那什麽是IO流,IO代表Input、Output,而流就是原始數據源與目標媒介的數據傳輸的一種

Linux命令列使用命令列輸入輸出

          與DOS類似,Shell 程式通常自動開啟3個標準文件:標準輸入文件(stdin)、標準輸出文件(stdout)和標準錯誤輸出文件(stderr)。其中 stdin 一般對應終端鍵盤,stdout 和 stderr 對應終端螢

Java基礎IO小結

      Java程式中對於資料的輸入和輸出操作是以流的方式進行的。一個流可以被定義為一個數據序列。我們可以理解為:流是用來讀寫資料的。Java語言提供的java.io包可以很方便的讓我們對資料進行輸入和輸出操作。本文將和大家分享學習Java IO流的相關基礎知識。 一、

java學習IO(11.25)

今天學習了通過FileInputStream的int read(byte[] bytes)方法,一次讀取多個位元組,期間回顧了通過String的構造方法將byte陣列轉換成String型別。通過while迴圈和read方法傳入byte陣列,迴圈讀取較大檔案,以及

Java基礎IO(位元組、字元、記憶體、帶快取的、序列化和反序列化)

File類:File類提供了對檔案的操作,可以通過字串或URI來構建一個File類物件。通過物件,可以實現檔案的建立(createNewFile)、刪除(delete)、獲得檔名(getName)、獲得父目錄物件(getParentFile)、獲得父目錄名稱(

java原始碼 io 原始碼解讀(一)

    剛剛喝了一波毒雞湯,其中印象最深的就是這兩個:             沒有人能夠讓你放棄夢想,自己想想就放棄了。             找物件的時候不能光看對方的外表。。。。  還要看看自己的外表    哈哈哈~~     吸收了這一大波精氣之後,我感覺我的

黑馬程式設計師--JAVA基礎IO

一 IO流的三種分類方式:  1.按照流向來分:                輸入流:只能從中讀取位元組資料,不能向其寫出資料                      輸出流:只能向其寫入位元組資料,不能從中讀取資料  2.按照流所處理的資料型別劃分:可分為: 位元組流:用於處理位元組

java程式設計——IO應用總結

------- android培訓、java培訓、期待與您交流! --------- IO流(掌握) (1)IO流的分類: A:位元組流 位元組輸入流 InputStream 位元組輸出流 OutputStream B:字元流 字元輸入流 Reader 字元輸出流 Wri

java基礎IO及遞歸理解

示例代碼 font hid 再次 調用方法 反斜杠 filter amp 遞歸 一、IO流(簡單理解是input/output流,數據流內存到磁盤或者從磁盤到內存等) 二、File類(就是操作文件和文件夾的) 1、FIleFile類構造方法 註意:通過構造方法創建的f

Java基礎學習IO模擬輸入複製貼上功能

學習了IO流後,瞭解其IO體系: 字元流: Reader:輸入流 讀取 進入記憶體 Writer:輸出流 寫入 進硬碟 位元組流: InputStream:輸入流 讀取 進記憶體 OutputStream:輸出流 寫入 進硬碟 下面通過字元流的輸入流(FileReader)以及輸出流(F

java io 輸入輸出 大牛經典總結(轉載)

轉載出處:https://www.cnblogs.com/shaohz2014/p/3652548.html  java io 流 輸入輸出 大牛經典總結       在軟體開發中,資料流和資料庫操作佔據了一個很重要的位置,所以,熟

JAVA輸入輸出當中,什麼時候該使用字元?什麼時候該使用位元組

1. InputStream 和OutputStream,兩個是為位元組流設計的,主要用來處理位元組或二進位制物件, 2. Reader和 Writer.兩個是為字元流(一個字元佔兩個位元組)設計的,主要用來處理字元或字串. 字元流處理的單元為2個位元組的Unicode字元,分別操作字元、字元陣列或字串,而位

JAVA輸入輸出當中,什麽時候該使用字符?什麽時候該使用字節流?

enc href nic 文件 功能 byte[] 字節數 .com 字節 1. InputStream 和OutputStream,兩個是為字節流設計的,主要用來處理字節或二進制對象, 2. Reader和 Writer.兩個是為字符流(一個字符占兩個字節)設計的,

【我要程式設計】Java技術手冊根據圖片連結把圖片轉化為io,並輸出到頁面上的方法

適用場景:A程式只能內網訪問,B程式可以外網訪問,只有B程式可以訪問A程式,使用者需要通過B程式訪問A程式的圖片資源。這是可以使用該方法。 @RequestMapping("/getImageByPath") public void getImageByTomcat(St

javaIO(序列化反序列化

一.物件序列化流ObjectOutputStream   用於向流中寫入物件的操作流 ObjectOutputStream   稱為 序列化流 ObjectOutputStream 將 Java 物件的基本資料型別和圖形寫入 OutputStream。可以使用 Object

java輸入輸出詳細講解(入門經典),詳細講解JAVA中的IO

今天我們開始進入學習 java 中比較讓人頭疼的事, 那就是 I/O 流、多執行緒、網路程式設計。這裡對 I/O 流的一個詳細講解。希望對大家有點用吧。(不看後悔哦) 一、什麼是IO Java中I/O操作主要是指使用Java進行輸入,輸出操作。 Java所有的I/O機制都是基於資料流進行輸入

【 I/O】檔案輸入輸出(Scanner)& Scanner和io讀寫有何區別?(待填坑)

對檔案進行讀取,僅需要用File物件構造一個Scanner物件Scanner in= new Scanner(Paths.get("myfile.tet"),"UTF-8");如果檔名中含反斜槓符號,需要在每個反斜槓之前加一個額外的反斜槓如:“c:\\mydirectory\