【Java学习笔记十】输入输出流
在Java.io包中提供了一系列用于處理輸入/輸出的流類。從功能上分為兩類:輸入流和輸出流。從六結(jié)構(gòu)上可分為:字節(jié)流(以字節(jié)為處理單位)和字符流(以字符為處理單位)。
字符是由字節(jié)組成。在Java中所有字符用Unicode編碼,占兩個字節(jié)。
如果將“中”以字節(jié)輸出,則對方收到的內(nèi)容為兩個字節(jié), 但是可能是亂碼。
如果將“中”以字符輸出,則對方收到的內(nèi)容為“中”,也占兩個字節(jié)。
字節(jié)流的輸入流和輸出流的基礎(chǔ)類是InputStream和OutputStream這兩個抽象類,具體的輸入/輸出操作則由這兩個類的子類完成。
字符流的輸入流和輸出流的基礎(chǔ)類是Reader和Writer這兩個抽象類。
Java中還提供了一個特殊類RandomAccessFile,它允許對文件進行隨機訪問,使用該類的對象可以實現(xiàn)同時對文件進行輸入(讀文件)或輸出(寫文件)操作。
InputStream類中的常用方法
- int available()獲得從輸入流中所能讀取的字節(jié)的個數(shù)
- void close()關(guān)閉輸入流
- int read()讀取輸入流中的下一個字節(jié),返回該字節(jié)的ASCII值,范圍在0~255之間;若流結(jié)束,則返回-1
- int read(byte []a)從輸入流中讀取字節(jié),并存儲到字節(jié)數(shù)組a中。返回值為實際讀取的字節(jié)數(shù);若流結(jié)束,返回-1
- int read(byte []a, int off, int length)從輸入流中讀取長度為length個字節(jié)的數(shù)據(jù),并存儲于數(shù)組a索引off位置開始處,并返回讀取的字節(jié)數(shù),若流結(jié)束,則返回-1
- long skip(long a)從當前位置開始,跳過a個字節(jié)的數(shù)據(jù)
OutputStream類中的常用方法
- int flush()刷空輸出流,并輸出所有被緩存的字節(jié)
- void write(int a)將指定的字節(jié)a寫入輸出流。如果a的值大于255,則只輸出它的低位字節(jié)所表示的值
- void write(byte []a)把字節(jié)數(shù)組a中的字節(jié)數(shù)據(jù)全部寫入輸出流
- void write(byte []a, int off, int length)把字節(jié)數(shù)組a中從索引off開始的length個字節(jié)寫入輸出流
- void close() 關(guān)閉輸出流
常用的文件處理
文件的順序讀寫
一般操作步驟:
文件讀寫字節(jié)流類指的是FileInputStream類和FileOutputStream類,它們都重寫或?qū)崿F(xiàn)了其父類InputStream和OutputStream類的一些方法,以實現(xiàn)順序訪問本地文件。它們都是以字節(jié)為單位順序讀寫一個已存在的文件。
FileInputStream類構(gòu)造方法有
- FileInputStream(String filename)用文件名filename創(chuàng)建輸入流對象
- FileInputStream(File file)用文件對象創(chuàng)建輸入流對象,如:
若輸入流對象創(chuàng)建失敗(如對應的文件不存在時),將會引發(fā)異常FileNotFoundException,在程序中需要對其捕獲和處理。
從文件中讀取信息。一般用read()成員方法進行讀取信息操作。
創(chuàng)建文件輸出字節(jié)流FileOutputStream對象。可以用文件名、文件對象建立文件輸出字節(jié)流對象。創(chuàng)建輸出字節(jié)流對象時,若指定的文件不存在,則會自動建立一個新文件,如果指定的文件已存在,則該文件的內(nèi)容將被保留或刪除。
FileOutputStream類的構(gòu)造方法有:
- FileOutputStream(String filename) 用文件名filename創(chuàng)建輸出流對象
- FileOutputStream(File file)用文件對象創(chuàng)建輸出流對象
向文件中寫入數(shù)據(jù)。一般用write()成員方法向文件中寫入數(shù)據(jù)
無論是讀文件還是寫文件,操作完畢后,應該關(guān)閉輸入流和輸出流,以釋放資源。關(guān)閉的方式有兩種:顯示關(guān)閉和隱式關(guān)閉。隱式關(guān)閉是利用Java系統(tǒng)的自動垃圾回收功能自動完成,但完成的時機不能確定。顯示關(guān)閉使用close()方法,建議用顯示方式主動關(guān)閉流。
例如:
//寫文件 package fileio; import java.io.FileOutputStream; public class FileOutputTest1 { public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("c:\\info.txt"); //注意是雙反斜杠String msg = "hello";fos.write(msg.getBytes()); //使用字符串的getBytes方法得到字節(jié)數(shù)組fos.close(); } } //讀文件 package fileio; import java.io.File; import java.io.FileInputStream; public class FileInputTest1 { public static void main(String[] args) throws Exception { File file = new File("c:\\info.txt"); FileInputStream fis = new FileInputStream(file); byte[] data = new byte[(int)file.length()];fis.read(data); fis.close(); String msg = new String(new String(data)); System.out.println(msg); } }例如:實現(xiàn)一個文件復制功能的程序:
import java.io.*; public class CopyFile {public static void main(String[] args) {int dt;FileInputStream fis;FileOutputStream fos;try{ fis = new FileInputStream(args[0]);}catch(FileNotFoundException e){System.out.println("源文件未找到");return;}try{ fos = new FileOutputStream(args[1]);}catch(FileNotFoundException e){System.out.println("目標文件打開失敗");return;}try{while((dt=fis.read())!=-1)//進行復制{fos.write(dt);}}catch(IOException e){System.out.println("文件讀寫出錯");}finally{fis.close();fos.close();}} }文件字節(jié)流FileInputStream和FileOutputStream類只能提供純字節(jié)或字節(jié)數(shù)組的輸入/輸出操作,如果要進行基于Java基本數(shù)據(jù)類型(如整數(shù)或浮點數(shù)等)的輸入/輸出,則要用到過濾流FilterInputStream類和FilterOutputStream類的各種子類。
過濾流對象必須與一個輸入類或輸出類聯(lián)系起來,而不能直接使用文件名或文件對象來建立。
使用數(shù)據(jù)文件流DataInputStream類和DataOutputStream類讀寫文件
首先使用前面的方法建立文件字節(jié)流對象;然后基于文件字節(jié)流對象建立數(shù)據(jù)文件流對象;再用此對象的方法對文件進行基于基本數(shù)據(jù)類型數(shù)據(jù)的讀寫操作。
DataInputStream類的構(gòu)造方法為
- DataInputStream(InputStream in)通過輸入流對象in創(chuàng)建輸入數(shù)據(jù)文件流對象。
DataOutputStream類的構(gòu)造方法為 - DataOutputStream(OutputStream out)創(chuàng)建輸出數(shù)據(jù)文件流對象,并寫數(shù)據(jù)到OutputStream對象out。
數(shù)據(jù)文件流對象不僅能讀寫數(shù)據(jù)流,還能讀寫各種Java語言的基本數(shù)據(jù)類型數(shù)據(jù),如int、float、double等。
求100以內(nèi)的所有素數(shù),并把結(jié)果寫入D盤的data.dat文件中,最后再以每行10個數(shù)的方式顯示出data.dat文件的內(nèi)容。
使用BufferedInputStream和BufferedOutputStream類讀寫文件
這兩個類稱之為字節(jié)緩沖流。如果文件的讀寫數(shù)據(jù)量較多時,使用字節(jié)緩沖流類對象可以提高文件讀寫操作的效率。字節(jié)緩沖流對象會建立一個內(nèi)部緩沖區(qū),輸入/輸出數(shù)據(jù)首先會讀寫到緩沖區(qū)進行操作,當緩沖區(qū)滿或關(guān)閉字節(jié)緩沖流時一次性輸出到對應流,也可使用flush()方法主動將緩沖區(qū)數(shù)據(jù)輸出到對應流,這樣可以極大地減少磁盤讀寫次數(shù),提高了文件操作效率。
BufferedInputStream類的構(gòu)造方法
- BufferedInputStream(InputStream in)創(chuàng)建緩沖輸入流對象,保存in流對象,并創(chuàng)建一個內(nèi)部緩沖區(qū)來保存輸入數(shù)據(jù)。
- BufferedInputStream(InputStream in, int size)創(chuàng)建緩沖輸入流對象,保存in流對象,并創(chuàng)建一個指定大小為size個字節(jié)的內(nèi)部緩沖區(qū)來保存輸入數(shù)據(jù)。
BufferedOutputStream類的構(gòu)造方法
- BufferedOutputStream(OutputStream out)創(chuàng)建輸出緩沖流對象,并創(chuàng)建一個默認大小為512個字節(jié)的內(nèi)部緩沖區(qū),寫數(shù)據(jù)到參數(shù)所指定的輸出流out對象。
- BufferedOutputStream(OutputStream out, int size)創(chuàng)建輸出緩沖流對象,并創(chuàng)建一個指定大小為size個字節(jié)的內(nèi)部緩沖區(qū),寫數(shù)據(jù)到參數(shù)所指定的輸出流out對象。
flush()方法用于在程序結(jié)束之前主動將緩沖區(qū)里的數(shù)據(jù)輸出到對應的輸入/輸出流。可以通過輸入/輸出緩沖流對象進行顯示調(diào)用。
BufferedInputStream類提供了與FileInputStream類同樣的讀文件操作方法,BufferedOutputStream類提供了與FileOutputStream類同樣的寫文件操作方法,唯一的區(qū)別是所有讀寫操作的數(shù)據(jù)首先進入到緩沖區(qū),在必要時(緩沖區(qū)滿、關(guān)閉流或調(diào)用flush()方法)才輸出到對應的流中。
使用PrintStream類寫文件
PrintStream類提供了把Java的任何類型數(shù)據(jù)轉(zhuǎn)換為字符串類型數(shù)據(jù)輸出的功能。輸出時,經(jīng)常使用的方法有print()、println()和printf()。
創(chuàng)建PrintStream類的對象時,需要在OutputStream類對象的基礎(chǔ)上進行。PrintStream類的構(gòu)造方法有:
- PrintStream(OutputStream out)創(chuàng)建一個打印流對象。
- PrintStream(OutputStream out, boolean autoFlush)創(chuàng)建一個打印流對象。
用java.io.PrintStream寫文件,更加簡便。 我們可以調(diào)用PrintStream類里面的函數(shù)來進行輸出操作,其功能主要是各個print函數(shù)和println函數(shù),使用方法和System.out類似。
package fileio; import java.io.FileOutputStream; import java.io.PrintStream; public class PrintStreamTest1 { public static void main(String[] args) throws Exception { PrintStream ps = new PrintStream(new FileOutputStream("c:\\info.txt")); String msg = "hello"; ps.println(msg); ps.close(); } }字符流
- 使用Reader類和Writer類的子類對象可以處理以字符為單位的輸入/輸出操作。字符流中將所有的內(nèi)容看成一個個字符(Character),占據(jù)2個字節(jié),英文字符也不例外。在Java中,所有字符輸入流的父類是:java.io. Reader,所有字符輸出流的父類是:java.io.Writer。
總結(jié)
以上是生活随笔為你收集整理的【Java学习笔记十】输入输出流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++学习笔记五】模板
- 下一篇: 成都大熊猫繁育基地如何寄存行李