Java輸入輸出流的示例分析,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:國際域名空間、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、海倫網(wǎng)站維護、網(wǎng)站推廣。
所有的程序語言都提?copy;與本機文件系統(tǒng)交互的方式;Java也不例外。我們將看看Java是怎樣處理標準文件輸入輸出的(包括stdin,stout,stderr)。當你在網(wǎng)絡(luò)上開發(fā)小程序時,你必須注意直接文件輸入輸出是不安全因素的關(guān)鍵。大多數(shù)用戶設(shè)置他們的瀏覽器,可讓你自由的訪問他們的文件系統(tǒng),但有?copy;不讓你訪問。當然,如果你開發(fā)你內(nèi)部的應(yīng)用程序,你也許需要直接訪問文件。
標準輸入輸出Unix的用戶,或其他基于命令行系統(tǒng)的用戶(如DOS),都知道標準輸入輸出的含義。標準輸入文件是鍵盤,標準輸出文件是你的終端屏幕。標準錯誤輸出文件也指向屏幕,如果有必要,它也可以指向另一個文件以便和正常輸出區(qū)分。
系統(tǒng)類Java通過系統(tǒng)類達到訪問標準輸入輸出的功能。上面提到的三個文件在這個系統(tǒng)類中實現(xiàn):StdinSystem.in作為InputStream類的一個實例來實現(xiàn)stdin,你可以使用read()和skip(longn)兩個成員函數(shù)。read()讓你從輸入中讀一個字節(jié),skip(longn)讓你在輸入中跳過n個字節(jié)。
StoutSystem.out作為PrintStream來實現(xiàn)stdout,你可以使用print()和println()兩個成員函數(shù)。這兩個函數(shù)支持Java的任意基本類型作為參數(shù)。
StderrSystem.err同stdout一樣實現(xiàn)stderr。象System.out一樣,你可以訪問PrintStream成員函數(shù)。
這里有一個例子,功能象Unix里的cat或type:
importjava.io.*classmyCat{publicvoidmain(Stringargs[])throwsIOException{intb;intcount=0;while((b=System.in.read())!=-1){count++;System.out.print((char)b);}System.out.println();//blanklineSystem.err.println("counted"+count+"totalbytes.");}}
除了基本的鍵盤輸入和屏幕輸出外,我們還需要聯(lián)系文件的輸入輸出。我們將學(xué)習(xí)下面幾個類:lFileInputStreamlDataInputStreamlFileOutputStreamlDataOutputStream
作為參考,再列出一?copy;特定應(yīng)用的類:lPipedInputStreamlBufferedInputStreamlPushBackInputStreamlStreamTokenizerlPipedOutputStreamlBufferedOutputStreamlRandomAccessFile
我們不在此討論這?copy;類,但你可以在JAVA_HOME/src/java/io目錄里查看每個類的成員函數(shù)定義。
在我們進行文件操作時,需要知道一?copy;關(guān)于文件的信息。File類提?copy;了一?copy;成員函數(shù)來操縱文件和獲得一?copy;文件的信息。
你可用下面三個方法來創(chuàng)建一個新文件對象:
FilemyFile;myFile=newFile("etc/motd");
或
myFile=newFile("/etc","motd");//moreusefulifthedirectoryorfilenamearevariables
或
FilemyDir=newfile("/etc");myFile=newFile(myDir,"motd");
這三種方法取決于你訪問文件的方式。例如,如果你在應(yīng)用程序里只用一個文件,第一種創(chuàng)建文件的結(jié)構(gòu)是最容易的。但如果你在同一目錄里打開數(shù)個文件,則第二種或第三種結(jié)構(gòu)更好一?copy;。
一?copy;你創(chuàng)建了一個文件對象,你便可以使用以下成員函數(shù)來獲得文件相關(guān)信息:
文件名lStringgetName()lStringgetPath()lStringgetAbslutePath()lStringgetParent()lbooleanrenameTo(FilenewName)
文件測試lbooleanexists()lbooleancanWrite()lbooleancanRead()lbooleanisFile()lbooleanisDirectory()lbooleanisAbsolute()
一般文件信息llonglastModified()llonglength()
目錄用法lbooleanmkdir()lString[]list()
這里是一個獨立的顯示文件的基本信息的程序,文件通過命令行參數(shù)傳輸:
importjava.io.*;classfileInfo{FilefileToCheck;publicstaticvoidmain(Stringargs[])throwsIOException{if(args.length>0){for(inti=0;i<args.length;i++){fileToCheck=newFile(args[i]);info(fileToCheck);}}else{System.out.println("Nofilegiven.");}}publicvoidinfo(Filef)throwsIOException{System.out.println("Name:"+f.getName());System.out.println("Path:"=f.getPath());if(f.exists()){System.out.println("Fileexists.");System.out.print((f.canRead()?"andisReadable":""));System.out.print((f.cnaWrite()?"andisWriteable":""));System.out.println(".");System.out.println("Fileis"+f.lenght()="bytes.");}else{System.out.println("Filedoesnotexist.");}}}
InputStreamSequenceInputStreamFileInputStreamPipedInputStreamByteArrayInputStreamFileterInputStreamStringBufferInputStream
DataInputStreamLineNumberInputStreamPushbackInputStreamBufferedInputStream有好幾個類是專門用來處理文件輸入的。下面是文件輸入類的層次結(jié)構(gòu):
FileInputStream典型地表示一種順序訪問的文本文件。通過使用FileInputStream你可以訪問文件的一個字節(jié)、幾個字節(jié)或整個文件。
為一個文件打開輸入流FileInputStream,你必須將文件名或文件對象傳送給結(jié)構(gòu):
FileInputStreammyFileStream;myFileStream=newFileInputStream("/etc/motd");
你還可以象下邊這樣從FileInputStream里讀文件信息:
FilemyFile;FileInputSteammyFileStream;myFile=newFile("/etc/motd");myFileStream=newFileInputStream(myFile);
一?copy;FileInputStream輸入流打開,你就可以從里面讀取信息了。read()成員函數(shù)有以下幾種選項:
lintread()//readsonebyte//return-1atendofstreamlintread(byteb[])//fillsentirearray,ifpossible//returnsnumberofbytesread//returns-1ifendofstreamisreached
lintread(byteb[],intoffset,intlen)//readslenbytesintobstartingatb[offset]//Returnsnumberofbytesread,//or-1ifendofstreamisreached.
當你完成一個文件的操作,你可選兩種方法關(guān)閉它:顯式關(guān)閉和隱式關(guān)閉,隱式關(guān)閉是自動垃圾回收時的功能。
顯式關(guān)閉如下:myFileStream.close();
如果文件的訪問權(quán)限足夠,你可以在TextArea對象里顯示文件內(nèi)容。
下面是顯示文件的程序片斷:
FileInputStreamfis;TextAreata;publicvodinit(){byteb[]=newbyte[1024];intI;//makeitbigenoughorwaituntilyou//knowthesizeofthefileStrings;try{fis=newFileInputStream("/etc/motd");}catch(FileNotFoundExceptione){/*dosomethingappropriate*/}try{I=fis.read(b);}catch(IOExceptione){/*dosomethingappropriate*/}s=newString(b,0);ta=newTextArea(s,5,40);add(ta);}
DataInputStreams與FileInputStreams差不多。Data流可以直接讀任意一種變量類型,如浮點數(shù),整數(shù)和字符等。一般來說,對二進制文件使用DataInputStream流。
打開和關(guān)閉DataInputStreams對象時,其方法與FileInputStreams相同:
DataInputStreamsmyDataStream;FileInputStreamsmyFileStream;
//getafilehandlemyFileStream=newFileInputStream("/usr/db/stock.dbf");//open,or"chain"adatainputfilemyDataStream=newDataOutputStream(myFileStream);
//Nowwecanusebothinputstreamstoaccessourfile//j(Ifwewantto...)myFileStream.read(b);I=myDataStrea.readInt();
//closethedatafrielexplicityly//Alwaysclosethe"topmost"filestreammyDataStream.close();myFileStream.close();
當你從DataInputStreams流里訪問文件時,你可以使用與FileInputStream流相同的成員函數(shù)read()。但你也可以使用其他訪問方法來讀取不同種類的數(shù)據(jù):
lbytereadByte()lintreadUnsignedByte()lshortreadShort()lintreadUnsighedShort()lcharreadChar()lintreadIntllongreadLong()lfloatreadFloat()ldoublereadDouble()lStringreadLine()
以上每一個成員函數(shù)都讀取相應(yīng)的數(shù)據(jù)對象。象StringreadLine()成員函數(shù),你可使用\n,\r,\r\n,或EOF作為字符?reg;結(jié)束符。
讀一個長整型,例如:
longserialNo;...serialNo=myDataStream.readLong();
除了基本文件訪問外,Java還提?copy;了通過網(wǎng)絡(luò)使用URL訪問對象的功能。在下面這個例子里,我們用getDocumentBase()成員函數(shù)并顯式指定URL對象來訪問聲音和圖象。
StringimageFile=newString("images/Duke/T1.gif");images[0]=getImage(getDocumentBase(),imageFile();
如果我們愿意,可以直接使用URL:URLimageSource;imageSource=newURL("/upload/otherpic66/675820.gif");
我們可以為相應(yīng)的URL打開輸入流。例如,下面的程序里包括一個數(shù)據(jù)文件:InputStreamis;bytebuffer[]=newbyte[24];is=newURL(getDocumentBase(),dataname).openStream();
現(xiàn)在我們可以使用is,就象使用FileInputStream對象一樣:is.read(buffer.0,buffer.length);
注意:有?copy;用戶設(shè)置了他們的瀏覽器安全屬性,可以不讓你的程序訪問他們的文件。
上面我們談到了讀數(shù)據(jù),那么如何實現(xiàn)寫數(shù)據(jù)呢?象輸入流一樣,輸出流也有類似的層次結(jié)構(gòu):
OutputStream
FileOutputStreamPipedOutputStreamByteArrayOutputStreamFilterOutputStream
DataOutputStreamPrintStreamBufferedOutputStream
我們將分析FileOutputStream和DataOutputStream類來完成我們碰到的輸出流問題。其它的輸出流包含了更多的信息和成員函數(shù)。象輸入流的源文件一樣,這?copy;文件在$JAVA_HOME/src/java/io目錄下。
FileOutputStream對象用于向一個文本文件寫數(shù)據(jù)。象輸入文件一樣,你得先打開這個文件后才能寫這個文件。
要打開一個FileOutputStream對象,象打開一個輸入流一樣,你可以將字符?reg;或文件對象作為參數(shù):FileOutputStreammyFileStream;myFileStream=newFileOutputStream("/etc/motd");
象輸入流一樣,你也可這樣使用:FilemyFile;FileOutputStreammyFileStream;myFile=newFile("/etc/motd");myFileStream=newFileOutputStream(myFile);
一?copy;文件被打開,你便可以使用write()函數(shù)向文件里寫一?copy;數(shù)據(jù)。就象輸入流的read()函數(shù)一樣,你可有三種方法:lvoidwrite(intb);//writesoutonebytelvoidwrite(byteb[]);//writesoutentirearraylvoidwrite(byteb[],intoffset,intlength);//writeoutlengthbytesofb[],startingatb[offset]
關(guān)閉輸出流和關(guān)閉輸入流方法一樣,你可以使用顯式方法:myFileStream.close();你也可以讓系統(tǒng)自動關(guān)閉它。
下面有一個程序,讓用戶輸入一?copy;姓名和電話號碼。每一個姓名和號碼將加在文件里。用戶通過點“Done"按鈕來告訴系統(tǒng)整個列表已輸入完畢。
一?copy;用戶輸入完整個列表,程序?qū)?chuàng)建一個輸出文件并顯示或打印出來。例如:
555-1212,Tom123-456-7890,PeggyL.234-5678,Marc234-5678,Ron876-4321,Beth&Brian33.1.42.45.70,Jean-Marc
下面是程序的源代碼:importjava.io.*;
//Phones.java//Asimpledatabasecreationprogram
classPhones{staticFileOutputStreamfos;publicstaticfinalintlineLength=81;publicstaticvoidmain(Stringargs[])throwsIOExciption{byte[]phone=newbyte[lineLength];byte[]name=newbyte[lineLenght];intI;fos=newFileOutputStream("phone.numbers");while(true){System.err.println("Enteraname(enter'done'toquit)");readLine(name);if("done".equalsIgnoreCase(newString(name,0,0,4))){break;}System.err.println("Enterthephonenumber");readLine(phone);for(i=0;phone[i]!=0;i++){fos.write(phone[i]);}fos.write(',');for(i=0;name[i]!=0;I++){fos.write(name[i]);}fos.write('\n');}fos.close();}
privatestaticvoidreadLine(byteline[])throwsIOException{inti=0,b=0;
while((i<lineLengh-1))&&((b=System.ini.read())!='\n')){line[i++]=(byte)b;}line[i]=(byte)0;}}
如果你處理的數(shù)據(jù)量很多,或向文件寫很多次小數(shù)據(jù),你可以使用一個BufferedOutput流。BufferedOutput流提?copy;和FileOutputStream類同樣的寫操作方法,但所有輸出全部存放在一個緩沖區(qū)里。當你填滿緩沖區(qū),它將一次性寫入磁盤?;蛘吣阒鲃訉⒕彌_區(qū)寫入磁盤。
如果要創(chuàng)建一個BufferedOutput流,首先需要一個FileOutput流。然后將緩沖區(qū)鏈接到FileOutput流:FileOutputStreammyFileStream;BufferedOutputStreammyBufferStream;//getafilehandlemyFileStream=newFileOutputStream("/usr/db/stock.dbf");//chainabufferedoutputstreammyBufferSSstream=newBufferedOutputStream(myFileStream);
和普通FileOutput流一樣,向BufferedOutput流里的每一次寫操作和寫入磁盤操作并不是一一對應(yīng)的。要想在程序結(jié)束?reg;前將緩沖區(qū)里的數(shù)據(jù)寫入磁盤,除非填滿緩沖區(qū),否則只有顯式調(diào)用flush()函數(shù)://forceleft-overdatatodiskmyBufferStream.flush();//closethedatafileexplicitly//Alwaysclosethe"topmost"filestreammyBufferStream.close();myFileStream.close();
和DataInputStream對應(yīng),Java還提?copy;了DataOutput流。使用DataOutput流,我們可以向文件寫入二進制數(shù)據(jù)。
打開和關(guān)閉DataOutput流對象與打開、關(guān)閉FileOutput流對象方法一樣:DataOutputStreammyDataStream;FileOutputStreammyFileStream;BufferedOutputStreammyBufferStream;
//getafilehandlemhyFileStream=newFileOutputStream("/usr/db/stock.dbf");//chainabufferedoutputstream(forefficiency);myBufferStream=newBufferedOutputStream(myFileStream);//chainadataoutputfilemyDataStream=newDataOutputStream(myBufferStream);
//Nowwecanusebothinputstreamstoaccessourfile//(iiIfwewantto...)myBufferStream.write(b);myDataStream.writeInt(i);
//closethedatafileexplicitly//Alwayscolsethe"topmost"filestreammyDataStream.close();myBuffersStream.close();myFileStream.close();
FileOutput流里的write()函數(shù)各種方法都適用于DataOutput流。你還可以看到DataInput流的類似函數(shù)方法:lvoidwriteBoolean(booleanv)lvoidwriteByte(intv)lvoidwriteShort(intv)lvoidwriteChar(intv)lvoidwriteInt(intv)lvoidwriteFloat(floatv)lvoidwriteDouble(doublev)lvoidwriteBytes(strings)lvoidwriteChars(strings)
對字符?reg;來說,有兩種選擇:byte和char。記住byte是8位數(shù)據(jù)而char是16位數(shù)據(jù)。如果你想利用Unicode字符的優(yōu)點,你應(yīng)使用writeChars()函數(shù)。
在使用二進制數(shù)據(jù)輸出時常用的另外一個函數(shù)是size()。這個函數(shù)返回寫入文件數(shù)據(jù)的總字節(jié)數(shù)。你也可用size()函數(shù)將數(shù)據(jù)文件分成四字節(jié)為單位的塊,例如:...intbytesLeft=myDataStream.size()%4;for(intI=0;I<bytesLeft;I++){myDataStrea.write(0);}...
我們讀文件常常不是從頭至尾順序讀的。你也許想將一文本文件當作一個數(shù)據(jù)庫,讀完一個記錄后,跳到另一個記錄,它們在文件的不同地方。Java提?copy;了RandomAccessFile類讓你操作這種類型的輸入輸出。
打開隨機訪問文件有兩種方法:l用文件名myRAFile=newRandomAccessFile(Stringname,Stringmode);l用文件對象myRAFile=newRandomAccessFile(Filefile,Stringmode);
mode參數(shù)決定了訪問文件的權(quán)限,如只讀'r'或讀寫'wr'等。
例如,我們打開一個數(shù)據(jù)庫更新數(shù)據(jù):RandomAccessFilemyRAFile;myRAFile=newRandomAccessFile("/usr/db/stock.dbf","rw");
RandomAccessFile對象的讀寫操作和DataInput/DataOutput對象的操作方式一樣。你可以使用在DataInputStream和DataOutputStream里出現(xiàn)的所有read()和write()函數(shù)。
還有幾個函數(shù)幫助你在文件里移動指針:llonggetFilePointer();返回當前指針lvoidseek(longpos);將文件指針定位到一個絕對地址。地址是相對于文件頭的偏移量。地址0表示文件的開頭。llonglength();返回文件的長度。地址"length()"表示文件的結(jié)尾。
你可以使用隨機訪問文件來設(shè)置成增加信息模式:myRAFile=newRandomAccessFile("/tmp/java.log","rw");myRAFile.seek(myRAFile.length());//Anysubsequentwrite()swillbeappendedtothefile
9.13.4追加信息例子下面是一個在已存在文件后面追加字符?reg;的例子:importjava.io.IOException;importjava.io.RandomAccessFile;
classraTest{publicstaticvoidmain(Stringargs[])throwsIOException{RandomAccessFilemyFAFile;Strings="InformationtoAppend\nHimom!\n";//openourrandomaccessfilemyRAFile=newRandomAccessFile("/tmp/java.log","rw");//movetotheendofthefilemyRAFile.seek(myRAFile.length());//Startappending!myRAFile.writeBytes(s);
myRAFile.close();}}
1.Java通過系統(tǒng)類達到訪問標準輸入輸出的功能。2.你可以創(chuàng)建、讀、寫文件。
關(guān)于Java輸入輸出流的示例分析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
新聞名稱:Java輸入輸出流的示例分析
轉(zhuǎn)載源于:http://muchs.cn/article12/jpdpgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站維護、網(wǎng)站策劃、搜索引擎優(yōu)化、網(wǎng)站制作、標簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)