您好,登錄后才能下訂單哦!
Java輸入輸出流的示例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
所有的程序語言都提?copy;與本機文件系統交互的方式;Java也不例外。我們將看看Java是怎樣處理標準文件輸入輸出的(包括stdin,stout,stderr)。當你在網絡上開發小程序時,你必須注意直接文件輸入輸出是不安全因素的關鍵。大多數用戶設置他們的瀏覽器,可讓你自由的訪問他們的文件系統,但有?copy;不讓你訪問。當然,如果你開發你內部的應用程序,你也許需要直接訪問文件。
標準輸入輸出Unix的用戶,或其他基于命令行系統的用戶(如DOS),都知道標準輸入輸出的含義。標準輸入文件是鍵盤,標準輸出文件是你的終端屏幕。標準錯誤輸出文件也指向屏幕,如果有必要,它也可以指向另一個文件以便和正常輸出區分。
系統類Java通過系統類達到訪問標準輸入輸出的功能。上面提到的三個文件在這個系統類中實現:StdinSystem.in作為InputStream類的一個實例來實現stdin,你可以使用read()和skip(longn)兩個成員函數。read()讓你從輸入中讀一個字節,skip(longn)讓你在輸入中跳過n個字節。
StoutSystem.out作為PrintStream來實現stdout,你可以使用print()和println()兩個成員函數。這兩個函數支持Java的任意基本類型作為參數。
StderrSystem.err同stdout一樣實現stderr。象System.out一樣,你可以訪問PrintStream成員函數。
這里有一個例子,功能象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.");}}
除了基本的鍵盤輸入和屏幕輸出外,我們還需要聯系文件的輸入輸出。我們將學習下面幾個類:lFileInputStreamlDataInputStreamlFileOutputStreamlDataOutputStream
作為參考,再列出一?copy;特定應用的類:lPipedInputStreamlBufferedInputStreamlPushBackInputStreamlStreamTokenizerlPipedOutputStreamlBufferedOutputStreamlRandomAccessFile
我們不在此討論這?copy;類,但你可以在JAVA_HOME/src/java/io目錄里查看每個類的成員函數定義。
在我們進行文件操作時,需要知道一?copy;關于文件的信息。File類提?copy;了一?copy;成員函數來操縱文件和獲得一?copy;文件的信息。
你可用下面三個方法來創建一個新文件對象:
FilemyFile;myFile=newFile("etc/motd");
或
myFile=newFile("/etc","motd");//moreusefulifthedirectoryorfilenamearevariables
或
FilemyDir=newfile("/etc");myFile=newFile(myDir,"motd");
這三種方法取決于你訪問文件的方式。例如,如果你在應用程序里只用一個文件,第一種創建文件的結構是最容易的。但如果你在同一目錄里打開數個文件,則第二種或第三種結構更好一?copy;。
一?copy;你創建了一個文件對象,你便可以使用以下成員函數來獲得文件相關信息:
文件名lStringgetName()lStringgetPath()lStringgetAbslutePath()lStringgetParent()lbooleanrenameTo(FilenewName)
文件測試lbooleanexists()lbooleancanWrite()lbooleancanRead()lbooleanisFile()lbooleanisDirectory()lbooleanisAbsolute()
一般文件信息llonglastModified()llonglength()
目錄用法lbooleanmkdir()lString[]list()
這里是一個獨立的顯示文件的基本信息的程序,文件通過命令行參數傳輸:
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有好幾個類是專門用來處理文件輸入的。下面是文件輸入類的層次結構:
FileInputStream典型地表示一種順序訪問的文本文件。通過使用FileInputStream你可以訪問文件的一個字節、幾個字節或整個文件。
為一個文件打開輸入流FileInputStream,你必須將文件名或文件對象傳送給結構:
FileInputStreammyFileStream;myFileStream=newFileInputStream("/etc/motd");
你還可以象下邊這樣從FileInputStream里讀文件信息:
FilemyFile;FileInputSteammyFileStream;myFile=newFile("/etc/motd");myFileStream=newFileInputStream(myFile);
一?copy;FileInputStream輸入流打開,你就可以從里面讀取信息了。read()成員函數有以下幾種選項:
lintread()//readsonebyte//return-1atendofstreamlintread(byteb[])//fillsentirearray,ifpossible//returnsnumberofbytesread//returns-1ifendofstreamisreached
lintread(byteb[],intoffset,intlen)//readslenbytesintobstartingatb[offset]//Returnsnumberofbytesread,//or-1ifendofstreamisreached.
當你完成一個文件的操作,你可選兩種方法關閉它:顯式關閉和隱式關閉,隱式關閉是自動垃圾回收時的功能。
顯式關閉如下:myFileStream.close();
如果文件的訪問權限足夠,你可以在TextArea對象里顯示文件內容。
下面是顯示文件的程序片斷:
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流可以直接讀任意一種變量類型,如浮點數,整數和字符等。一般來說,對二進制文件使用DataInputStream流。
打開和關閉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流相同的成員函數read()。但你也可以使用其他訪問方法來讀取不同種類的數據:
lbytereadByte()lintreadUnsignedByte()lshortreadShort()lintreadUnsighedShort()lcharreadChar()lintreadIntllongreadLong()lfloatreadFloat()ldoublereadDouble()lStringreadLine()
以上每一個成員函數都讀取相應的數據對象。象StringreadLine()成員函數,你可使用\n,\r,\r\n,或EOF作為字符?reg;結束符。
讀一個長整型,例如:
longserialNo;...serialNo=myDataStream.readLong();
除了基本文件訪問外,Java還提?copy;了通過網絡使用URL訪問對象的功能。在下面這個例子里,我們用getDocumentBase()成員函數并顯式指定URL對象來訪問聲音和圖象。
StringimageFile=newString("images/Duke/T1.gif");images[0]=getImage(getDocumentBase(),imageFile();
如果我們愿意,可以直接使用URL:URLimageSource;imageSource=newURL("https://cache.yisu.com/upload/information/20210522/355/675820.gif");
我們可以為相應的URL打開輸入流。例如,下面的程序里包括一個數據文件:InputStreamis;bytebuffer[]=newbyte[24];is=newURL(getDocumentBase(),dataname).openStream();
現在我們可以使用is,就象使用FileInputStream對象一樣:is.read(buffer.0,buffer.length);
注意:有?copy;用戶設置了他們的瀏覽器安全屬性,可以不讓你的程序訪問他們的文件。
上面我們談到了讀數據,那么如何實現寫數據呢?象輸入流一樣,輸出流也有類似的層次結構:
OutputStream
FileOutputStreamPipedOutputStreamByteArrayOutputStreamFilterOutputStream
DataOutputStreamPrintStreamBufferedOutputStream
我們將分析FileOutputStream和DataOutputStream類來完成我們碰到的輸出流問題。其它的輸出流包含了更多的信息和成員函數。象輸入流的源文件一樣,這?copy;文件在$JAVA_HOME/src/java/io目錄下。
FileOutputStream對象用于向一個文本文件寫數據。象輸入文件一樣,你得先打開這個文件后才能寫這個文件。
要打開一個FileOutputStream對象,象打開一個輸入流一樣,你可以將字符?reg;或文件對象作為參數:FileOutputStreammyFileStream;myFileStream=newFileOutputStream("/etc/motd");
象輸入流一樣,你也可這樣使用:FilemyFile;FileOutputStreammyFileStream;myFile=newFile("/etc/motd");myFileStream=newFileOutputStream(myFile);
一?copy;文件被打開,你便可以使用write()函數向文件里寫一?copy;數據。就象輸入流的read()函數一樣,你可有三種方法:lvoidwrite(intb);//writesoutonebytelvoidwrite(byteb[]);//writesoutentirearraylvoidwrite(byteb[],intoffset,intlength);//writeoutlengthbytesofb[],startingatb[offset]
關閉輸出流和關閉輸入流方法一樣,你可以使用顯式方法:myFileStream.close();你也可以讓系統自動關閉它。
下面有一個程序,讓用戶輸入一?copy;姓名和電話號碼。每一個姓名和號碼將加在文件里。用戶通過點“Done"按鈕來告訴系統整個列表已輸入完畢。
一?copy;用戶輸入完整個列表,程序將創建一個輸出文件并顯示或打印出來。例如:
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;}}
如果你處理的數據量很多,或向文件寫很多次小數據,你可以使用一個BufferedOutput流。BufferedOutput流提?copy;和FileOutputStream類同樣的寫操作方法,但所有輸出全部存放在一個緩沖區里。當你填滿緩沖區,它將一次性寫入磁盤。或者你主動將緩沖區寫入磁盤。
如果要創建一個BufferedOutput流,首先需要一個FileOutput流。然后將緩沖區鏈接到FileOutput流:FileOutputStreammyFileStream;BufferedOutputStreammyBufferStream;//getafilehandlemyFileStream=newFileOutputStream("/usr/db/stock.dbf");//chainabufferedoutputstreammyBufferSSstream=newBufferedOutputStream(myFileStream);
和普通FileOutput流一樣,向BufferedOutput流里的每一次寫操作和寫入磁盤操作并不是一一對應的。要想在程序結束?reg;前將緩沖區里的數據寫入磁盤,除非填滿緩沖區,否則只有顯式調用flush()函數://forceleft-overdatatodiskmyBufferStream.flush();//closethedatafileexplicitly//Alwaysclosethe"topmost"filestreammyBufferStream.close();myFileStream.close();
和DataInputStream對應,Java還提?copy;了DataOutput流。使用DataOutput流,我們可以向文件寫入二進制數據。
打開和關閉DataOutput流對象與打開、關閉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()函數各種方法都適用于DataOutput流。你還可以看到DataInput流的類似函數方法:lvoidwriteBoolean(booleanv)lvoidwriteByte(intv)lvoidwriteShort(intv)lvoidwriteChar(intv)lvoidwriteInt(intv)lvoidwriteFloat(floatv)lvoidwriteDouble(doublev)lvoidwriteBytes(strings)lvoidwriteChars(strings)
對字符?reg;來說,有兩種選擇:byte和char。記住byte是8位數據而char是16位數據。如果你想利用Unicode字符的優點,你應使用writeChars()函數。
在使用二進制數據輸出時常用的另外一個函數是size()。這個函數返回寫入文件數據的總字節數。你也可用size()函數將數據文件分成四字節為單位的塊,例如:...intbytesLeft=myDataStream.size()%4;for(intI=0;I<bytesLeft;I++){myDataStrea.write(0);}...
我們讀文件常常不是從頭至尾順序讀的。你也許想將一文本文件當作一個數據庫,讀完一個記錄后,跳到另一個記錄,它們在文件的不同地方。Java提?copy;了RandomAccessFile類讓你操作這種類型的輸入輸出。
打開隨機訪問文件有兩種方法:l用文件名myRAFile=newRandomAccessFile(Stringname,Stringmode);l用文件對象myRAFile=newRandomAccessFile(Filefile,Stringmode);
mode參數決定了訪問文件的權限,如只讀'r'或讀寫'wr'等。
例如,我們打開一個數據庫更新數據:RandomAccessFilemyRAFile;myRAFile=newRandomAccessFile("/usr/db/stock.dbf","rw");
RandomAccessFile對象的讀寫操作和DataInput/DataOutput對象的操作方式一樣。你可以使用在DataInputStream和DataOutputStream里出現的所有read()和write()函數。
還有幾個函數幫助你在文件里移動指針:llonggetFilePointer();返回當前指針lvoidseek(longpos);將文件指針定位到一個絕對地址。地址是相對于文件頭的偏移量。地址0表示文件的開頭。llonglength();返回文件的長度。地址"length()"表示文件的結尾。
你可以使用隨機訪問文件來設置成增加信息模式: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通過系統類達到訪問標準輸入輸出的功能。2.你可以創建、讀、寫文件。
關于Java輸入輸出流的示例分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。