IO流

一、概念:數據流是一組有順序的、有起點和終點的字節集合,輸入輸出過程中傳遞的數組
組成數據流。從數據流中讀取數據時,必須有一個數據源和該數據流相連

IO流的分類:
1)根據數據類型不同分爲:字符流和字節流
字符流:
字節流:
2)根據數據流的方向分爲:輸入流和輸出流

Java的輸入流主要有InputStream和Reader作爲基類,而輸出流主要由OutputStream作爲基類。

二、常用的基本類
字符流,用於操作字符,針對純文本文件
1.兩個抽象基類:Writer 和 Reader,
2.FileWriter 和 FileReader 其中提高了一些讀寫方法,可以單個字符讀取寫入也,也可以以數組的形式讀取寫入,
由於流的操作涉及到系統資源,所以要處理異常,及關閉資源
例如://數組讀寫
public static void copy_1()
{ //穿件兩個流對象變量
FileWriter fw = null;
FileReader fr = null;
try
{ //關聯需要讀寫的文件
fw = new FileWriter("SystemDemo_copy.txt");
fr = new FileReader("SystemDemo.java");
//定義數組,接收讀到數據
char[] buf = new char[1024];

int len = 0;
while((len=fr.read(buf))!=-1)
{ //將數組中的數據寫入流
fw.write(buf,0,len);
}
}
catch (IOException e)
{
throw new RuntimeException("讀寫失敗");
}
finally
{
if(fr!=null)
try
{ //關閉讀取流
fr.close();
}
catch (IOException e)
{
}
if(fw!=null)
try
{ //關閉寫入流
fw.close();
}
catch (IOException e)
{
}
}
}

//字符讀寫
public static void copy_1()throws IOException//異常拋出
{
//創建目的地。
FileWriter fw = new FileWriter("RuntimeDemo_copy.txt");

//與已有文件關聯。
FileReader fr = new FileReader("RuntimeDemo.java");
//定義變量接收所讀字符
int ch = 0;

while((ch=fr.read())!=-1)
{
fw.write(ch);
}

fw.close();
fr.close();

}

三、Java流分類:

字符流:Reader 和 Writer
字符流:
操作文件:FileReader、FilterWriter
操作數組:CharArrayReader、CharArrayWriter
操作管道:PipeReader、PipedWriter
緩 衝 流:BufferedReader、 BufferedWriter
字符串流:StringReader、StringWriter
轉 換流:InputStreamReader(字節到字符的橋樑)、OutputStreamWriter(字符到字節的橋樑)
打 印 流:PrintWriter

字節流:InputStream 和 OutputStream
字節流:
操作文件:FileInputStream、FileOutputStream
操作數組:ByteArrayInputStream、ByteArrayOutputStream
操作管道:PipedInputStream、PipedOutputStream
緩 衝 流:BufferedInputStream、BufferedOutputStream
對 象 流:ObjectInputStream、ObjectOutputStream
數 據 流:DataInputStream、DataOutputStream
推 回 流:PushbackInputStream
打 印 流:PrintStream

注意:
1、使用Java的IO流執行輸出時,不要忘記了關閉輸出流,關閉輸出流除了可以保證
流的物理資源被回收之外,可能還可以將輸出緩衝流中的數據flush到物理節點理。
流的用法。
2、當我們使用處理流來包裝底層節點流之後,關閉輸入/輸出流資源時,只要關閉最上層的
處理流即可,關閉最上層的處理流時,系統會自動關閉被該處理包裝的節點流。

1)文件流
FileWriter:
1、flush和close()的區別:
flush:是將緩衝區裏面的數據強制輸出到文件中去,也就是清空緩衝區,但是

文件流還沒有關閉,可以繼續使用。
close:是將流資源關閉,關閉之後,流將再也不能使用,也不能flush了。但是

在關閉之前它會將數據flush到文件中去。
2、window系統中的回車換行符時"\r\n",但是在Linux系統中的回車換行符卻是'\n'。
3、當我們往一個文件寫數據的時候,要將緩衝區flush一下,這樣數據才能寫入到文件中。
FileReader:
1、創建一個文件讀取流對象時,要保證該文件存入,如果不存在將會拋出FileNotFoundException。
2、調用讀取方法時,當返回的值爲-1的時候,表示已經讀到文件的結尾了,所以我們就可以將這個-1來作爲文件結束的標誌。
FileInputStream:
FileInputStream的三種讀取方式:
1、利用循環一個一個字節的讀取while((int ch = read())!=-1)
2、在文件比較小的時候(小於64M,也就是虛擬機默認的內存空間),利用開闢一個字節數組,長度爲available。
3、利用循環將數據讀到一個字節數組中,byte buf = new byte[n] while((int ien=read(buf))!=-1)
三種讀取方式的優缺點:
第一種方式:不能讀取文件中的中文,因爲中文是由兩個字節組成的。而且讀取效率又是非常的低。
第二種方式:在文件不大的情況下,我們是用buf[available],可以將文件中的數據剛剛好的放在

一個字節數組中,不用去循環了,這樣既節省了大量的空間,而且還可以提高讀取的效率,

但是遇到大文件是行不通的。非常方便用於讀取文本文件之類的。
第三種方式:這種方式是最好的,即使遇到了大文件也沒有關係。但是數組的空間長度要劃分的合

理,這樣的話可以節省空間。
注意:當我們在使用FileInputStream時,如果沒有對應的文件的話,那麼將會拋出異常,所以在調用此流時要保證有文件存在。
FileOutputStream:
1、用法:用於寫入諸如圖像數據之類的原始字節的流
2、主要的方法:
1)void write(byte b):將 b.length 個字節從指定 byte 數組寫入此文件輸出流中。
2)void write(byte[] b,int off,int len): 將指定 byte 數組中從偏移量 off 開始的

len 個字節寫入此文件輸出流。
3)void write(int b):將指定字節寫入此文件輸出流。
FileOutputStream和FileInputStream代碼演示:
public class CopyMediaFile{
  private FileInputStream fis;
  private FileOutputStream fos;
public static void main(String[] args)throws IOException{
  CopyMediaFile cmd = new CopyMediaFile();
cmd.CopyPic();
cmd.CopyMusic();
cmd.CopyFile();
}
//將D盤下的Test.jpg拷貝到當前目錄下。
public void CopyPic()throws IOException
{
fos = new FileOutputStream("copy_test.jpg");
fis = new FileInputStream("D:\\Test.jpg");
byte buf[] = new byte[1024];
int len = 0;
while((len = fis.read(buf))!=-1){
fos.write(buf,0,len);
}
fis.close();
fos.close();
}
//將D盤下的Test.wma拷貝到當前目錄下。
public void CopyMusic()throws IOException{
fos = new FileOutputStream("copy_test.wma");
fis = new FileInputStream("D:\\Test.wma");
int len = fis.available();
byte buf[] = new byte[len];
fos.write(buf,0,len);
fis.close();
fos.close();
}
//將D盤下的Test.txt拷貝到當前目錄下。
public void CopyFile()throws IOException{
fos = new FileOutputStream("copy_test.txt");
fis = new FileInputStream("D:\\Test.txt");
byte buf[] = new byte[1024];
int len = 0;
while((len = fis.read(buf))!=-1){

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章