国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java輸入輸出流

2019-11-14 15:41:23
字體:
供稿:網(wǎng)友


2015/9/7 16:59:33
noBody 2015/9/7 16:59:33

https://office.inspur.com/eportal/ui?pageId=334521&fromUrl=aHR0cHM6Ly9vZmZpY2UuaW5zcHVyLmNvbS9lcG9ydGFsL3VpP3BhZ2VJZD0zMjk4ODQ=
6:25:54
noBody 2015/9/9 6:25:54

轉(zhuǎn)](轉(zhuǎn)自博客園)java文件操作---文件讀取和寫入示例
2012-3-21閱讀3357 評論0

原文鏈接:

   http://m.survivalescaperooms.com/sPRingcsc/archive/2009/12/03/1616367.html



    雖然前面介紹了流的概念,但是這個概念對于初學(xué)者來說,還是比較抽象的,下面以實際的讀取文件為例子,介紹流的概念,以及輸入流的基本使用。

    按照前面介紹的知識,將文件中的數(shù)據(jù)讀入程序,是將程序外部的數(shù)據(jù)傳入程序中,應(yīng)該使用輸入流——InputStream或Reader。而由于讀取的是特定的數(shù)據(jù)源——文件,則可以使用輸入對應(yīng)的子類FileInputStream或FileReader實現(xiàn)。

   在實際書寫代碼時,需要首先熟悉讀取文件在程序中實現(xiàn)的過程。在Java語言的IO編程中,讀取文件是分兩個步驟:

   1、將文件中的數(shù)據(jù)轉(zhuǎn)換為流.

   2、讀取流內(nèi)部的數(shù)據(jù).

其中第一個步驟由系統(tǒng)完成,只需要創(chuàng)建對應(yīng)的流對象即可,對象創(chuàng)建完成以后步驟1就完成了,第二個步驟使用輸入流對象中的read方法即可實現(xiàn)了。



   使用輸入流進行編程時,代碼一般分為3個部分:

   1、創(chuàng)建流對象.

   2、讀取流對象內(nèi)部的數(shù)據(jù).

   3、關(guān)閉流對象。



下面以讀取文件的代碼示例:

    

    import java.io.*;

/**
* 使用FileInputStream讀取文件
*/

public class ReadFile1 {

public static void main(String[] args) {

//聲明流對象
FileInputStream fis = null;

try{
//創(chuàng)建流對象
fis = new FileInputStream("e://a.txt");

//讀取數(shù)據(jù),并將讀取到的數(shù)據(jù)存儲到數(shù)組中
byte[] data = new byte[1024]; //數(shù)據(jù)存儲的數(shù)組
int i = 0; //當(dāng)前下標(biāo)

//讀取流中的第一個字節(jié)數(shù)據(jù)
int n = fis.read();
//依次讀取后續(xù)的數(shù)據(jù)
while(n != -1){ //未到達流的末尾
//將有效數(shù)據(jù)存儲到數(shù)組中
data[i] = (byte)n;
//下標(biāo)增加
i++;
//讀取下一個字節(jié)的數(shù)據(jù)
n = fis.read();
}
//解析數(shù)據(jù)
String s = new String(data,0,i);
//輸出字符串
System.out.println(s);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
//關(guān)閉流,釋放資源
fis.close();
}catch(Exception e){}
}
}
}

    在該示例代碼中,首先創(chuàng)建一個FileInputStream類型的對象fis:

fis = new FileInputStream("e://a.txt");

    這樣建立了一個連接到數(shù)據(jù)源e:/a.txt的流,并將該數(shù)據(jù)源中的數(shù)據(jù)轉(zhuǎn)換為流對象fis,以后程序讀取數(shù)據(jù)源中的數(shù)據(jù),只需要從流對象fis中讀取即可。

    讀取流fis中的數(shù)據(jù),需要使用read方法,該方法是從InputStream類中繼承過來的方法,該方法的作用是每次讀取流中的一個字節(jié),如果需要讀取流中的所有數(shù)據(jù),需要使用循環(huán)讀取,當(dāng)?shù)竭_流的末尾時,read方法的返回值是-1。

在該示例中,首先讀取流中的第一個字節(jié):

    int n = fis.read();

并將讀取的值賦值給int值n,如果流fis為空,則n的值是-1,否則n中的最后一個字節(jié)包含的時流fis中的第一個字節(jié),該字節(jié)被讀取以后,將被從流fis中刪除。

    然后循環(huán)讀取流中的其它數(shù)據(jù),如果讀取到的數(shù)據(jù)不是-1,則將已經(jīng)讀取到的數(shù)據(jù)n強制轉(zhuǎn)換為byte,即取n中的有效數(shù)據(jù)——最后一個字節(jié),并存儲到數(shù)組data中,然后調(diào)用流對象fis中的read方法繼續(xù)讀取流中的下一個字節(jié)的數(shù)據(jù)。一直這樣循環(huán)下去,直到讀取到的數(shù)據(jù)是-1,也就是讀取到流的末尾則循環(huán)結(jié)束。

    這里的數(shù)組長度是1024,所以要求流中的數(shù)據(jù)長度不能超過1024,所以該示例代碼在這里具有一定的局限性。如果流的數(shù)據(jù)個數(shù)比較多,則可以將1024擴大到合適的個數(shù)即可。



    經(jīng)過上面的循環(huán)以后,就可以將流中的數(shù)據(jù)依次存儲到data數(shù)組中,存儲到data數(shù)組中有效數(shù)據(jù)的個數(shù)是i個,即循環(huán)次數(shù)。

    其實截至到這里,IO操作中的讀取數(shù)據(jù)已經(jīng)完成,然后再按照數(shù)據(jù)源中的數(shù)據(jù)格式,這里是文件的格式,解析讀取出的byte數(shù)組即可。

    該示例代碼中的解析,只是將從流對象中讀取到的有效的數(shù)據(jù),也就是data數(shù)組中的前n個數(shù)據(jù),轉(zhuǎn)換為字符串,然后進行輸出。

    在該示例代碼中,只是在catch語句中輸出異常的信息,便于代碼的調(diào)試,在實際的程序中,需要根據(jù)情況進行一定的邏輯處理,例如給出提示信息等。

最后在finally語句塊中,關(guān)閉流對象fis,釋放流對象占用的資源,關(guān)閉數(shù)據(jù)源,實現(xiàn)流操作的結(jié)束工作。



    上面詳細介紹了讀取文件的過程,其實在實際讀取流數(shù)據(jù)時,還可以使用其它的read方法,下面的示例代碼是使用另外一個read方法實現(xiàn)讀取的代碼:

    

    import java.io.FileInputStream;

/**
* 使用FileInputStream讀取文件
*/
public class ReadFile2 {
public static void main(String[] args) {
//聲明流對象
FileInputStream fis = null;
try{
//創(chuàng)建流對象
fis = new FileInputStream("e://a.txt");
//讀取數(shù)據(jù),并將讀取到的數(shù)據(jù)存儲到數(shù)組中
byte[] data = new byte[1024]; //數(shù)據(jù)存儲的數(shù)組
int i = fis.read(data);
//解析數(shù)據(jù)
String s = new String(data,0,i);
//輸出字符串
System.out.println(s);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
//關(guān)閉流,釋放資源
fis.close();
}catch(Exception e){}
}
}
}
   

該示例代碼中,只使用一行代碼:

    int i = fis.read(data);

就實現(xiàn)了將流對象fis中的數(shù)據(jù)讀取到字節(jié)數(shù)組data中。該行代碼的作用是將fis流中的數(shù)據(jù)讀取出來,并依次存儲到數(shù)組data中,返回值為實際讀取的有效數(shù)據(jù)的個數(shù)。

    使用該中方式在進行讀取時,可以簡化讀取的代碼。

    當(dāng)然,在讀取文件時,也可以使用Reader類的子類FileReader進行實現(xiàn),在編寫代碼時,只需要將上面示例代碼中的byte數(shù)組替換成char數(shù)組即可。

  使用FileReader讀取文件時,是按照char為單位進行讀取的,所以更適合于文本文件的讀取,而對于二進制文件或自定義格式的文件來說,還是使用FileInputStream進行讀取,方便對于讀取到的數(shù)據(jù)進行解析和操作。

  讀取其它數(shù)據(jù)源的操作和讀取文件類似,最大的區(qū)別在于建立流對象時選擇的類不同,而流對象一旦建立,則基本的讀取方法是一樣,如果只使用最基本的read方法進行讀取,則使用基本上是一致的。這也是IO類設(shè)計的初衷,使得對于流對象的操作保持一致,簡化IO類使用的難度。

程。



    基本的輸出流包含OutputStream和Writer兩個,區(qū)別是OutputStream體系中的類(也就是OutputStream的子類)是按照字節(jié)寫入的,而Writer體系中的類(也就是Writer的子類)是按照字符寫入的。



使用輸出流進行編程的步驟是:

1、建立輸出流

建立對應(yīng)的輸出流對象,也就是完成由流對象到外部數(shù)據(jù)源之間的轉(zhuǎn)換。

2、向流中寫入數(shù)據(jù)

將需要輸出的數(shù)據(jù),調(diào)用對應(yīng)的write方法寫入到流對象中。

3、關(guān)閉輸出流



    在寫入完畢以后,調(diào)用流對象的close方法關(guān)閉輸出流,釋放資源。

在使用輸出流向外部輸出數(shù)據(jù)時,程序員只需要將數(shù)據(jù)寫入流對象即可,底層的API實現(xiàn)將流對象中的內(nèi)容寫入外部數(shù)據(jù)源,這個寫入的過程對于程序員來說是透明的,不需要專門書寫代碼實現(xiàn)。

    在向文件中輸出數(shù)據(jù),也就是寫文件時,使用對應(yīng)的文件輸出流,包括FileOutputStream和FileWriter兩個類,下面以FileOutputStream為例子說明輸出流的使用。示例代碼如下:

  

    import java.io.*;

/**
* 使用FileOutputStream寫文件示例
*/
public class WriteFile1 {
public static void main(String[] args) {
String s = "Java語言";
int n = 100;
//聲明流對象
FileOutputStream fos = null;
try{
//創(chuàng)建流對象
fos = new FileOutputStream("e://out.txt");
//轉(zhuǎn)換為byte數(shù)組
byte[] b1 = s.getBytes();
//換行符
byte[] b2 = "/r/n".getBytes();
byte[] b3 = String.valueOf(n).getBytes();
//依次寫入文件
fos.write(b1);
fos.write(b2);
fos.write(b3);
} catch (Exception e) {
e.printStackTrace();
}finally{
try{
fos.close();
}catch(Exception e){}
}
}
}


該示例代碼寫入的文件使用記事本打開以后,內(nèi)容為:

    Java語言

100
    在該示例代碼中,演示了將一個字符串和一個int類型的值依次寫入到同一個文件中。在寫入文件時,首先創(chuàng)建了一個文件輸出流對象fos:

fos = new FileOutputStream("e://out.txt");

   該對象創(chuàng)建以后,就實現(xiàn)了從流到外部數(shù)據(jù)源e:/out.txt的連接。說明:當(dāng)外部文件不存在時,系統(tǒng)會自動創(chuàng)建該文件,但是如果文件路徑中包含未創(chuàng)建的目錄時將出現(xiàn)異常。這里書寫的文件路徑可以是絕對路徑也可以是相對路徑。

   在實際寫入文件時,有兩種寫入文件的方式:覆蓋和追加。其中“覆蓋”是指清除原文件的內(nèi)容,寫入新的內(nèi)容,默認采用該種形式寫文件,“追加”是指在已有文件 的末尾寫入內(nèi)容,保留原來的文件內(nèi)容,例如寫日志文件時,一般采用追加。在實際使用時可以根據(jù)需要采用適合的形式,可以使用:

public FileOutputStream(String name, boolean append) throws FileNotFoundException

   只需要使用該構(gòu)造方法在構(gòu)造FileOutputStream對象時,將第二個參數(shù)append的值設(shè)置為true即可。

   流對象創(chuàng)建完成以后,就可以使用OutputStream中提供的wirte方法向流中依次寫入數(shù)據(jù)了。最基本的寫入方法只支持byte數(shù)組格式的數(shù)據(jù),所以如果需要將內(nèi)容寫入文件,則需要把對應(yīng)的內(nèi)容首先轉(zhuǎn)換為byte數(shù)組。

這里以如下格式寫入數(shù)據(jù):首先寫入字符串s,使用String類的getBytes方法將該字符串轉(zhuǎn)換為byte數(shù)組,然后寫入字符串“/r/n”,轉(zhuǎn)換方式同上,該字符串的作用是實現(xiàn)文本文件的換行顯示,最后寫入int數(shù)據(jù)n,首先將n轉(zhuǎn)換為字符串,再轉(zhuǎn)換為byte數(shù)組。這種寫入數(shù)據(jù)的順序以及轉(zhuǎn)換為byte數(shù)組的方式就是流的數(shù)據(jù)格式,也就是該文件的格式。因為這里寫的都是文本文件,所以寫入的內(nèi)容以明文的形式顯示出來,也可以根據(jù)自己需要存儲的數(shù)據(jù)設(shè)定特定的文件格式。

其實,所有的數(shù)據(jù)文件,包括圖片文件、聲音文件等等,都是以一定的數(shù)據(jù)格式存儲數(shù)據(jù)的,在保存該文件時,將需要保存的數(shù)據(jù)按照該文件的數(shù)據(jù)格式依次寫入即可,而在打開該文件時,將讀取到的數(shù)據(jù)按照該文件的格式解析成對應(yīng)的邏輯即可。

最后,在數(shù)據(jù)寫入到流內(nèi)部以后,如果需要立即將寫入流內(nèi)部的數(shù)據(jù)強制輸出到外部的數(shù)據(jù)源,則可以使用流對象的flush方法實現(xiàn)。如果不需要強制輸出,則只需要在寫入結(jié)束以后,關(guān)閉流對象即可。在關(guān)閉流對象時,系統(tǒng)首先將流中未輸出到數(shù)據(jù)源中的數(shù)據(jù)強制輸出,然后再釋放該流對象占用的內(nèi)存空間。

使用FileWriter寫入文件時,步驟和創(chuàng)建流對象的操作都和該示例代碼一致,只是在轉(zhuǎn)換數(shù)據(jù)時,需要將寫入的數(shù)據(jù)轉(zhuǎn)換為char數(shù)組,對于字符串來說,可以使用String中的toCharArray方法實現(xiàn)轉(zhuǎn)換,然后按照文件格式寫入數(shù)據(jù)即可。

對于其它類型的字節(jié)輸出流/字符輸出流來說,只是在邏輯上連接不同的數(shù)據(jù)源,在創(chuàng)建對象的代碼上會存在一定的不同,但是一旦流對象創(chuàng)建完成以后,基本的寫入方法都是write方法,也需要首先將需要寫入的數(shù)據(jù)按照一定的格式轉(zhuǎn)換為對應(yīng)的byte數(shù)組/char數(shù)組,然后依次寫入即可。

所以IO類的這種設(shè)計形式,只需要熟悉該體系中的某一個類的使用以后,就可以觸類旁通的學(xué)會其它相同類型的類的使用,從而簡化程序員的學(xué)習(xí),使得使用時保持統(tǒng)一。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 文成县| 卢湾区| 呼玛县| 当阳市| 伊金霍洛旗| 兴城市| 兴宁市| 玛多县| 乌审旗| 深圳市| 余庆县| 临邑县| 外汇| 湖南省| 德钦县| 绵竹市| 昌邑市| 酒泉市| 项城市| 册亨县| 专栏| 忻州市| 大化| 伊春市| 山阴县| 那曲县| 堆龙德庆县| 苏州市| 特克斯县| 库尔勒市| 侯马市| 新野县| 新竹县| 裕民县| 宾阳县| 深圳市| 铜陵市| 沐川县| 西林县| 芜湖市| 琼结县|