日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

FileInputStream/FileOutputStream的應(yīng)用

 My鏡像站 2012-01-17

這是一對繼承于InputStream和OutputStream的類,用于本地文件讀寫(二進制格式讀寫并且是順序讀寫,讀和寫要分別創(chuàng)建出不同的文件流對象);

本地文件讀寫編程的基本過程為:

①  生成文件流對象(對文件讀操作時應(yīng)該為FileInputStream類,而文件寫應(yīng)該為FileOutputStream類);

②  調(diào)用FileInputStream或FileOutputStream類中的功能函數(shù)如read()、write(int b)等)讀寫文件內(nèi)容;

③  關(guān)閉文件(close())。

實例:流文件讀寫

流文件的單元是字節(jié),所以它不但可以讀寫文本文件,也可以讀寫圖片、聲音、影像文件,這種特點非常有用,因為我們可以把這種文件變成流,然后在網(wǎng)絡(luò)上傳輸。

問題是有了通用的流文件以后,為什么還要專門的字符流呢?這是因為文本可以用不同的方式存儲,可以是普通的文本(UTF-8編碼方式),ASCII文本和Unicode文本,字符流對象可以進行必要的轉(zhuǎn)換,從而讀出正確的文本。

有人認(rèn)為流文件不能讀寫文本文件,這其實是個誤會,因為文本文件本質(zhì)上也是由字節(jié)組成的,當(dāng)然是流文件的一種。作為讀寫文件的全體,這是沒問題的,但是,如果要處理每次讀入的內(nèi)容,就最好使用字符流。

所以在文本文件處理時,使用字符流是個最常用的方法。

樣例:

import java.io.*;

public class FileStreamDemo {

public static void main(String[] args) throws IOException {

//創(chuàng)建兩個文件,face.gif是已經(jīng)存在文件,newFace.gif是新創(chuàng)建的文件

File inFile = new File("face.gif");

File outFile = new File("newFace.gif");

//創(chuàng)建流文件讀入與寫出類

FileInputStream inStream = new FileInputStream(inFile);

FileOutputStream outStream = new FileOutputStream(outFile);

//通過available方法取得流的最大字符數(shù)

byte[] inOutb = new byte[inStream.available()];

inStream.read(inOutb);  //讀入流,保存在byte數(shù)組

outStream.write(inOutb);  //寫出流,保存在文件newFace.gif中

inStream.close();

outStream.close();

}

}

實例:讀寫任意大文件應(yīng)用

因為byte數(shù)組最大存儲值不超過64M,所以當(dāng)一個文件大于60M 的時候,需要分開幾個流操作。我們把上面的程序作一個修改,就可以寫入任意大小的文件。這個程序應(yīng)用了FileInputStream類的方法如下:

read(byte[] b,int off,int len)

把特定位置的流內(nèi)容讀入數(shù)組,已經(jīng)讀入byte[]數(shù)組的內(nèi)容,會在流文件中刪除。

程序運行的結(jié)果會產(chǎn)生一個新文件。

樣例:

import java.io.*;

public class FileStreamDemo2 {

public static void main(String[] args) throws IOException {

//創(chuàng)建兩個文件

File inFile = new File("tcty36.rm");

File outFile = new File("newtcty36.rm");

//最大的流為60Mb,當(dāng)文件的容量大于60Mb的時候便分開流

final int MAX_BYTE = 60000000;

long streamTotal = 0;  //接受流的容量

int streamNum = 0;  //流需要分開的數(shù)量

int leave = 0;  //文件剩下的字符數(shù)

byte[] inOutb;  //byte數(shù)組接受文件的數(shù)據(jù)

//創(chuàng)建流文件讀入與寫出類

FileInputStream inStream = new FileInputStream(inFile);

FileOutputStream outStream = new FileOutputStream(outFile);

//通過available方法取得流的最大字符數(shù)

streamTotal = inStream.available();

//取得流文件需要分開的數(shù)量

streamNum = (int)Math.floor(streamTotal/MAX_BYTE);

//分開文件之后,剩余的數(shù)量

leave = (int)streamTotal % MAX_BYTE;

//文件的容量大于60Mb時進入循環(huán)

if (streamNum > 0) {

for(int i = 0; i < streamNum; ++i){

inOutb = new byte[MAX_BYTE];

//讀入流,保存在byte數(shù)組

inStream.read(inOutb, 0, MAX_BYTE);

outStream.write(inOutb);  //寫出流

outStream.flush();  //更新寫出的結(jié)果

}

}

//寫出剩下的流數(shù)據(jù)

inOutb = new byte[leave];

inStream.read(inOutb, 0, leave);

outStream.write(inOutb);

outStream.flush();

inStream.close();

outStream.close();

}

}

六、管道PipedInputStream/PipedOutputStream類:

當(dāng)需要在兩個線程中讀寫數(shù)據(jù)的時候,由于線程的并發(fā)執(zhí)行,讀寫的同步問題可能會發(fā)生困難,這時候可以使用管道,管道事實上是一個隊列。

管 道是由系統(tǒng)維護的一個緩沖區(qū),當(dāng)然程序員也可以自己直接指定該緩沖區(qū)的大?。ㄖ恍枰O(shè)置管道流類中的PIPE_SIZE屬性的值)。當(dāng)生產(chǎn)者生產(chǎn)出數(shù)據(jù) 后,只需要將數(shù)據(jù)寫入管道中,消費者只需要從管道中讀取所需要的數(shù)據(jù)。利用管道的這種機制,可以將一個線程的輸出結(jié)果直接連接到另一個線程的輸入端口,實 現(xiàn)兩者之間的數(shù)據(jù)直接傳送。

線程1
線程2
臨時文件
管道

1.管道的連接:

方法之一是通過構(gòu)造函數(shù)直接將某一個程序的輸出作為另一個程序的輸入,在定義對象時指明目標(biāo)管道對象

PipedInputStream pInput=new PipedInputStream();

PipedOutputStream pOutput= new PipedOutputStream(pInput);

方法之二是利用雙方類中的任一個成員函數(shù) connect()相連接

PipedInputStream pInput=new PipedInputStream();

PipedOutputStream pOutput= new PipedOutputStream();

pinput.connect(pOutput);

2.管道的輸入與輸出:

輸出管道對象調(diào)用write()成員函數(shù)輸出數(shù)據(jù)(即向管道的輸入端發(fā)送數(shù)據(jù));而輸入管道對象調(diào)用read()成員函數(shù)可以讀起數(shù)據(jù)(即從輸出管道中獲得數(shù)據(jù))。這主要是借助系統(tǒng)所提供的緩沖機制來實現(xiàn)的。

實例:Java的管道的輸入與輸出

import java.io.*;

public class PipedIO //程序運行后將sendFile文件的內(nèi)容拷貝到receiverFile文件中

{

public static void main(String args[])

{

try

{

//構(gòu)造讀寫的管道流對象

PipedInputStream pis=new PipedInputStream();

PipedOutputStream pos=new PipedOutputStream();

//實現(xiàn)關(guān)聯(lián)

pos.connect(pis);

//構(gòu)造兩個線程,并且啟動。

new Sender(pos,"c:\\text2.txt").start();

new Receiver(pis,"c:\\text3.txt").start();

}

catch(IOException e)

{

System.out.println("Pipe Error"+ e);

}

}

}

//線程發(fā)送

class Sender extends Thread

{

PipedOutputStream pos;

File file;

//構(gòu)造方法

Sender(PipedOutputStream pos, String fileName)

{

this.pos=pos;

file=new File(fileName);

}

//線程運行方法

public void run()

{

try

{

//讀文件內(nèi)容

FileInputStream fs=new FileInputStream(file);

int data;

while((data=fs.read())!=-1)

{

//寫入管道始端

pos.write(data);

}

pos.close();

}

catch(IOException e)

{

System.out.println("Sender Error" +e);

}

}

}

//線程讀

class Receiver extends Thread

{

PipedInputStream pis;

File file;

//構(gòu)造方法

Receiver(PipedInputStream pis, String fileName)

{

this.pis=pis;

file=new File(fileName);

}

//線程運行

public void run()

{

try

{

//寫文件流對象

FileOutputStream fs=new FileOutputStream(file);

int data;

//從管道末端讀

while((data=pis.read())!=-1)

{

//寫入本地文件

fs.write(data);

}

pis.close();

}

catch(IOException e)

{

System.out.println("Receiver Error" +e);

}

}

}

七、隨機文件讀寫:RandomAccessFile類

它直接繼承于Object類而非InputStream/OutputStream類,從而可以實現(xiàn)讀寫文件中任何位置中的數(shù)據(jù)(只需要改變文件的讀寫位置的指針)。

編程步驟:

① 生成流對象并且指明讀寫類型;

② 移動讀寫位置;

③ 讀寫文件內(nèi)容;

④ 關(guān)閉文件。

另外由于RandomAccessFile類實現(xiàn)了DataOutput與DataInput接口,因而利用它可以讀寫Java中的不同類型的基本類型數(shù)據(jù)(比如采用readLong()方法讀取長整數(shù),而利用readInt()方法可以讀出整數(shù)值等)。

程序?qū)嵗?/strong>

利用隨機數(shù)據(jù)流RandomAccessFile類來實現(xiàn)記錄用戶在鍵盤的輸入,每執(zhí)行一次,將用戶的鍵盤輸入存儲在指定的UserInput.txt文件中。

import java.io.*;

public class RandomFileRW

{

public static void main(String args[])

{

StringBuffer buf=new StringBuffer();

char ch;

try

{

while( (ch=(char)System.in.read()) !='\n')

{

buf.append(ch);

}

//讀寫方式可以為"r" or "rw"

RandomAccessFile myFileStream=new RandomAccessFile("c:\\UserInput.txt","rw");

myFileStream.seek(myFileStream.length()) ;

myFileStream.writeBytes(buf.toString());

//將用戶從鍵盤輸入的內(nèi)容添加到文件的尾部

myFileStream.close();

}

catch(IOException e)

{

}

}

}

八、DataInput/DataOutput接口:

實 現(xiàn)與機器無關(guān)的各種數(shù)據(jù)格式讀寫(如readChar() 、readInt()、readLong()、readFloat(),而readLine()將返回一個String)。其中 RandomAccessFile類實現(xiàn)了該接口,具有比FileInputStream或FileOutputStream類更靈活的數(shù)據(jù)讀寫方式。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多