版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章
Java在文件中的應(yīng)用13.1流式輸入輸出與文件處理3.2文件概念解讀3.3File類3.4事務(wù)處理程序3.5文件相關(guān)類
23.1流式輸入輸出與文件處理與外部設(shè)備和其他計(jì)算機(jī)進(jìn)行交流的輸入輸出操作,尤其是對(duì)磁盤的文件操作,是計(jì)算機(jī)程序重要而必備的功能,任何計(jì)算機(jī)語言都必須對(duì)輸入輸出提供支持。Java語言也不例外,它的輸入輸出類庫中包含了豐富的系統(tǒng)工具——已定義好的用于不同情況的輸入輸出類。利用它們,Java程序可以很方便地實(shí)現(xiàn)多種輸入輸出操作和復(fù)雜的文件與目錄管理。33.1.1Java輸入輸出類庫Java的輸入輸出功能必須借助于輸入輸出類庫Java.io包來實(shí)現(xiàn),這個(gè)包中的類大部分是用來完成流式輸入輸出的流類。下面介紹一下流的概念:1.流的概念在Java里,信息可以使用一套叫做“流”的通信系統(tǒng)來存儲(chǔ)和獲取,該系統(tǒng)是在包Java.io中實(shí)現(xiàn)的。事實(shí)上,流(stream)就是指在計(jì)算機(jī)的輸入與輸出之間運(yùn)動(dòng)的數(shù)據(jù)序列。它是一種功能強(qiáng)大的數(shù)據(jù)處理機(jī)制,就像共享著同一個(gè)名字的水流一樣,可以將某些內(nèi)容從一個(gè)地方帶到另一個(gè)地方。一個(gè)流是程序中數(shù)據(jù)所途徑的一條路徑,那么輸入流(inputstream)就是將數(shù)據(jù)從某個(gè)外設(shè)(源端)發(fā)送到程序中,而一個(gè)輸出流(outputstream)是將數(shù)據(jù)從程序中向外發(fā)送到某個(gè)外設(shè)(目的端)。字節(jié)流(bytestream):主要是用來處理字節(jié)、整數(shù)和其他簡(jiǎn)單的數(shù)據(jù)類型。字符流(characterstream):是一個(gè)特殊類型的字節(jié)流,但是不同于字節(jié)流,主要是用來處理文本文件和其他文件數(shù)據(jù)源。過濾流(Filteredstream):是使用FilterInputStream或FilterOutputStream的子類之一創(chuàng)建的,是對(duì)現(xiàn)有流所傳遞的信息進(jìn)行修改的流。緩沖區(qū)(buffer):是一片存儲(chǔ)區(qū)域,數(shù)據(jù)在需要由程序讀取或?qū)懭胫岸伎梢源娣旁谀抢?。通過使用緩沖區(qū),可以不用總是回溯到最初的數(shù)據(jù)源那里去獲取數(shù)據(jù)。緩沖流(bufferstream):帶緩沖的字節(jié)流用到了BufferedInputStream和BufferedOutputStream。4文件的處理與隨機(jī)訪問1.java程序的文件與目錄管理任何計(jì)算機(jī)程序運(yùn)行時(shí),它的指令和數(shù)據(jù)都保存在系統(tǒng)的內(nèi)存中,由于每次計(jì)算機(jī)關(guān)機(jī)時(shí)保存在內(nèi)存中的所有信息都會(huì)丟失,所以程序要想永久保存運(yùn)算處理所得的結(jié)果,就必須把這些結(jié)果保存在磁盤文件中,文件是數(shù)據(jù)賴以保存的永久性機(jī)制,文件操作是計(jì)算機(jī)程序必備的功能。目錄是管理文件的特殊機(jī)制,同類文件包括在同一個(gè)目錄下可以簡(jiǎn)化文件管理,提高工作效率。Java語言不但支持文件管理,還支持其他語言。例如C語言所不支持的目錄管理,但在java語言中,它們都是由專門的類File來實(shí)現(xiàn)。File類也在java.io包中,但它不是InputStream或者OutputStream的子類,因?yàn)樗回?fù)責(zé)數(shù)據(jù)的輸入輸出,而專門用來管理磁盤文件和目錄。每個(gè)File類的對(duì)象表示一個(gè)磁盤文件或目錄,其對(duì)象屬性中包含了文件或目錄的相關(guān)信息,如名稱、長(zhǎng)度、所含文件個(gè)數(shù)等,調(diào)用它的方法則可以完成對(duì)文件或目錄的常用管理操作,如創(chuàng)建、刪除等。
5//TestFileDialog.java1:importjava.io.*;2:importjava.awt.*;3:import.*;4:publicclassTestFileDialog{5:publicstaticvoidmain(Stringargs[]){6:newFileFrame();}}7:classFileFrameextendsFrameimplementsActionListener{8:TextAreata;9:Buttonopen,quit;10:FileDialogfd;11:FileFrame(){12:super(“獲取并顯示文本文件”);13:ta=newTextArea(10,45);14:open=newButton(“打開”);15:quit=newButton(“關(guān)閉”);16:open.addActionListener(this);17:quit.addActionListener(this);18:setLayout(newFlowLayout());19:add(ta);620:add(open);21:add(quit);22:setSize(350,280);23:show();}24:publicvoidactionPerformed(ActionEvente){25:if(e.getActionCommand()==”打開”)26:{27:fd=newFileDialog(this,”打開文件”,FileDialog.LOAD);28:fd.setDirectory(“c:\\temp”);//設(shè)置文件對(duì)話框的基礎(chǔ)目錄29:fd.show();//彈出并顯示文件對(duì)話框,程序暫停直至用戶選定一文件30:try{31:Filemyfile=newFile(fd.getDirectory(),fd.getFile());32:RandomAccessFileraf=newRandomAccessFile(myfile,”r”);33:while(raf.getFilePointer()<raf.length())34:{ta.append(raf.readLine()+”\n”);}35:}36:catch(IOExceptionioe){37:System.err.println(ioe.toString());}38:}39:if(e.getActionCommand()==”關(guān)閉”)40:{41:dispose();42:System.exit(0);43:}44:}45:}78保存在變量或數(shù)組中的數(shù)據(jù)是臨時(shí)性的。例如,當(dāng)局部變量溢出或者程序運(yùn)行終止時(shí),數(shù)據(jù)便丟失了。但是,即使產(chǎn)生數(shù)據(jù)的程序運(yùn)行結(jié)束了,用于保存數(shù)據(jù)的文件(file)依然長(zhǎng)期存在。文件中所包含的數(shù)據(jù)一般稱為永久性數(shù)據(jù)(persistentdata)。計(jì)算機(jī)一般將數(shù)據(jù)保存在輔助設(shè)備(secondarystoragedevice)中,例如磁盤、光盤和磁帶等。文件處理是任何一種語言所必需的一項(xiàng)重要功能,只有具備這一功能才可支持具有處理大量永久數(shù)據(jù)能力的應(yīng)用程序開發(fā)。3.2文件概念解讀9計(jì)算機(jī)處理的所有的數(shù)據(jù)項(xiàng)最終都要被分解為0和1的組合。這是由于制造能夠表示兩種狀態(tài)的電子設(shè)備比較簡(jiǎn)單而且易于實(shí)現(xiàn),這兩種狀態(tài)分別代表0和1。由于計(jì)算機(jī)完成的一切杰出功能都是基于對(duì)0和1的操作。這樣的一個(gè)數(shù)據(jù)項(xiàng)成為位(bit),8位組成一個(gè)字節(jié),多個(gè)字節(jié)組成字段,計(jì)算機(jī)處理的記錄由多個(gè)字段構(gòu)成。例如在一個(gè)工資管理系統(tǒng)中,某一職工的記錄可能是由以下字段組成:職工號(hào)、姓名、性別、住址、月工資等。數(shù)據(jù)層次結(jié)構(gòu)10文件和流Java把每個(gè)文件作為順序字節(jié)流,且每個(gè)文件均以一個(gè)文件結(jié)束標(biāo)記(EOF),或者以記錄在系統(tǒng)管理數(shù)據(jù)結(jié)構(gòu)中的一個(gè)特殊的字節(jié)編號(hào)結(jié)束。當(dāng)用戶打開一個(gè)文件,系統(tǒng)便創(chuàng)建一個(gè)對(duì)象,并且建立對(duì)象與流間的關(guān)聯(lián)。當(dāng)用戶開始運(yùn)行Java應(yīng)用程序或applet時(shí),會(huì)自動(dòng)建立3個(gè)對(duì)象:System.in、System.out和System.err。與這些對(duì)象相聯(lián)系的流可以為程序提供與指定外設(shè)或設(shè)備間的通信通道。例如,System.in對(duì)象(標(biāo)準(zhǔn)輸入流對(duì)象)使程序能夠讀取來自鍵盤的輸入,System.out對(duì)象(標(biāo)準(zhǔn)輸出流對(duì)象)使程序能夠向屏幕輸出數(shù)據(jù),而System.err對(duì)象(標(biāo)準(zhǔn)錯(cuò)誤流對(duì)象)則使程序能夠在屏幕上顯示出錯(cuò)信息。11創(chuàng)建順序存取文件Java沒有對(duì)文件結(jié)構(gòu)作出規(guī)定,因此,Java文件中也就不存在“記錄”的概念。這樣一來,程序員就必須將文件結(jié)構(gòu)化以適應(yīng)應(yīng)用程序的要求。在下面的例子中將演示如何對(duì)文件中實(shí)現(xiàn)簡(jiǎn)單的記錄結(jié)構(gòu)化。首先給出例程,然后再對(duì)它詳細(xì)說明。下例的程序建立了一個(gè)順序存取的文件,這一個(gè)文件可以用于欠款系統(tǒng)中以協(xié)助管理公司客戶的欠款。對(duì)于每個(gè)客戶,程序都有一個(gè)帳號(hào)、客戶名、客戶姓以及客戶的欠款余額。每個(gè)客戶的數(shù)據(jù)信息構(gòu)成一個(gè)記錄。本程序中用帳號(hào)作為記錄的關(guān)鍵字,即文件將按照帳號(hào)的順序建立和維護(hù)。程序假設(shè)客戶按帳號(hào)順序輸入記錄。在一個(gè)復(fù)雜的欠款系統(tǒng)中應(yīng)提供排序功能,這樣用戶可以用任何順序輸入數(shù)據(jù),然后程序?qū)τ涗涍M(jìn)行排序并寫入文件。12從順序存取文件讀取數(shù)據(jù)數(shù)據(jù)保存在文件中,這樣當(dāng)需要它們時(shí)再將其讀出來。上一節(jié)介紹了如何建立一個(gè)順序存取文件,本節(jié)來介紹如何將數(shù)據(jù)從文件中順序讀出。//ReadSequentialFile.java1:importjava.io.*;2:importjava.awt.*;3:import.*;4:importjavax.swing.*;5:importjava_file.*;6:publicclassReadSequentialFileextendsJFrame{7:privateObjectInputStreaminput;8:privateBankUIuserInterface;9:privateJButtonnextRecord,open;//初始化窗體10:publicReadSequentialFile()11:{12:super(“ReadingaSequentialFileofObjects”);13:getContentPane().setLayout(newBorderLayout());14:userInterface=newBankUI();15:nextRecord=userInterface.getDoTask();16:nextRecord.setText(“NextRecord”);17:nextRecord.setEnabled(false);1318:nextRecord.addActionListener(newActionListener(){19:publicvoidactionPerformed(ActionEvente)20:{21:readRecord();22:}23:}24:);25:addWindowListener(newWindowAdapter(){26:publicvoidwindowClosing(WindowEvente){27:if(input!=null)28:closeFile();29:System.exit(0);30:}31:}32:);1433:open=userInterface.getDoTask2();34:open.setText(“OpenFile”);35:open.addActionListener(newActionListener()36:{37:publicvoidactionPerformed(ActionEvente)38:{39:openFile();40:}41:}42:);43:getContentPane().add(userInterface,BorderLayout.CENTER);44:pack();45:setSize(300,200);46:show();47:}48:privatevoidopenFile()49:{50:JFileChooserfileChooser=newJFileChooser();51:fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);1552:intresult=fileChooser.showOpenDialog(this);//用戶單擊對(duì)話框取消按鈕53:if(result==JFileChooser.CANCEL_OPTION)54:return;55:Filefilename=fileChooser.getSelectedFile();56:if(filename==null||filename.getName().equals(“”))57:JOptionPane.showMessageDialog(this,”InvalidFileName”,58:”InvalidFileName”,JOptionPane.ERROR_MESSAGE);59:else60:{//打開文件61:try{62:input=newObjectInputStream(newFileInputStream(filename));63:open.setEnabled(false);64:nextRecord.setEnabled(true);65:}66:catch(IOExceptione){67:JOptionPane.showMessageDialog(this,”ErrorOpeningFile”,“Error”,JOptionPane.ERROR_MESSAGE);}68:}69:}16//初始化窗體結(jié)束70:publicvoidreadRecord()71:{72:BankAccountRecordrecord;//從文件中輸入值73:try74:{75:record=(BankAccountRecord)input.readObject();76:Stringvalues[]={String.valuesOf(record.getAccount()),record.getFirstName(),record.getLastName(),String.valueOf(record.getBalance())77:};78:userInterface.setFieldValues(values);79:}80:catch(EOFExceptioneofex)81:{82:nextRecord.setEnabled(false);83:JOptionPane.showMessageDialog(this,”Nomorerecordsinfile”,“EndofFile”,JOptionPane.ERROR_MESSAGE);84:}85:catch(ClassNotFoundExceptioncnfex){86:JOptionPane.showMessageDialog(this,”Unabletocreateobject”,“ClassNotFound”,JoptionPane.ERROR_MESSAGE);1787:}88:catch(IOExceptionioex){89:JOptionPane.showMessageDialog(this,”Errorduringreadfromfile”,“ReadError”,JOptionPane.ERROR_MESSAGE);90:}91:}92:privatevoidcloseFile()93:{try{94:input.close();95:System.exit(0);}96:catch(IOExceptione){97:JOptionPane.showMessageDialog(this,”Errorclosingfile”,”Error”,JOptionPane.ERROR_MESSAGE);98:System.exit(1);}99:}100:publicstaticvoidmain(Stringargs[])101:{102:newReadSequentialFile();103:}104:}
183.2.5隨機(jī)存取文件順序存取文件對(duì)于“即時(shí)存取”程序來說并不合適,例如銀行系統(tǒng),每個(gè)銀行都可能有成千上萬個(gè)用戶的帳戶,當(dāng)用戶使用自動(dòng)取款機(jī)(ATM)時(shí),系統(tǒng)必須在幾秒內(nèi)作出回答。需要快速存取就要使用隨機(jī)存取文件(random-accessfile)。程序無需檢索所有記錄,可以直接且迅速地存取隨機(jī)存取文件中的獨(dú)立記錄。隨機(jī)存取文件有時(shí)也稱為直接存取文件(direct-accessfile)。因?yàn)镴ava語言本身對(duì)文件沒有結(jié)構(gòu)要求,所有需要使用隨機(jī)存取的程序必須自己建立它們。創(chuàng)建隨機(jī)存取文件的方法有很多。其中最簡(jiǎn)單的一種可能是文件中的所有記錄均保持相等的固定長(zhǎng)度。利用固定記錄長(zhǎng)度的方法使程序很容易就能計(jì)算出任何一條記錄距離文件頭的距離。隨機(jī)存取文件像一列有許多車廂的火車,有的車廂是空的而有的車廂有貨物。數(shù)據(jù)可以被插入到一個(gè)隨機(jī)存取的文件中而不影響里面的其他數(shù)據(jù),以前保存在文件中的數(shù)據(jù)也可以方便地修改或刪除。193.2.6向隨機(jī)存取文件隨機(jī)寫入數(shù)據(jù)下面的程序以rw模式打開的文件中寫入數(shù)據(jù)。其中使用了RandomAccessFile類的seek方法確定文件中保存記錄信息的確切位置。seek方法將文件定位指針設(shè)置到相對(duì)于文件頭的指定位置上,并用Record類的write方法輸出數(shù)據(jù)。在該程序中假設(shè)用戶不輸入重復(fù)帳號(hào)并且在JTextField中輸入適當(dāng)?shù)臄?shù)據(jù)類型。20//WriteRandomFile.java1:importjava_file.*;2:importjavax.swing.*;3:importjava.io.*;4:import.*;5:importjava.awt.*;6:publicclassWriteRandomFileextendsJFrame{7:privateRandomAccessFileoutput;8:privateBankUIuserInterface;9:privateJButtonenter,open;//初始化窗口10:publicWriteRandomFile()11:{12:super(“Writetorandomaccessfile”);13:userInterface=newBankUI();14:enter=userInterface.getDoTask();15:enter.setText(“Enter”);16:enter.setEnabled(false);17:enter.addActionListener(newActionListener(){18:publicvoidactionPerformed(ActionEvente)2119:{20:addRecord();21:}22:}23:);24:addWindowListener(newWindowAdapter(){25:publicvoidwindowClosing(WindowEvente)26:{27:if(output!=null){28:addRecord();29:closeFile();30:}31:else32:System.exit(0);33:}34:}35:);2236:open=userInterface.getDoTask2();37:open.setText(“SaveAs”);38:open.addActionListener(newActionListener(){39:publicvoidactionPerformed(ActionEvente)40:{//打開文件41:openFile();42:}43:}44:);45:getContentPane().add(userInterface,BorderLayout.CENTER);46:setSize(300,150);47:show();48:}49:privatevoidopenFile()50:{51:JFileChooserfileChooser=newJFileChooser();2352:fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);53:intresult=fileChooser.showSaveDialog(this);54:if(result==JFileChooser.CANCEL_OPTION)55:return;56:Filefilename=fileChooser.getSelectedFile();57:if(filename==null||filename.getName().equals(“”))58:JOptionPane.showMessageDialog(this,”InvalidFileName”,“InvalidFileName”,JOptionPane.ERROR_MESSAGE);59:else{//打開文件60:try{61:output=newRandomAccessFile(filename,”rw”);62:enter.setEnabled(true);63:open.setEnabled(false);64:}65:catch(IOExceptione){66:JOptionPane.showMessageDialog(this,”Filedoesnotexist”,“InvalidFileName”,JOptionPane.ERROR_MESSGAGE);67:}68:}69:}2470:privatevoidcloseFile()71:{72:try{73:output.close();74:System.exit(0);75:}76:catch(IOExcetptionex)77:{78:JOptionPane.showMessageDialog(this,”Errorclosingfile”,”Error”,JOptionPane.ERROR_MESSAGE);79:System.exit(1);80:}81:}82:publicvoidaddRecord()83:{84:intaccountNumber=0;85:Stringfields[]=userInterface.getFieldValues();86:Recordrecord=newRecord();87:if(!fields[BankUI.ACCOUNT].equals(“”)){//輸出文件的值88:try{89:accountNumber=Integer.parseInt(fields[BankUI.ACCOUNT]);2590:if(accountNumber>0&&accountNumber<=100){91:record.setAccount(accountNumber);92:record.setFirstName(fields[BankUI.FIRST]);93:record.setLastName(fields[BankUI.LAST]);94:record.setBalance(Double.parseDouble(fields[BankUI.BALANCE]));95:output.seek((accountNumber-1)*Record.size());96:record.write(output)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度聯(lián)合體競(jìng)標(biāo)大連項(xiàng)目協(xié)議書4篇
- 2025年度出口企業(yè)出口信用證抵押外匯貸款合同3篇
- 二零二五年度小學(xué)操場(chǎng)跑道翻新及跑道材料供應(yīng)合同3篇
- 二零二五年度特種車輛運(yùn)輸安全協(xié)議書4篇
- 二零二五年度電梯設(shè)備進(jìn)出口貿(mào)易合同4篇
- 二零二五年度事業(yè)單位員工離崗創(chuàng)業(yè)項(xiàng)目人力資源配置合同4篇
- 二零二五年度干旱地區(qū)抽水扶貧項(xiàng)目合同4篇
- 二零二五年度糧油批發(fā)市場(chǎng)采購合作框架協(xié)議4篇
- 2025年度地質(zhì)災(zāi)害預(yù)警與沉降監(jiān)測(cè)服務(wù)合同4篇
- 二零二五版煤炭行業(yè)運(yùn)輸服務(wù)外包合同4篇
- 農(nóng)民工工資表格
- 【寒假預(yù)習(xí)】專題04 閱讀理解 20篇 集訓(xùn)-2025年人教版(PEP)六年級(jí)英語下冊(cè)寒假提前學(xué)(含答案)
- 2024年突發(fā)事件新聞發(fā)布與輿論引導(dǎo)合同
- 地方政府信訪人員穩(wěn)控實(shí)施方案
- 小紅書推廣合同范例
- 商業(yè)咨詢報(bào)告范文模板
- 2024年智能監(jiān)獄安防監(jiān)控工程合同3篇
- 幼兒園籃球課培訓(xùn)
- AQ 6111-2023個(gè)體防護(hù)裝備安全管理規(guī)范知識(shí)培訓(xùn)
- 老干工作業(yè)務(wù)培訓(xùn)
- 基底節(jié)腦出血護(hù)理查房
評(píng)論
0/150
提交評(píng)論