共計 10907 個字符,預計需要花費 28 分鐘才能閱讀完成。
Java 輸入輸出流的示例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1Java 輸入輸出流
所有的程序語言都提?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 成員函數。
2 標準輸入輸出例子
這里有一個例子,功能象 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.}}
3 普通輸入輸出類
除了基本的鍵盤輸入和屏幕輸出外,我們還需要聯系文件的輸入輸出。我們將學習下面幾個類:lFileInputStreamlDataInputStreamlFileOutputStreamlDataOutputStream
作為參考,再列出一?copy; 特定應用的類:lPipedInputStreamlBufferedInputStreamlPushBackInputStreamlStreamTokenizerlPipedOutputStreamlBufferedOutputStreamlRandomAccessFile
我們不在此討論這?copy; 類,但你可以在 JAVA_HOME/src/java/io 目錄里查看每個類的成員函數定義。
4 文件
在我們進行文件操作時,需要知道一?copy; 關于文件的信息。File 類提?copy; 了一?copy; 成員函數來操縱文件和獲得一?copy; 文件的信息。
4.1 創建一個新的文件對象
你可用下面三個方法來創建一個新文件對象:
FilemyFile;myFile=newFile(etc/motd
或
myFile=newFile(/etc , motd //moreusefulifthedirectoryorfilenamearevariables
或
FilemyDir=newfile(/etc myFile=newFile(myDir, motd
這三種方法取決于你訪問文件的方式。例如,如果你在應用程序里只用一個文件,第一種創建文件的結構是最容易的。但如果你在同一目錄里打開數個文件,則第二種或第三種結構更好一?copy;。
4.2 文件測試和使用
一?copy; 你創建了一個文件對象,你便可以使用以下成員函數來獲得文件相關信息:
文件名 lStringgetName()lStringgetPath()lStringgetAbslutePath()lStringgetParent()lbooleanrenameTo(FilenewName)
文件測試 lbooleanexists()lbooleancanWrite()lbooleancanRead()lbooleanisFile()lbooleanisDirectory()lbooleanisAbsolute()
一般文件信息 llonglastModified()llonglength()
目錄用法 lbooleanmkdir()lString[]list()
4.3 文件信息獲取例子程序
這里是一個獨立的顯示文件的基本信息的程序,文件通過命令行參數傳輸:
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.}}}
5 輸入流
InputStreamSequenceInputStreamFileInputStreamPipedInputStreamByteArrayInputStreamFileterInputStreamStringBufferInputStream
DataInputStreamLineNumberInputStreamPushbackInputStreamBufferedInputStream 有好幾個類是專門用來處理文件輸入的。下面是文件輸入類的層次結構:
5.1FileInputStream 對象
FileInputStream 典型地表示一種順序訪問的文本文件。通過使用 FileInputStream 你可以訪問文件的一個字節、幾個字節或整個文件。
5.2 打開 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.
5.3 關閉 FileInputStream
當你完成一個文件的操作,你可選兩種方法關閉它:顯式關閉和隱式關閉,隱式關閉是自動垃圾回收時的功能。
顯式關閉如下:myFileStream.close();
6 例程:顯示一個文件
如果文件的訪問權限足夠,你可以在 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);}
7DataInputStreams
DataInputStreams 與 FileInputStreams 差不多。Data 流可以直接讀任意一種變量類型,如浮點數,整數和字符等。一般來說,對二進制文件使用 DataInputStream 流。
7.1 打開和關閉 DataInputStreams
打開和關閉 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();
7.2 讀 DataInputStreams
當你從 DataInputStreams 流里訪問文件時,你可以使用與 FileInputStream 流相同的成員函數 read()。但你也可以使用其他訪問方法來讀取不同種類的數據:
lbytereadByte()lintreadUnsignedByte()lshortreadShort()lintreadUnsighedShort()lcharreadChar()lintreadIntllongreadLong()lfloatreadFloat()ldoublereadDouble()lStringreadLine()
以上每一個成員函數都讀取相應的數據對象。象 StringreadLine() 成員函數,你可使用 \n,\r,\r\n, 或 EOF 作為字符?reg; 結束符。
讀一個長整型,例如:
longserialNo;…serialNo=myDataStream.readLong();
8URL 輸入流
除了基本文件訪問外,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; 用戶設置了他們的瀏覽器安全屬性,可以不讓你的程序訪問他們的文件。
9OutputStreams
上面我們談到了讀數據,那么如何實現寫數據呢?象輸入流一樣,輸出流也有類似的層次結構:
OutputStream
FileOutputStreamPipedOutputStreamByteArrayOutputStreamFilterOutputStream
DataOutputStreamPrintStreamBufferedOutputStream
我們將分析 FileOutputStream 和 DataOutputStream 類來完成我們碰到的輸出流問題。其它的輸出流包含了更多的信息和成員函數。象輸入流的源文件一樣,這?copy; 文件在 $JAVA_HOME/src/java/io 目錄下。
9.1FileOutputStream 類
FileOutputStream 對象用于向一個文本文件寫數據。象輸入文件一樣,你得先打開這個文件后才能寫這個文件。
9.2 打開一個 FileOutputStream 對象
要打開一個 FileOutputStream 對象,象打開一個輸入流一樣,你可以將字符?reg; 或文件對象作為參數:FileOutputStreammyFileStream;myFileStream=newFileOutputStream(/etc/motd
象輸入流一樣,你也可這樣使用:FilemyFile;FileOutputStreammyFileStream;myFile=newFile(/etc/motd myFileStream=newFileOutputStream(myFile);
9.3 寫入一個流
一?copy; 文件被打開,你便可以使用 write() 函數向文件里寫一?copy; 數據。就象輸入流的 read() 函數一樣,你可有三種方法:lvoidwrite(intb);//writesoutonebytelvoidwrite(byteb[]);//writesoutentirearraylvoidwrite(byteb[],intoffset,intlength);//writeoutlengthbytesofb[],startingatb[offset]9.4 關閉一個 FileOutputStream 對象
關閉輸出流和關閉輸入流方法一樣,你可以使用顯式方法:myFileStream.close(); 你也可以讓系統自動關閉它。
10 例子:存儲信息
下面有一個程序,讓用戶輸入一?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;}}
11BufferedOutput 流
如果你處理的數據量很多,或向文件寫很多次小數據,你可以使用一個 BufferedOutput 流。BufferedOutput 流提?copy; 和 FileOutputStream 類同樣的寫操作方法,但所有輸出全部存放在一個緩沖區里。當你填滿緩沖區,它將一次性寫入磁盤。或者你主動將緩沖區寫入磁盤。
11.1 創建 BufferedOutput 流
如果要創建一個 BufferedOutput 流,首先需要一個 FileOutput 流。然后將緩沖區鏈接到 FileOutput 流:FileOutputStreammyFileStream;BufferedOutputStreammyBufferStream;//getafilehandlemyFileStream=newFileOutputStream(/usr/db/stock.dbf //chainabufferedoutputstreammyBufferSSstream=newBufferedOutputStream(myFileStream);
11.2 更新和關閉 BufferedOutput 流
和普通 FileOutput 流一樣,向 BufferedOutput 流里的每一次寫操作和寫入磁盤操作并不是一一對應的。要想在程序結束?reg; 前將緩沖區里的數據寫入磁盤,除非填滿緩沖區,否則只有顯式調用 flush() 函數://forceleft-overdatatodiskmyBufferStream.flush();//closethedatafileexplicitly//Alwaysclosethe topmost filestreammyBufferStream.close();myFileStream.close();
12DataOutput 流
和 DataInputStream 對應,Java 還提?copy; 了 DataOutput 流。使用 DataOutput 流,我們可以向文件寫入二進制數據。
12.1 打開和關閉 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();
12.2 向 DataOutput 流寫數據
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() 函數。
12.3 輸出記數
在使用二進制數據輸出時常用的另外一個函數是 size()。這個函數返回寫入文件數據的總字節數。你也可用 size() 函數將數據文件分成四字節為單位的塊,例如:…intbytesLeft=myDataStream.size()%4;for(intI=0;I bytesLeft;I++){myDataStrea.write(0);}…
13 隨機訪問文件
我們讀文件常常不是從頭至尾順序讀的。你也許想將一文本文件當作一個數據庫,讀完一個記錄后,跳到另一個記錄,它們在文件的不同地方。Java 提?copy; 了 RandomAccessFile 類讓你操作這種類型的輸入輸出。
13.1 創建隨機訪問文件
打開隨機訪問文件有兩種方法:l 用文件名 myRAFile=newRandomAccessFile(Stringname,Stringmode);l 用文件對象 myRAFile=newRandomAccessFile(Filefile,Stringmode);
mode 參數決定了訪問文件的權限,如只讀 r 或讀寫 wr 等。
例如,我們打開一個數據庫更新數據:RandomAccessFilemyRAFile;myRAFile=newRandomAccessFile(/usr/db/stock.dbf , rw
13.2 訪問信息
RandomAccessFile 對象的讀寫操作和 DataInput/DataOutput 對象的操作方式一樣。你可以使用在 DataInputStream 和 DataOutputStream 里出現的所有 read() 和 write() 函數。
還有幾個函數幫助你在文件里移動指針:llonggetFilePointer(); 返回當前指針 lvoidseek(longpos); 將文件指針定位到一個絕對地址。地址是相對于文件頭的偏移量。地址 0 表示文件的開頭。llonglength(); 返回文件的長度。地址 length() 表示文件的結尾。
13.3 增加信息
你可以使用隨機訪問文件來設置成增加信息模式: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 輸入輸出流的示例分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注丸趣 TV 行業資訊頻道了解更多相關知識。