久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Java輸入輸出流的示例分析

162次閱讀
沒有評論

共計 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 行業資訊頻道了解更多相關知識。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計10907字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 贵德县| 来宾市| 永嘉县| 三门县| 沿河| 赤城县| 深水埗区| 阿图什市| 新宾| 洛隆县| 永德县| 古田县| 嵊泗县| 都兰县| 曲阳县| 凤阳县| 石泉县| 河西区| 驻马店市| 察雅县| 荃湾区| 基隆市| 肇东市| 镇赉县| 和平区| 甘德县| 苍溪县| 云阳县| 南漳县| 民权县| 潍坊市| 通化县| 青铜峡市| 博湖县| 梅州市| 阳高县| 玛多县| 正镶白旗| 泾川县| 利川市| 托里县|