Java IO流

標準輸入輸出,文件的操作,網絡上的數據流,字符串流,對象流,zip文件流等等,java中將輸入輸出抽象稱為流,就好像水管,將兩個容器連接起來。將數據從外存中讀取到內存中的稱為輸入流,將數據從內存寫入外存中的稱為輸出流。流是一個很形象的概念,當程序需要讀取數據的時候,就會開啟一個通向數據源的流,這個數據源可以是文件,內存,或是網絡連接。類似的,當程序需要寫入數據的時候,就會開啟一個通向目的地的流。#####1.數據流: 一組有序,有起點和終點的字節的數據序列。包括輸入流和輸出流。

Paste_Image.png
#####2.輸入流(input Stream || Reader):將數據從外界(文件,網絡)讀入到程序的通道。#####3.輸出流(output Stream || Writer):將數據從程序中輸出到外界(顯示器,文件,網絡)的通道。#####4.數據流分類:流序列中的數據既可以是未經加工的原始二進制數據,也可以是經一定編碼處理后符合某種格式規定的特定數據。因此Java中的流分為兩種: 1) 字節流:數據流中最小的數據單元是字節 2) 字符流:數據流中最小的數據單元是字符, Java中的字 符是Unicode編碼,一個字符占用兩個字節。##java.IO層次體系結構主要的類如下:1. File(文件特征與管理):用于文件或者目錄的描述信息,例如生成新目錄,修改文件名,刪除文件,判斷文件所在路徑等。2. InputStream(二進制格式操作):抽象類,基于字節的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特征。3. OutputStream(二進制格式操作):抽象類。基于字節的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特征。 Java中字符是采用Unicode標準,一個字符是16位,即一個字符使用兩個字節來表示。為此,JAVA中引入了處理字符的流。4. Reader(文件格式操作):抽象類,基于字符的輸入操作。5. Writer(文件格式操作):抽象類,基于字符的輸出操作。6. RandomAccessFile(隨機文件操作):它的功能豐富,可以從文件的任意位置進行存取(輸入輸出)操作。
Paste_Image.png
##非流式文件類--File類在Java語言的java.io包中,由File類提供了描述文件和目錄的操作與管理方法。但File類不是InputStream、OutputStream或Reader、Writer的子類,因為它不負責數據的輸入輸出,而專門用來管理磁盤文件與目錄。作用:File類主要用于命名文件、查詢文件屬性和處理文件目錄。public class File extends Object implements Serializable,Comparable {}File類共提供了三個不同的構造函數,以不同的參數形式靈活地接收文件和目錄名信息。構造函數:>1)File (String pathname) 例:File f1=new File("FileTest1.txt"); //創建文件對象f1,f1所指的文件是在當前目錄下創建的FileTest1.txt2)File (String parent , String child) 例:File f2=new File(“D:\dir1","FileTest2.txt") ;// 注意:D:\dir1目錄事先必須存在,否則異常3)File (File parent , String child) 例:File f4=new File("\dir3"); File f5=new File(f4,"FileTest5.txt"); //在如果 \dir3目錄不存在使用f4.mkdir()先創建 一個對應于某磁盤文件或目錄的File對象一經創建, 就可以通過調用它的方法來獲得文件或目錄的屬性。 1)public boolean exists( ) 判斷文件或目錄是否存在 2)public boolean isFile( ) 判斷是文件還是目錄 3)public boolean isDirectory( ) 判斷是文件還是目錄 4)public String getName( ) 返回文件名或目錄名 5)public String getPath( ) 返回文件或目錄的路徑。 6)public long length( ) 獲取文件的長度 7)public String[ ] list ( ) 將目錄中所有文件名保存在字符串數組中返回。 File類中還定義了一些對文件或目錄進行管理、操作的方法,常用的方法有: 1) public boolean renameTo( File newFile ); 重命名文件 2) public void delete( ); 刪除文件 3) public boolean mkdir( ); 創建目錄例子:import java.io.File; import java.io.IOException; public class TestFile { public static void main(String args[]) throws IOException { File dir = new File("\\root"); File f1 = new File(dir, "fileOne.txt"); File f2 = new File(dir, "fileTwo.java"); // 文件對象創建后,指定的文件或目錄不一定物理上存在 if (!dir.exists()) dir.mkdir(); if (!f1.exists()) f1.createNewFile(); if (!f2.exists()) f2.createNewFile(); System.out.println("f1's AbsolutePath= " + f1.getAbsolutePath()); System.out.println("f1 Canread=" + f1.canRead()); System.out.println("f1's len= " + f1.length()); String[] FL; int count = 0; FL = dir.list(); for (int i = 0; i < FL.length; i++) { count++; System.out.println(FL[i] + "is in \\root"); } System.out.println("there are" + count + "file in //root"); } }說明:File類的方法:(1) exists()測試磁盤中指定的文件或目錄是否存在(2) mkdir()創建文件對象指定的目錄(單層目錄)(3) createNewFile()創建文件對象指定的文件(4) list()返回目錄中所有文件名字符串##Java.IO流類庫
Paste_Image.png
Paste_Image.png
####按I/O類型來總體分類:>1. Memory 1)從/向內存數組讀寫數據: CharArrayReader、 CharArrayWriter、ByteArrayInputStream、ByteArrayOutputStream2)從/向內存字符串讀寫數據 StringReader、StringWriter、StringBufferInputStream>2.Pipe管道 實現管道的輸入和輸出(進程間通信): PipedReader、PipedWriter、PipedInputStream、PipedOutputStream>3.File 文件流。對文件進行讀、寫操作 :FileReader、FileWriter、FileInputStream、FileOutputStream>4.ObjectSerialization 對象輸入、輸出 :ObjectInputStream、ObjectOutputStream>5.DataConversion數據流 按基本數據類型讀、寫(處理的數據是Java的基本類型(如布爾型,字節,整數和浮點數)):DataInputStream、DataOutputStream>6.Printing 包含方便的打印方法 :PrintWriter、PrintStream>7.Buffering緩沖 在讀入或寫出時,對數據進行緩存,以減少I/O的次數:BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream>8.Filtering 濾流,在數據進行讀或寫時進行過濾:FilterReader、FilterWriter、FilterInputStream、FilterOutputStream> 9.Concatenation合并輸入 把多個輸入流連接成一個輸入流 :SequenceInputStream > 10.Counting計數 在讀入數據時對行記數 :LineNumberReader、LineNumberInputStream>11.Peeking Ahead 通過緩存機制,進行預讀 :PushbackReader、PushbackInputStream>12.Converting between Bytes and Characters 按照一定的編碼/解碼標準將字節流轉換為字符流,或進行反向轉換(Stream到Reader,Writer的轉換類):InputStreamReader、OutputStreamWriter####按數據來源(去向)分類:>1、File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter 2、byte[]:ByteArrayInputStream, ByteArrayOutputStream 3、Char[]: CharArrayReader, CharArrayWriter 4、String: StringBufferInputStream, StringReader, StringWriter 5、網絡數據流:InputStream, OutputStream, Reader, Writer ##字節流InputStream/OutputStream##### 1. InputStream抽象類 > InputStream 為字節輸入流,它本身為一個抽象類,必須依靠其子類實現各種功能,此抽象類是表示字節輸入流的所有類的超類。 繼承自InputStream 的流都是向程序中輸入數據的,且數據單位為字節(8bit);InputStream是輸入字節數據用的類,所以InputStream類提供了3種重載的read方法.Inputstream類中的常用方法:   (1) public abstract int read( ):讀取一個byte的數據,返回值是高位補0的int類型值。若返回值=-1說明沒有讀取到任何字節讀取工作結束。  (2) public int read(byte b[ ]):讀取b.length個字節的數據放到b數組中。返回值是讀取的字節數。該方法實際上是調用下一個方法實現的   (3) public int read(byte b[ ], int off, int len):從輸入流中最多讀取len個字節的數據,存放到偏移量為off的b數組中。   (4) public int available( ):返回輸入流中可以讀取的字節數。注意:若輸入阻塞,當前線程將被掛起,如果InputStream對象調用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調用才有用,   (5) public long skip(long n):忽略輸入流中的n個字節,返回值是實際忽略的字節數, 跳過一些字節來讀取   (6) public int close( ) :我們在使用完后,必須對我們打開的流進行關閉. 主要的子類:
> 1) FileInputStream把一個文件作為InputStream,實現對文件的讀取操作 2) ByteArrayInputStream:把內存中的一個緩沖區作為InputStream使用 3) StringBufferInputStream:把一個String對象作為InputStream 4) PipedInputStream:實現了pipe的概念,主要在線程中使用 5) SequenceInputStream:把多個InputStream合并為一個InputStream #####OutputStream抽象類> OutputStream提供了3個write方法來做數據的輸出,這個是和InputStream是相對應的。   1. public void write(byte b[ ]):將參數b中的字節寫到輸出流。   2. public void write(byte b[ ], int off, int len) :將參數b的從偏移量off開始的len個字節寫到輸出流。   3. public abstract void write(int b) :先將int轉換為byte類型,把低字節寫入到輸出流中。   4. public void flush( ) : 將數據緩沖區中數據全部輸出,并清空緩沖區。   5. public void close( ) : 關閉輸出流并釋放與流相關的系統資源。 主要的子類:
> 1) ByteArrayOutputStream:把信息存入內存中的一個緩沖區中 2) FileOutputStream:把信息存入文件中 3) PipedOutputStream:實現了pipe的概念,主要在線程中使用 4) SequenceOutputStream:把多個OutStream合并為一個OutStream >流結束的判斷:方法read()的返回值為-1時;readLine()的返回值為null時。#####文件輸入流: FileInputStream類 FileInputStream可以使用read()方法一次讀入一個字節,并以int類型返回,或者是使用read()方法時讀入至一個byte數組,byte數組的元素有多少個,就讀入多少個字節。在將整個文件讀取完成或寫入完畢的過程中,這么一個byte數組通常被當作緩沖區,因為這么一個byte數組通常扮演承接數據的中間角色。
作用:以文件作為數據輸入源的數據流。或者說是打開文件,從文件讀數據到內存的類。使用方法(1) File fin=new File("d:/abc.txt"); FileInputStream in=new FileInputStream( fin);使用方法(2) FileInputStream in=new FileInputStream(“d: /abc.txt”);程序舉例:將InputFromFile.java的程序的內容顯示在顯示器上
import java.io.IOException; import java.io.FileInputStream; ; public class TestFile { public static void main(String args[]) throws IOException { try{ FileInputStream rf=new FileInputStream("InputFromFile.java"); int n=512; byte buffer[]=new byte[n]; while((rf.read(buffer,0,n)!=-1)&&(n>0)){ System.out.println(new String(buffer) ); } System.out.println(); rf.close(); } catch(IOException IOe){ System.out.println(IOe.toString()); } } }#####文件輸出流:FileOutputStream類 作用:用來處理以文件作為數據輸出目的數據流;或者說是從內存區讀數據入文件 FileOutputStream類用來處理以文件作為數據輸出目的數據流;一個表示文件名的字符串,也可以是File或FileDescriptor對象。  創建一個文件流對象有兩種方法:   方式1:    File f=new File (“d:/myjava/write.txt "); FileOutputStream out= new FileOutputStream (f);  方式2:   FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt ");  方式3:構造函數將 FileDescriptor()對象作為其參數。   FileDescriptor() fd=new FileDescriptor();   FileOutputStream f2=new FileOutputStream(fd);  方式4:構造函數將文件名作為其第一參數,將布爾值作為第二參數。   FileOutputStream f=new FileOutputStream("d:/abc.txt",true);   注意: (1)文件中寫數據時,若文件已經存在,則覆蓋存在的文件;(2)的讀/寫操作結束時,應調用close方法關閉流。 程序舉例:使用鍵盤輸入一段文章,將文章保存在文件write.txt中
import java.io.IOException; import java.io.FileOutputStream; public class TestFile { public static void main(String args[]) throws IOException { try { System.out.println("please Input from Keyboard"); int count, n = 512; byte buffer[] = new byte[n]; count = System.in.read(buffer); FileOutputStream wf = new FileOutputStream("d:/myjava/write.txt"); wf.write(buffer, 0, count); wf.close(); // 當流寫操作結束時,調用close方法關閉流。 System.out.println("Save to the write.txt"); } catch (IOException IOe) { System.out.println("File Write Error!"); } } }#####FileInputStream流和FileOutputStream的應用利用程序將文件file1.txt 拷貝到file2.txt中。import java.io.File; import java.io.IOException; import java.io.FileOutputStream; import java.io.FileInputStream; public class TestFile { public static void main(String args[]) throws IOException { try { File inFile = new File("copy.java"); File outFile = new File("copy2.java"); FileInputStream finS = new FileInputStream(inFile); FileOutputStream foutS = new FileOutputStream(outFile); int c; while ((c = finS.read()) != -1) { foutS.write(c); } finS.close(); foutS.close(); } catch (IOException e) { System.err.println("FileStreamsTest: " + e); } } }#####緩沖輸入輸出流 BufferedInputStream/ BufferedOutputStream
計算機訪問外部設備非常耗時。訪問外存的頻率越高,造成CPU閑置的概率就越大。為了減少訪問外存的次數,應該在一次對外設的訪問中,讀寫更多的數據。為此,除了程序和流節點間交換數據必需的讀寫機制外,還應該增加緩沖機制。緩沖流就是每一個數據流分配一個緩沖區,一個緩沖區就是一個臨時存儲數據的內存。這樣可以減少訪問硬盤的次數,提高傳輸效率。BufferedInputStream:當向緩沖流寫入數據時候,數據先寫到緩沖區,待緩沖區寫滿后,系統一次性將數據發送給輸出設備。BufferedOutputStream :當從向緩沖流讀取數據時候,系統先從緩沖區讀出數據,待緩沖區為空時,系統再從輸入設備讀取數據到緩沖區。1)將文件讀入內存:將BufferedInputStream與FileInputStream相接 FileInputStream in=new FileInputStream( “file1.txt ” ); BufferedInputStream bin=new BufferedInputStream( in); 2)將內存寫入文件:將BufferedOutputStream與 FileOutputStream相接FileOutputStreamout=new FileOutputStream(“file1.txt”);BufferedOutputStream bin=new BufferedInputStream(out);3)鍵盤輸入流讀到內存將BufferedReader與標準的數據流相接 InputStreamReader sin=new InputStreamReader (System.in) ;BufferedReader bin=new BufferedReader(sin);import java.io.*; public class ReadWriteToFile { public static void main(String args[]) throws IOException { InputStreamReader sin = new InputStreamReader(System.in); BufferedReader bin = new BufferedReader(sin); FileWriter out = new FileWriter("myfile.txt"); BufferedWriter bout = new BufferedWriter(out); String s; while ((s = bin.readLine()).length() > 0) { bout.write(s, 0, s.length()); } } }程序說明:從鍵盤讀入字符,并寫入到文件中BufferedReader類的方法:String readLine()作用:讀一行字符串,以回車符為結束。BufferedWriter類的方法:bout.write(String s,offset,len)作用:從緩沖區將字符串s從offset開始,len長度的字符串寫到某處。#####字符流Writer/Reader Java中字符是采用Unicode標準,一個字符是16位,即一個字符使用兩個字節來表示。為此,JAVA中引入了處理字符的流。>感謝 真實的歸宿

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容