第8章文件和輸入輸出流_第1頁(yè)
第8章文件和輸入輸出流_第2頁(yè)
第8章文件和輸入輸出流_第3頁(yè)
第8章文件和輸入輸出流_第4頁(yè)
第8章文件和輸入輸出流_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第8章

文件和輸入輸出流本章主要內(nèi)容:8.1輸入/輸出流8.1.1流的概念8.1.2

io類(lèi)庫(kù)8.2文件處理8.2.1文件與目錄管理8.2.2文件流8.3隨機(jī)存取文件和本地可執(zhí)行文件8.3.1隨機(jī)存取文件流8.3.2本地可執(zhí)行文件8.4數(shù)據(jù)流與對(duì)象流8.4.1數(shù)據(jù)流8.4.2對(duì)象流8.5Java多媒體技術(shù)8.5.1應(yīng)用輸入流播放音頻文件8.5.2

Java多媒體包JMF的應(yīng)用文件程序終端文件程序網(wǎng)絡(luò)端點(diǎn)數(shù)據(jù)流起點(diǎn)終點(diǎn)

網(wǎng)絡(luò)端點(diǎn)文件,字符串存儲(chǔ)區(qū)8.1輸入/輸出流什么是數(shù)據(jù)流?8.1.1流的概念什么是流?流是計(jì)算機(jī)各部件之間的數(shù)據(jù)流動(dòng),按傳輸方向可分為輸入流和輸出流。按內(nèi)容可分為字節(jié)流和字符流。輸入流指從某個(gè)數(shù)據(jù)來(lái)源(如鍵盤(pán),鼠標(biāo),文件等)輸入的數(shù)據(jù)序列輸出流指將向某個(gè)數(shù)據(jù)目的地(如屏幕,文件,網(wǎng)絡(luò)等)輸出的數(shù)據(jù)序列java.io包中定義與輸入、輸出流相關(guān)的類(lèi)和接口,構(gòu)成了Java語(yǔ)言的I/O框架java.io包中類(lèi)和接口從功能上主要分為字符流類(lèi)型和字節(jié)流類(lèi)型字符流是指數(shù)據(jù)序列的基本構(gòu)成單位是16位的Unicode字符數(shù)據(jù),如各類(lèi)基于字符編碼的文本文件字節(jié)流是指數(shù)據(jù)序列的基本構(gòu)成單位是8位的字節(jié)數(shù)據(jù),如各類(lèi)基于二進(jìn)制數(shù)據(jù)的文件8.1.2

io類(lèi)庫(kù)I/O流字節(jié)流字符流1.InputStreamReader是字節(jié)流通向字符流的橋梁:把讀取的字節(jié)型數(shù)據(jù)解碼為字符型數(shù)據(jù)。2.OutputStreamWriter是字符流通向字節(jié)流的橋梁:把將要寫(xiě)入的字符型數(shù)據(jù)編碼為字節(jié)型數(shù)據(jù)。其中:在從字節(jié)流轉(zhuǎn)化為字符流時(shí),其實(shí)質(zhì)是將字節(jié)數(shù)組(bytebytes[]轉(zhuǎn)化為字符串String.publicString(bytebytes[],StringcharsetName);

在從字符流轉(zhuǎn)化為字節(jié)流時(shí),其實(shí)質(zhì)是將字符串String轉(zhuǎn)化為字節(jié)數(shù)組(bytebytes[].byte[]String.getBytes(StringcharsetName);8.1.2

io類(lèi)庫(kù)1、字節(jié)流的層次結(jié)構(gòu)

在java.io類(lèi)庫(kù)中,InputStream和OutputStream是處理字節(jié)數(shù)據(jù)的基本輸入輸出類(lèi),他們處在java.io包的最頂層。這兩類(lèi)均為抽象類(lèi),也就是說(shuō)他們不能被實(shí)例化,必須生成子類(lèi)之后才能實(shí)現(xiàn)一定的功能。8.1.2

io類(lèi)庫(kù)2、字符流的層次結(jié)構(gòu)8.1.2

io類(lèi)庫(kù)2、字符流的層次結(jié)構(gòu)類(lèi)名功能BufferedReader和BufferedWriter用于字符流讀寫(xiě)緩沖存儲(chǔ)。InputStreamReader和OutputStreamWriter用于將字節(jié)碼與字符碼相互轉(zhuǎn)換。FileReader和FileWriter用于字符文件的輸入輸出。8.2文件處理1、File類(lèi)2、字符文件:

FileReader類(lèi)、FileWriter類(lèi)3、字節(jié)文件:

FileInput類(lèi)、FileOutput類(lèi)定義在包java.io中文件是計(jì)算機(jī)中一種基本的數(shù)據(jù)存儲(chǔ)形式,在實(shí)際存儲(chǔ)數(shù)據(jù)時(shí),如果對(duì)于數(shù)據(jù)的讀寫(xiě)速度要求不是很高,存儲(chǔ)的數(shù)據(jù)量不是很大時(shí),使用文件作為一種持久數(shù)據(jù)存儲(chǔ)的方式是比較好的選擇。存儲(chǔ)在文件內(nèi)部的數(shù)據(jù)和內(nèi)存中的數(shù)據(jù)不同,存儲(chǔ)在文件中的數(shù)據(jù)是一種“持久存儲(chǔ)”,也就是當(dāng)程序退出或計(jì)算機(jī)關(guān)機(jī)以后,數(shù)據(jù)還是存在的,而內(nèi)存內(nèi)部的數(shù)據(jù)在程序退出或計(jì)算機(jī)關(guān)機(jī)以后,數(shù)據(jù)就丟失了。File類(lèi)不是InputStream,OutputStream或Reader,Writer的子類(lèi),因?yàn)樗回?fù)責(zé)數(shù)據(jù)的輸入輸出,而是專(zhuān)門(mén)用來(lái)管理磁盤(pán)文件與目錄的。8.2.1文件與目錄管理1、創(chuàng)建File類(lèi)文件對(duì)象

(1)所有對(duì)文件的操作都要使用File類(lèi).(2)其構(gòu)造:

File(“文件名”);File(“文件所在目錄”,“文件名”);文件與應(yīng)用程序不在同一目錄文件與應(yīng)用程序在同一目錄Filef1=newFile(“C:\myProgram\jtest”);Strings=“myProgram\jtest”;Filef2=newFile(S);Filef3=newFile(“testfile.dat”);Filef4=newFile(“\docs”,“file.dat”);8.2.1文件與目錄管理2、獲取文件及目錄屬性(1)判斷文件或目錄是否存在

publicbooleanexists();(2)判斷是文件還是目錄

publicbooleanisFile();

publicbooleanisDirectory();(3)獲取文件或目錄名稱與路徑

publicStringgetName();返回文件名或目錄名。

publicStringgetPath();返回文件或目錄的路徑。8.2.1文件與目錄管理(4)獲取文件的長(zhǎng)度

publiclonglength();

(5)獲取文件讀寫(xiě)屬性

publicbooleancanRead();publicbooleancanWrite();(6)列出目錄中的文件

publicString[]list();(7)比較兩個(gè)文件或目錄

publicbooleanequals(Filef);8.2.1文件與目錄管理3、文件及目錄操作

File類(lèi)中還定義了一些對(duì)文件或目錄進(jìn)行管理、操作的方法,常用的方法有:(1)重命名文件

publicbooleanrenameTo(FilenewFile);(2)刪除文件

publicvoiddelete();(3)創(chuàng)建目錄

publicbooleanmkdir();8.2.2文件流對(duì)文件進(jìn)行輸入輸出處理的四個(gè)類(lèi):FileInputStream:字節(jié)文件輸入流;FileOutputStream:字節(jié)文件輸出流;FileReader:字符文件輸入流;FileWriter:字符文件輸出流。8.2.2文件流1、字節(jié)文件輸入流讀取文件(1)FileInputStream類(lèi)FileInputStream(Stringfilename);FileInputStream(Filefile);FileInputStream(FileDescriptorfdObj);(2)從文件輸入流中讀取字節(jié)intread();intread(byteb[]);intread(byteb[],intoff,intlen);intread();每次只能從輸入流中讀取一個(gè)字節(jié)的數(shù)據(jù)。該方法返回的是一個(gè)0~255之間的一個(gè)整數(shù)值,若為文本類(lèi)型的數(shù)據(jù)返回的是ASCII值。若該方法到達(dá)輸入流的末尾,則返回值為-1

。intread(byteb[]);intread(byteb[],intoff,intlen);以字節(jié)型數(shù)組作為參數(shù),一次可以讀取多個(gè)字節(jié),讀入的字節(jié)數(shù)據(jù)直接放入字節(jié)數(shù)組b中,并返回實(shí)際讀取的字節(jié)個(gè)數(shù)。需要注意的是:read方法是阻塞方法,也就是如果流對(duì)象中無(wú)數(shù)據(jù)可以讀取時(shí),則read方法會(huì)阻止程序繼續(xù)向下運(yùn)行,一直到有數(shù)據(jù)可以讀取為止。intread(byteb[])的作用是讀取當(dāng)前流對(duì)象中的數(shù)據(jù),并將讀取到的數(shù)據(jù)依次存儲(chǔ)到數(shù)組b(b需要提前初始化完成)中,也就是把當(dāng)前流中的第一個(gè)字節(jié)的數(shù)據(jù)存儲(chǔ)到b[0],第二個(gè)字節(jié)的數(shù)據(jù)存儲(chǔ)到b[1],依次類(lèi)推。流中已經(jīng)讀取過(guò)的數(shù)據(jù)也會(huì)被刪除,后續(xù)的數(shù)據(jù)會(huì)變成流中的第一個(gè)字節(jié)?!纠?-1】在下面的程序中,讀取一個(gè)文本文件test.dat,并將其顯示到對(duì)話框上。

在編寫(xiě)程序之前,我們至少需要知道兩件事:(1)怎樣把一個(gè)流與一個(gè)文件聯(lián)系起來(lái);(2)用什么方法把從文件中讀取到的數(shù)據(jù)顯示到一個(gè)對(duì)話框中。*讀取文件*/importjava.io.*;importjavax.swing.*;classExample8_1{publicstaticvoidmain(Stringargs[]){bytebuffer[]=newbyte[2056];Stringstr; try{ Filefile=newFile("d:/jtest/test.dat"); FileInputStreamfileInput=newFileInputStream(file);intbytes=fileInput.read(buffer);

str=newString(buffer,0,bytes);}catch(Exceptione) { str=e.toString(); } JOptionPane.showMessageDialog(null,str);System.exit(0);//退出程序

}}8.2.2文件流2、字節(jié)文件輸出流寫(xiě)入文件(1)FileOutputStream類(lèi)FileOutputStream(Stringfilename)FileOutputStream(Filefile)FileOutputStream(FileDescriptorfdObj)(2)把字節(jié)發(fā)送到文件輸出流write(int

b);write(byte[]

b);write(byte[]

b,int

off,int

len);write(int

b):將指定字節(jié)寫(xiě)入此文件輸出流write(byte[]

b):將b.length個(gè)字節(jié)從指定字節(jié)數(shù)寫(xiě)入此文件輸出流中【例8-2】復(fù)制圖像文件a.jpg,并且更名為b.jpg。*讀寫(xiě)圖像文件*/importjavax.swing.JOptionPane;importjava.io.*;classFileRW{intbytes;bytebuffer[]=newbyte[65560];FileInputStreamfileInput;FileOutputStreamfileOutput;FileRW() {takeimg(); loadimg();JOptionPane.showMessageDialog(null,"文件復(fù)制并更名成功!\n文件大小為:"+bytes);System.exit(0);//退出程序

}//讀取圖像文件a.jpgpublicvoidtakeimg() { try{ Filefile=newFile("a.jpg"); fileInput=newFileInputStream(file);bytes=fileInput.read(buffer,0,65560);}catch(IOExceptionei){System.out.println(ei);}}//寫(xiě)入到b.jpgpublicvoidloadimg() { try{ fileOutput=newFileOutputStream("b.jpg");fileOutput.write(buffer,0,bytes); }catch(IOExceptioneo){System.out.println(eo);} }}publicclassExample8_2{publicstaticvoidmain(String[]args) {newFileRW(); }}8.2.2文件流3、字符文件流讀寫(xiě)文本文件(1)FileReader和FileWriter

FileReader(Stringfilename);FileReader(Filefile);FileReader(FileDescriptorfdObj);FileWriter(Stringfilename);FileWriter(Filefile);FileWriter(FileDescriptorfdObj);8.2.2文件流3、字符文件流讀寫(xiě)文本文件(2)用字符流進(jìn)行讀寫(xiě)操作的方法

與字節(jié)輸入輸出流的功能一樣,Reader和Writer只是建立一條通往字符文件的通道,而要實(shí)現(xiàn)對(duì)字符數(shù)據(jù)的讀寫(xiě)操作,還需要讀方法和寫(xiě)方法來(lái)完成。

8.2.2文件流從輸入流中按行讀取字符的方法:

StringreadLine();向輸出流寫(xiě)入多個(gè)字符的方法:

write(String

s,int

off,int

len);將指定的字符串s從偏移量off開(kāi)始的len個(gè)字符寫(xiě)入文件輸出流。刷新BufferedWriter所建立的緩沖區(qū),一次性將緩沖區(qū)中的數(shù)據(jù)寫(xiě)入文件的方法如下:

flush();【例8-3】將文件a.txt讀取到文本區(qū),經(jīng)修改后,另存為b.txt。/*文件的讀取和寫(xiě)入*/importjava.io.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;classWinextendsJFrameimplementsActionListener{FileReaderr_file;FileWriterw_file;BufferedReaderbuf_reader;BufferedWriterbuf_writer;JTextAreatxt;JButtonbtn1,btn2;JPanelp;Win(){setSize(200,200);setVisible(true);txt=newJTextArea(10,10);btn1=newJButton("Read");btn2=newJButton("Write");btn1.addActionListener(this);btn2.addActionListener(this);p=newJPanel();add(txt,"Center");add(p,"South");p.setLayout(newFlowLayout());p.add(btn1);p.add(btn2);validate();setDefaultCloseOperation(EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==btn1){readFile();}if(e.getSource()==btn2){writeFile();}}//讀取文件publicvoidreadFile(){Strings; try{ Filef=newFile("D:/jtest/","Test.txt"); r_file=newFileReader(f);buf_reader=newBufferedReader(r_file); }catch(IOExceptionef){System.out.println(ef);} try{ while((s=buf_reader.readLine())!=null) {txt.append(s+'\n');}}catch(IOExceptioner){System.out.println(er);}}publicvoidwriteFile(){ try{w_file=newFileWriter("D:/jtest/Test.txt");buf_writer=newBufferedWriter(w_file);Stringstr=txt.getText();buf_writer.write(str,0,str.length());buf_writer.flush(); }catch(IOExceptionew){System.out.println(ew);}}}publicclassExample8_3{ publicstaticvoidmain(String[]args) { Winw=newWin(); }}8.3隨機(jī)存取文件和本地可執(zhí)行文件隨機(jī)存取文件流RandomAccessFile類(lèi)可以讀寫(xiě)文件中任意位置上的字節(jié)、文本等數(shù)據(jù)。它有二個(gè)構(gòu)造方法:(1)RandomAccessFile(Stringfilename,Stringmode)(2)RandomAccessFile(Filefile,Stringmode)8.3.1隨機(jī)存取文件流【例8-4】用隨機(jī)存取文件流讀寫(xiě)文件。1./*隨機(jī)流*/2.importjava.io.*;3.classExample8_44.{5. publicstaticvoidmain(String[]args)6. {7. try{8.

RandomAccessFilef=newandomAccessFile("a.txt","rw");9.

f.writeBytes("Zhangsiming");10.

f.close();11.

}12.

catch(IOExceptione){13.

System.out.println(e);14.

}15. }16.

}

見(jiàn)書(shū)上234頁(yè)表8.3隨機(jī)存取文件流的常用方法。8.4數(shù)據(jù)流與對(duì)象流

有許多應(yīng)用程序需要將處理的數(shù)據(jù)作為Java的一種基本類(lèi)型(如布爾型,字節(jié),整數(shù)和浮點(diǎn)數(shù))來(lái)使用。這就要用到數(shù)據(jù)流類(lèi)DataInputStream類(lèi)和DataOutputStream類(lèi)。這兩個(gè)數(shù)據(jù)流類(lèi)是很有用處的,它們?cè)试S程序按機(jī)器無(wú)關(guān)的格式讀取Java原始數(shù)據(jù)。常用方法見(jiàn)表8.4

8.4.1數(shù)據(jù)流8.4.1數(shù)據(jù)流用下面的構(gòu)造方法就可以建立DataInputStream類(lèi)和DataOutputStream類(lèi)的實(shí)例:

publicDataInputStream(InputStreamin);publicDataOutputStream(OutputStreamout);8.4.1數(shù)據(jù)流方法功能close()關(guān)閉流并釋放資源。readBoolean()

讀取一個(gè)布爾值。readByte()讀取一個(gè)字節(jié)。readInt()從文件中讀取一個(gè)int值。readUTF()從文件中讀取一個(gè)UTF字符串。seekByte(intpos)設(shè)置文件指針偏移量,在該位置發(fā)生下一個(gè)讀取或?qū)懭氩僮?。writeBoolean(booleanb)把一個(gè)布爾值作為單字節(jié)值寫(xiě)入。writeChars(Strings)向文件寫(xiě)入一個(gè)字符串。writeInt(intv)向文件寫(xiě)入一個(gè)int值。writeBytes(Strings)向文件寫(xiě)入一個(gè)字符串。writeUTF(Stringstr)使用UTF-8編碼將一個(gè)字符串寫(xiě)入該文件。【例8-9】應(yīng)用DataInputStream類(lèi)和DataOutputStream類(lèi)復(fù)制聲音文件。

importjavax.swing.JOptionPane;importjava.io.*;import

java.util.*;classFileRW{intbytes,f_length;bytebuffer[];FileInputStreamfileInput;FileOutputStreamfileOutput;DataInputStreamdataInput;DataOutputStreamdataOutput;FileRW(){Filefile=newFile("E:"+File.separator+"gongsl2008"+File.separator+"03_布局管理器_1.avi");f_length=(int)file.length();buffer=new

byte[f_length];taking();loading();JOptionPane.showMessageDialog(null,"文件復(fù)制成功!\n文件大小為:"+f_length);System.exit(0);}public

voidtaking(){try{fileInput=newFileInputStream(“f:"+File.separator+"gongsl2008"+File.separator+"Kalimba.mp3");dataInput=newDataInputStream(fileInput);bytes=dataInput.read(buffer);}catch(IOExceptionei){ei.printStackTrace();}try{dataInput.close();}catch(IOExceptionei){ei.printStackTrace();}}public

voidloading(){try{fileOutput=newFileOutputStream(“f:"+File.separator+"gongsl2008"+File.separator+"Kalimba.mp3");dataOutput=newDataOutputStream(fileOutput);dataOutput.write(bu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論