![Java程序設(shè)計(jì)課件(高曉黎)第15章輸入輸出流與文件操作_第1頁(yè)](http://file4.renrendoc.com/view/5f032abb7a8286b4f7911262870257a0/5f032abb7a8286b4f7911262870257a01.gif)
![Java程序設(shè)計(jì)課件(高曉黎)第15章輸入輸出流與文件操作_第2頁(yè)](http://file4.renrendoc.com/view/5f032abb7a8286b4f7911262870257a0/5f032abb7a8286b4f7911262870257a02.gif)
![Java程序設(shè)計(jì)課件(高曉黎)第15章輸入輸出流與文件操作_第3頁(yè)](http://file4.renrendoc.com/view/5f032abb7a8286b4f7911262870257a0/5f032abb7a8286b4f7911262870257a03.gif)
![Java程序設(shè)計(jì)課件(高曉黎)第15章輸入輸出流與文件操作_第4頁(yè)](http://file4.renrendoc.com/view/5f032abb7a8286b4f7911262870257a0/5f032abb7a8286b4f7911262870257a04.gif)
![Java程序設(shè)計(jì)課件(高曉黎)第15章輸入輸出流與文件操作_第5頁(yè)](http://file4.renrendoc.com/view/5f032abb7a8286b4f7911262870257a0/5f032abb7a8286b4f7911262870257a05.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十五章輸入輸出流與文件操作第十五章輸入輸出流與文件操作目錄
重點(diǎn)與難點(diǎn)點(diǎn)撥輸入輸出流的分類(lèi)目錄和文件管理文件和隨機(jī)訪問(wèn)其他常用的流綜合案例字符流字節(jié)流經(jīng)典練習(xí)題目錄重點(diǎn)與難點(diǎn)點(diǎn)撥輸入輸出流的分類(lèi)目錄和文件管理文件和本章知識(shí)重點(diǎn)3132輸入輸出流的分類(lèi)33java.io包中流的體系結(jié)構(gòu)34目錄和文件管理涉及到的類(lèi)輸入輸出流的概念本章知識(shí)重點(diǎn)3132輸入輸出流的分類(lèi)33java.io包中流本章知識(shí)難點(diǎn)33java.io包中的輸入輸出流類(lèi)3132目錄和文件管理涉及到的類(lèi)流輸入及輸出的一般過(guò)程本章知識(shí)難點(diǎn)33java.io包中的輸入輸出流類(lèi)3132目錄輸入輸出流的分類(lèi)Java流的概念
Java使用流(stream)來(lái)執(zhí)行輸入輸出(I/O)的功能,流是一種數(shù)據(jù)的源頭和目的之間的通信途徑標(biāo)準(zhǔn)輸入輸出
Java系統(tǒng)事先定義好兩個(gè)流對(duì)象,分別與系統(tǒng)的標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出相聯(lián)系,它們是System.in和System.outSystem是Java中一個(gè)功能很強(qiáng)大的類(lèi),利用它可以獲得很多Java運(yùn)行時(shí)的系統(tǒng)信息。
3132【例15.1】輸入輸出流的分類(lèi)Java流的概念3132【輸出流(程序?qū)懗鰯?shù)據(jù))
輸入流(程序讀入數(shù)據(jù))
Java中根據(jù)流操作的種類(lèi)可分為:字節(jié)流和字符流根據(jù)流的方向,流可分為兩類(lèi):輸入流和輸出流Java流類(lèi)體系結(jié)構(gòu)1
Java流類(lèi)體系結(jié)構(gòu)2Java流類(lèi)體系結(jié)構(gòu)3
Java流類(lèi)體系結(jié)構(gòu)4
——Java流的概念輸入輸出流的分類(lèi)輸出流(程序?qū)懗鰯?shù)據(jù))輸入流(程序讀入數(shù)據(jù))Java中根目錄和文件管理
32文件名的處理31File類(lèi)文件或目錄的生成文件屬性測(cè)試普通文件信息和工具目錄操作◆publicFile(Stringpath):如果path是實(shí)際存在的路徑,則該File對(duì)象表示的是目錄;如果path是文件名,則該File對(duì)象表示的是文件?!魀ublicFile(Stringpath,Stringname):path是路徑名,name是文件名(不可為空)?!魀ublicFile(Filedir,Stringname):dir是路徑名,name是文件名?!鬝tringgetName():得到一個(gè)文件的名稱(chēng)(不包括路徑)。◆StringgetPath():得到一個(gè)文件的路徑名?!鬝tringgetAbsolutePath():得到一個(gè)文件的絕對(duì)路徑名?!鬝tringgetParent():得到一個(gè)文件的上一級(jí)目錄名?!鬝tringrenameTo(FilenewName):將當(dāng)前文件名更名為給定文件的完整路徑?!纠?5.2】◆booleanexists():測(cè)試當(dāng)前File對(duì)象所指示的文件或目錄是否存在,若存在,返回True。◆boolean
createNewFile():創(chuàng)建當(dāng)前文件。◆booleancanWrite():測(cè)試當(dāng)前文件是否可寫(xiě)。◆booleancanRead():測(cè)試當(dāng)前文件是否可讀?!鬮ooleanisFile():測(cè)試當(dāng)前文件是否是文件(不是目錄)。◆booleanisDirectory():測(cè)試當(dāng)前文件是否是目錄,若為目錄則返回True?!纠?5.3】◆longlastModified():得到文件最近一次修改的時(shí)間。◆longlength():得到文件的長(zhǎng)度,以字節(jié)為單位,若不存在,返回0?!鬮ooleandelete():刪除File對(duì)象代表的文件或目錄,目錄需為空。刪除成功,返回True。◆booleanmkdir():生成一個(gè)由該對(duì)象指定的路徑(新目錄),若成功,返回True?!鬮ooleanmkdirs():生成一個(gè)新的目錄,包含子目錄。若成功,返回true?!鬮ooleanrenameTo(FilenewName):將當(dāng)前File對(duì)象所代表的路徑名改為newName所代表的路徑名。若成功,返回true?!鬝tringlist():列出當(dāng)前目錄下的文件?!鬎ile[]listFiles():得到該對(duì)象所代表的目錄下的File對(duì)象數(shù)組。◆StringtoString():得到抽象路徑表示法?!纠?5.4】File類(lèi)的應(yīng)用【例15.5】【例15.6】目錄和文件管理32文件名的處理31File類(lèi)文件或目錄字節(jié)流
緩沖區(qū)流BufferedInputStream和BufferedOutputStream33順序讀/寫(xiě)文件(FileInputStream與FileOutputStream)31ByteArrayInputStream和ByteArrayOutputStream32字節(jié)流緩沖區(qū)流BufferedInputStream和Bu順序讀/寫(xiě)文件(FileInputStream與FileOutputStream)⑴FileInputStream類(lèi)從磁盤(pán)文件讀取數(shù)據(jù)。常用的構(gòu)造方法有:◆FileInputStream(Stringname):打開(kāi)文件name用來(lái)讀取數(shù)據(jù)。如:FileInputStreamf=newFileInputStream("c:/test.txt");◆FileInputStream(Filefile):打開(kāi)文件file用來(lái)讀取數(shù)據(jù)。如:Filef=newFile("c:/test.txt");FileInputStreamf1=newFileinputStream(f);◆將FileDescriptor對(duì)象作為其參數(shù)。如:FileDescriptor()fd=newFileDescriptor();FileinputStreamf2=newFileInputstream(fd);⑵FileOutputStream類(lèi)創(chuàng)建文件(如果文件不存在),并將數(shù)據(jù)寫(xiě)入文件。FileOutputStream類(lèi)常用的構(gòu)造方法有:◆FileOutputStream(Stringname):打開(kāi)文件name用來(lái)寫(xiě)入數(shù)據(jù)。如:FileOutputStreamf=newFileOutputStream("c:/test.txt");◆FileOutputStream(Filefile):打開(kāi)文件file用來(lái)寫(xiě)入數(shù)據(jù)。如:Filef=newFile("c:/test.txt");FileOutputStreamf1=newFileOutputStream(f);◆FileOutputStream(Stringname,Booleanappend):打開(kāi)文件name用來(lái)寫(xiě)入數(shù)據(jù),若append為true,則寫(xiě)入的數(shù)據(jù)會(huì)加到原有文件后面,否則,覆蓋原有的文件。如:FileOutputStreamf=newFileOutputStream("c:/test.txt",true);◆將FileDescriptor對(duì)象作為其參數(shù)。FileDescriptor()fd=newFileDescriptor();FileOutputStreamf=newFileOutputStream(fd);【例15.7】字節(jié)流
順序讀/寫(xiě)文件(FileInputStream與FileOuByteArrayInputStream和ByteArrayOutputStream字節(jié)流
⑴ByteArrayInputStream將字節(jié)數(shù)組用作源,并在該數(shù)組中執(zhí)行讀操作它有兩種構(gòu)造方法。第一種構(gòu)造方法將字節(jié)數(shù)組作為參數(shù)?!鬊yteArrayInputStream(byte[]buffer):生成一個(gè)字節(jié)數(shù)組的輸入流,并指定一個(gè)字節(jié)數(shù)組buffer為此輸入流的流緩沖區(qū)。如:ByteArrayInputStreamb=newByteArrayInputStream(buf[]);另外一種構(gòu)造方法有助于從指定的字節(jié)數(shù)組來(lái)創(chuàng)建ByteArrayInputStream?!鬊yteArrayinputStreamb=newByteArrayinputStream(buf[],off,len);其中off是要讀取的第一個(gè)字節(jié)的偏移,len是要讀取數(shù)組的字節(jié)數(shù);⑵ByteArrayOutputStream有2種構(gòu)造方法◆ByteArrayOutputStream():生成一個(gè)字節(jié)數(shù)組的輸出流,其緩沖區(qū)的默認(rèn)初始大小為32字節(jié),若有需要,緩沖區(qū)的大小會(huì)隨之增加。如:ByteArrayOutPutStreamb=newByteArrayOutputStream();◆ByteArrayOutputStream(intsize):創(chuàng)建32個(gè)自己的緩沖器用于儲(chǔ)存數(shù)據(jù),但分配size字節(jié)的初始大小給此緩沖區(qū)。如:ByteArrayOutputStreamb1=newByteArrayOutputStream(size);創(chuàng)建大小為size的緩沖器⑶ByteArrayOutputStream的一些常用方法:◆intsize():返回此流緩沖區(qū)的大小?!鬮yte[]toByteArray():生成一個(gè)新的字節(jié)數(shù)組,并將流的內(nèi)容復(fù)制到此字節(jié)數(shù)組?!鬝tringtoString():將流的內(nèi)容轉(zhuǎn)換為String對(duì)象?!纠?5.8】ByteArrayInputStream和ByteArray字節(jié)流
緩沖區(qū)流BufferedInputStream和BufferedOutputStream⑴BufferedInputStream類(lèi)的構(gòu)造方法和方法:◆BufferedInputStream(InputStreamin):構(gòu)造一個(gè)BufferedInputStream。◆BufferedInputStream(InputStreamin,intsize):構(gòu)造一個(gè)具有給定的緩沖區(qū)大小的BufferedInputStream?!鬷ntavailable():得到可以從這個(gè)輸入流讀取的字節(jié)數(shù)?!魐oidclose():關(guān)閉流?!魐oidmark(intreadlimit):在這個(gè)輸入流的當(dāng)前位置做標(biāo)記?!鬮ooleanmarkSupported():檢查這個(gè)輸入流是否支持mark和reset方法。◆intread():讀取數(shù)據(jù)的下一個(gè)字節(jié)?!鬷ntread(byte[]b,intoff,intlen):從這個(gè)字節(jié)輸入流的給定偏移量處開(kāi)始讀取字節(jié),存儲(chǔ)到給定的字節(jié)數(shù)組?!魐oidreset():將緩沖區(qū)重新設(shè)置到加標(biāo)記的位置?!鬺ongskip(longn):跳過(guò)n個(gè)字節(jié)的數(shù)據(jù)。⑵BufferedOutputStream類(lèi)的構(gòu)造方法和方法:◆BufferedOutputStream(OutputStreamout):構(gòu)造一個(gè)BufferedOutputStream?!鬊ufferedOutputStream(OutputStreamout,intsize):構(gòu)造一個(gè)具有給定的緩沖區(qū)大小的BufferedOutputStream?!魐oidflush():刷新這個(gè)流?!魐oidwrite(byte[]b,intoff,intlen):將給定的字節(jié)數(shù)組寫(xiě)到這個(gè)緩沖輸出流?!魐oidwrite(intb):將給定的字節(jié)寫(xiě)到這個(gè)緩沖輸出流。【例15.9】字節(jié)流緩沖區(qū)流BufferedInputStream和Bu字符流
31Reader和Writer32InputStreamReader和OutputStreamWriter33FileReader34FileWriter35BufferedReader和BufferedWriter36CharArrayReader和CharArrayWriter字符流31Reader和Writer32InputStr字符流InputStreamReader和OutputStreamWriter⑴InputStreamReader類(lèi)的構(gòu)造方法和方法:◆InputStreamReader(InputStreamin):構(gòu)造一個(gè)InputStreamReader?!鬒nputStreamReader(InputStreamin,Stringenc):使用命名的字符編碼構(gòu)造一個(gè)InputStreamReader?!魐oidclose():關(guān)閉流?!鬝tringgetEncoding():得到字符編碼的名稱(chēng)?!鬷ntread():讀取一個(gè)字符?!鬷ntread(char[]cbuf,intoff,intlen):將字符讀到數(shù)組中?!鬮ooleanready():如果這個(gè)流已準(zhǔn)備好,返回True。⑵OutputStreamWriter類(lèi)的構(gòu)造方法和方法:◆OutputStreamWriter(OutputStreamout):構(gòu)造一個(gè)OutputStreamWriter?!鬙utputStreamWriter(OutputStreamout,Stringenc):使用命名的字符編碼構(gòu)造一個(gè)OutputStreamWriter?!魐oidclose():關(guān)閉流。◆voidflush():刷新流?!鬝tringgetEncoding():得到這個(gè)流使用的字符編碼的名稱(chēng)?!魐oidwrite(char[]cbuf,intoff,intlen):寫(xiě)字符數(shù)組的一部分?!魐oidwrite(intc):寫(xiě)一個(gè)字符?!魐oidwrite(Stringstr,intoff,intlen):寫(xiě)一個(gè)字符串的一部分。【例15.10】字符流InputStreamReader和OutputStr字符流FileReader◆FileReader(Filefile):構(gòu)造一個(gè)FileReader?!鬎ileReader(FileDescriptorfd):從一個(gè)文件描述符構(gòu)造一個(gè)FileReader?!鬎ileReader(Stringfilename):從一個(gè)文件名構(gòu)造一個(gè)FileReader?!纠?5.11】字符流FileReader◆FileReader(File字符流FileWriter◆FileWriter(Filefile):從File對(duì)象構(gòu)造一個(gè)FileWriter?!鬎ileWriter(FileDescriptorfd):從文件描述符構(gòu)造一個(gè)FileWriter?!鬎ileWriter(Stringfilename):從文件名構(gòu)造一個(gè)FileWriter?!鬎ileWriter(Stringfilename,booleanappend):構(gòu)造一進(jìn)行附加的FileWriter?!纠?5.12】字符流FileWriter◆FileWriter(File字符流BufferedReader和BufferedWriter這兩個(gè)類(lèi)對(duì)應(yīng)的流使用了緩沖,能大大提高輸入輸出的效率。這兩個(gè)也是過(guò)濾器流,常用來(lái)對(duì)InputStreamReader和OutputStreamWriter進(jìn)行處理?!纠?5.13】字符流BufferedReader和BufferedWrit字符流CharArrayReader和CharArrayWriter⑴CharArrayReader類(lèi)的構(gòu)造方法和方法如下:◆CharArrayReader(char[]buf):從給定的字符數(shù)組構(gòu)造一個(gè)CharArrayReader?!鬋harArrayReader(char[]buf,intoffset,intlength):同上。◆voidclose():關(guān)閉流。◆voidmark(intreadAheadLimit):在流中的當(dāng)前位置加標(biāo)記。◆booleanmarkSupported():如果這個(gè)流支持mark操作,那么返回True?!鬷ntread():讀取一個(gè)字符?!鬷ntread(char[]b,intoff,intlen):將字符讀入數(shù)組的一部分?!鬮ooleanready():檢查這個(gè)流是否已經(jīng)準(zhǔn)備好被讀取?!魐oidreset():將流重設(shè)到最近的標(biāo)記?!鬺ongskip(longn):跳過(guò)n個(gè)字符。⑵CharArrayWriter類(lèi)的構(gòu)造方法和方法如下:◆CharArrayWriter():構(gòu)造一個(gè)CharArrayWriter?!鬋harArrayWriter(intinitialSize):構(gòu)造一個(gè)具有給定初始大小的CharArrayWriter。◆voidclose():關(guān)閉流?!魐oidflush():刷新流。◆voidreset():重設(shè)流。◆intsize():得到緩沖區(qū)的當(dāng)前大小。◆char[]toCharArray():得到輸入數(shù)據(jù)的副本。◆StringtoString():將輸入數(shù)據(jù)轉(zhuǎn)換為字符串。◆voidwrite(char[]c,intoff,intlen):將字符寫(xiě)到緩沖區(qū)中?!魐oidwrite(intc):將一個(gè)字符寫(xiě)到緩沖區(qū)中?!魐oidwrite(Stringstr,intoff,intlen):將字符串的一部分寫(xiě)到緩沖區(qū)中?!魐oidwriteTo(Writerout):將緩沖區(qū)的內(nèi)容寫(xiě)到另一個(gè)字符流中。【例15.14】字符流CharArrayReader和CharArrayWr文件的隨機(jī)訪問(wèn)
31在java中,類(lèi)RandomAccessFile提供了隨機(jī)訪問(wèn)文件的方法◆RandomAccessFile(Filefile,Stringmode):構(gòu)造一個(gè)隨機(jī)訪問(wèn)文件流,file為被訪問(wèn)的文件對(duì)象,mode是用來(lái)指定存取的模式,mode可以為r(讀)、w(寫(xiě))或rw(讀寫(xiě))。◆RandomAccessFile(Stringname,Stringmode):構(gòu)造一個(gè)隨機(jī)訪問(wèn)文件流,以便訪問(wèn)由字符串name指定名字的文件,mode參數(shù)使用同上32RandomAccessFile類(lèi)提供的用來(lái)讀取某種基本數(shù)據(jù)類(lèi)型的數(shù)據(jù)或字符串的方法◆booleanreadBoolean()◆bytereadByte()◆charreadChar()◆doublereadDouble()◆floatreadFloat()◆intreadInt()◆longreadLong()◆shortreadShort()◆StringreadLine()33RandomAccessFile類(lèi)提供的用來(lái)向文件中寫(xiě)入某種基本類(lèi)型的數(shù)據(jù)或字符串的方法◆voidwriteByte(byteb)◆voidwriteBytes(Strings)◆voidwriteChar(charc)◆voidwriteChars(Strings)◆voidwriteDouble(doubled)◆voidwriteFloat(floatf)◆voidwriteInt(inti)◆voidwriteLong(longl)◆voidwriteShort(shorts)34和目前文件位置有關(guān)的方法◆voidseek(longpos):將文件指針移到pos(不可為負(fù))的位置,相對(duì)于文件初始位置值(初始值為0)。◆longgetFilePointer():得到目前文件指針的位置(相對(duì)于文件初始位置)。◆longlength():得到文件的長(zhǎng)度?!鬷ntskipBytes(intn):使文件指針向前移動(dòng)指定的n個(gè)字節(jié)【例15.15】文件的隨機(jī)訪問(wèn)31在java中,類(lèi)RandomAccess其他常用的流
33343132管道流ZIP文件流DataInputStream和DataOutputStream
對(duì)象流其他常用的流33343132管道流ZIP文件流DataI綜合案例
【例15.16】下面的代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的文件編輯器importjava.awt.*;importjava.awt.event.*;importjava.io.*;publicclassFileEditextendsWindowAdapterimplementsActionListener,TextListener{Framef;TextAreata1;Panelp1;TextFieldtf1;Buttonb1,b2,b3;FileDialogfd;Filefile1=null;publicstaticvoidmain(Stringargs[]){(newFileEdit()).display();}綜合案例【例15.16】下面的代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的文件編輯綜合案例(續(xù))publicvoiddisplay(){f=newFrame("FileEdit");f.setSize(680,400);f.setLocation(200,140);f.setBackground(Color.lightGray);f.addWindowListener(this);tf1=newTextField();tf1.setEnabled(false);tf1.setFont(newFont("Dialog",0,20));//設(shè)置文本行的初始字體
f.add(tf1,"North");ta1=newTextArea();ta1.setFont(newFont("Dialog",0,20));//設(shè)置文本區(qū)的初始字體
f.add(ta1);ta1.addTextListener(this);//注冊(cè)文本區(qū)的事件監(jiān)聽(tīng)程序
p1=newPanel();p1.setLayout(newFlowLayout(FlowLayout.LEFT));
綜合案例(續(xù))publicvoiddisplay(){綜合案例(續(xù))b1=newButton("Open");b2=newButton("Save");b3=newButton("SaveAs");p1.add(b1);p1.add(b2);p1.add(b3);b2.setEnabled(false);b3.setEnabled(false);b1.addActionListener(this);//注冊(cè)按鈕的事件監(jiān)聽(tīng)程序
b2.addActionListener(this);b3.addActionListener(this);f.add(p1,"South");f.setVisible(true);}publicvoidtextValueChanged(TextEvente){//實(shí)現(xiàn)TextListener接口中的方法,對(duì)文本區(qū)操作時(shí)觸發(fā)
b2.setEnabled(true);b3.setEnabled(true);}綜合案例(續(xù))b1=newButton("Open"綜合案例(續(xù))publicvoidactionPerformed(ActionEvente){if(e.getSource()==b1){//單擊[打開(kāi)]按鈕時(shí)
fd=newFileDialog(f,"Open",FileDialog.LOAD);fd.setVisible(true);//創(chuàng)建并顯示打開(kāi)文件對(duì)話框if((fd.getDirectory()!=null)&&(fd.getFile()!=null)){tf1.setText(fd.getDirectory()+fd.getFile());try//以緩沖區(qū)方式讀取文件內(nèi)容{file1=newFile(fd.getDirectory(),fd.getFile());FileReaderfr=newFileReader(file1);BufferedReaderbr=newBufferedReader(fr);Stringaline;while((aline=br.readLine())!=null)//按行讀取文本
ta1.append(aline+"\r\n");fr.close();br.close();}catch(IOExceptionioe){System.out.println(ioe);}}}綜合案例(續(xù))publicvoidactionPerfo綜合案例(續(xù))if((e.getSource()==b2)||(e.getSource()==b3)){//單擊[保存]按鈕時(shí)
if((e.getSource()==b3)||(e.getSource()==b2)&&(file1==null)){//單擊[SaveAs]按鈕時(shí),或單擊[Save]按鈕且文件對(duì)象為空時(shí)
fd=newFileDialog(f,"Save",FileDialog.SAVE);if(file1==null)fd.setFile("Edit1.txt");elsefd.setFile(file1.getName());fd.setVisible(true);//創(chuàng)建并顯示保存文件對(duì)話框
if((fd.getDirectory()!=null)&&(fd.getFile()!=null)){tf1.setText(fd.getDirectory()+fd.getFile());file1=newFile(fd.getDirectory(),fd.getFile());save(file1);}}綜合案例(續(xù))if((e.getSource()==b2綜合案例(續(xù))elsesave(file1);}}publicvoidsave(Filefile1){try{//將文本區(qū)內(nèi)容寫(xiě)入字符輸出流
FileWriterfw=newFileWriter(file1);fw.write(ta1.getText());fw.close();b2.setEnabled(false);b3.setEnabled(false);}catch(IOExceptionioe){System.out.println(ioe);}}publicvoidwindowClosing(WindowEvente){System.exit(0);}}綜合案例(續(xù))else綜合案例(續(xù))程序運(yùn)行結(jié)果綜合案例(續(xù))程序運(yùn)行結(jié)果簡(jiǎn)答練習(xí)題353633343132利用輸入輸出流編寫(xiě)程序,實(shí)現(xiàn)文件拷貝的功能。編寫(xiě)程序,實(shí)現(xiàn)在屏幕上顯示文本文件的功能。有哪些常用的字節(jié)流和字符流,他們的主要區(qū)別是什么?對(duì)字節(jié)流和字符流進(jìn)行讀寫(xiě)操作的一般步驟是什么?File類(lèi)有哪些構(gòu)造方法和常用方法?編寫(xiě)程序,從鍵盤(pán)輸入一串字符,從屏幕輸出并將其存入a.txt文件中。簡(jiǎn)答練習(xí)題353633343132利用輸入輸出流編寫(xiě)程序,實(shí)【例15.1】標(biāo)準(zhǔn)輸入輸出舉例——標(biāo)準(zhǔn)輸入輸出輸入輸出流的分類(lèi)importjava.io.*;publicclassIODemo{publicstaticvoidmain(Stringargs[])throwsIOException{intb;intcount=0;while((b=System.in.read())!=-1){count++;System.out.print((char)b);}System.out.println();System.out.println("programend");}}程序運(yùn)行如下:輸入:a,b,c,d輸出:a,b,c,d輸入:^Z輸出:programend【例15.1】標(biāo)準(zhǔn)輸入輸出舉例——標(biāo)準(zhǔn)輸入輸出輸入輸出流【例15.2】對(duì)Test.txt及其上一級(jí)目錄的File類(lèi)對(duì)象進(jìn)行操作
目錄和文件管理
——File類(lèi)importjava.io.*;publicclassfileTest//創(chuàng)建一個(gè)文件
{publicstaticvoidmain(Stringargs[]){Filef=newFile("parent\\fileTest.txt");Filef1=newFile("newfileTest.txt");try{System.out.println(f.getParent());System.out.println(f.getName());System.out.println(f1.getPath());System.out.println(f1.getAbsolutePath());}catch(Exceptione){e.printStackTrace();}}}程序運(yùn)行結(jié)果【例15.2】對(duì)Test.txt及其上一級(jí)目錄的File類(lèi)對(duì)【例15.3】建立
test.txt
文件對(duì)象,判斷是否存在,如果不存在就創(chuàng)建之importjava.io.*;publicclassCreateNewFile{publicstaticvoidmain(Stringargs[]){Filef=newFile("test.txt");try{if(!f.exists())f.createNewFile();elseSystem.out.println("exists");}catch(Exceptione){e.printStackTrace();}}}程序運(yùn)行結(jié)果目錄和文件管理
——File類(lèi)【例15.3】建立
test.txt
文件對(duì)象,判斷是否存在【例15.4】創(chuàng)建文件夾Dir以及文件夾dir/cdir。目錄和文件管理
——File類(lèi)importjava.io.*;publicclassCreateDir{publicstaticvoidmain(Stringargs[]){Filef=newFile("test.txt");Filef1=newFile("Dir");Filef2=newFile("dir/cdir");Filef3=newFile("newTest.txt");try{f.renameTo(f3);//把test.txt改名為newTest.txtf1.mkdir();//創(chuàng)建目錄Dirf2.mkdirs();//創(chuàng)建目錄dir及其子目錄cdir}catch(Exceptione){e.printStackTrace();}}}程序運(yùn)行結(jié)果【例15.4】創(chuàng)建文件夾Dir以及文件夾dir/cdir。目【例15.5】使用File類(lèi)的方法獲取文件file.txt的屬性信息目錄和文件管理
——File類(lèi)的應(yīng)用importjava.io.*;publicclassfile{publicstaticvoidmain(String[]args){Filefl=newFile("file.txt");System.out.println("Thefileisexist?"+fl.exists());System.out.println("Thefilecanwrite?"+fl.canWrite());System.out.println("Thefilecanread?"+fl.canRead());System.out.println("Thefileisafile?"+fl.isFile());System.out.println("Thefileisadirectory?"+fl.isDirectory());System.out.println("Thefile'snameis:"+fl.getName());System.out.println("Thefile'sallpathis:"+fl.getAbsolutePath());System.out.println("Thefile'slengthis"+fl.length());} }程序運(yùn)行結(jié)果【例15.5】使用File類(lèi)的方法獲取文件file.txt的【例15.6】列出Dir目錄下的所有文件和目錄(Stringlist()),最后修改時(shí)間;若為目錄則在其后面標(biāo)出<DIR>,若為文件,則在其后面標(biāo)出文件長(zhǎng)度(提示:方法long
lastModified()能夠返回自1970.1.1起
到最后修改時(shí)間之間的秒數(shù))importjava.io.*;importjava.util.*;publicclasstestDir{publicstaticvoidmain(Stringargs[]){Filef=newFile("Dir");String[]listAll=null;Filetemp=null;try{listAll=f.list();for(inti=0;i<listAll.length;i++){temp=newFile(listAll[i]);System.out.print(listAll[i]+"\t");if(temp.isDirectory())System.out.print("\t<DIR>\t");elseSystem.out.print(temp.length()+"\t");System.out.println(newDate(temp.lastModified()));}}catch(Exceptione){e.printStackTrace();}}}目錄和文件管理
——File類(lèi)的應(yīng)用程序運(yùn)行結(jié)果【例15.6】列出Dir目錄下的所有文件和目錄(String字節(jié)流【例15.7】將FileIO.java復(fù)制為FileExam.java.bakimportjava.io.*;publicclassFileIO{publicstaticvoidmain(Stringargs[]){FileInputStreaminFile=null;FileOutputStreamoutFile=null;try{inFile=newFileInputStream("FileIO.java");outFile=newFileOutputStream("FileExam.java.bak");
intdate;while((date=inFile.read())!=-1){outFile.write(date);}
}catch(FileNotFoundExceptione){System.out.println(e.getMessage());}catch(IOExceptione){System.out.println(e.getMessage());}finally{if(inFile!=null){try{inFile.close();}catch(IOExceptione){}}if(outFile!=null){try{outFile.close();}catch(IOExceptione){}}
}}}程序運(yùn)行結(jié)果【解題分析】以下問(wèn)題的求解過(guò)程可分解如下:①先打開(kāi)文件FileExam.java②用read()將其內(nèi)容逐字節(jié)讀取出來(lái)(如果返回值為-1,則表明已到達(dá)文件尾端)③再用write()將讀出的字節(jié)逐一寫(xiě)入另一個(gè)文件FileExam.java.bak中④若文件無(wú)法打開(kāi)(例如FileExam.java不存在)或無(wú)法生成(FileExam.java.bak),則拋出FileNotFoundException異常,若讀寫(xiě)出錯(cuò),則拋出IOException異常。⑤最后,在finally中關(guān)閉文件。字節(jié)流【例15.7】將FileIO.java復(fù)制為FileE【例15.8】程序讀入文件ByteIO.java,將其內(nèi)容寫(xiě)入內(nèi)存中(一個(gè)字節(jié)數(shù)組),接著轉(zhuǎn)換為String對(duì)象,并將該String對(duì)象內(nèi)的令牌解析出來(lái)字節(jié)流importjava.io.*;importjava.util.*;publicclassByteIO{publicstaticvoidmain(Stringargs[]){try{FileinFile=newFile("FileIO.java");FileInputStreaminData=newFileInputStream(inFile);ByteArrayOutputStreamdataArray=newByteArrayOutputStream();intdata;while((data=inData.read())!=-1){dataArray.write(data);}inData.close();StringdataStr=dataArray.toString();StringTokenizertokens=newStringTokenizer(dataStr);while(tokens.hasMoreTokens()){System.out.println(tokens.nextToken());}}catch(IOExceptione){System.out.println(e.getMessage());}}}程序運(yùn)行結(jié)果【例15.8】程序讀入文件ByteIO.java,將其內(nèi)容寫(xiě)【例15.9】文件拷貝的緩沖改進(jìn)
字節(jié)流//文件拷貝的緩沖改進(jìn)importjava.io.*;publicclassCopy{publicstaticvoidmain(Stringargs[]){BufferedInputStreambis=null;BufferedOutputStreambos=null;bytebuf[]=newbyte[100];try{bis=newBufferedInputStream(newFileInputStream("test.txt"));bos=newBufferedOutputStream(newFileOutputStream("testcopy.txt"));intlen=0;while(true){len=bis.read(buf);if(len<=0)break;bos.write(buf,0,len);}bos.flush();//緩沖區(qū)只有滿時(shí)才會(huì)將數(shù)據(jù)輸出到輸出流,用flush()將未滿的緩沖區(qū)中數(shù)據(jù)強(qiáng)制輸出
}catch(Exceptione){e.printStackTrace();}finally{if(bis!=null)try{bis.close();}catch(Exceptione){e.printStackTrace();}if(bos!=null)try{bos.close();}catch(Exceptione){e.printStackTrace();}}}}程序運(yùn)行結(jié)果【例15.9】文件拷貝的緩沖改進(jìn)字節(jié)流//文件拷貝的緩沖改【例15.10】利用InputStreamReader從鍵盤(pán)接受輸入,再將輸入的字符顯示出來(lái)字符流
importjava.io.*;classinputstreamreader{publicstaticvoidmain(Stringargs[]){try{intcharacter;InputStreamReaderinstreamread=newInputStreamReader(System.in);//InputStreamReader以字符形式讀取輸入
while((character=instreamread.read())!=-1){System.out.print((char)character);}}catch(IOExceptione){}}System.out.print(“Bye”);}程序運(yùn)行結(jié)果如下:輸入:a,b,c,d輸出:a,b,c,d輸入:1,2,3,4輸出:1,2,3,4輸入:^Z輸出:Bye【例15.10】利用InputStreamReader從鍵盤(pán)【例15.11】下例中打開(kāi)一個(gè)文件file.txt(內(nèi)容為:Hellofromfile),將文件的內(nèi)容讀到緩沖區(qū),然后顯示數(shù)據(jù)字符流
importjava.io.*;publicclassfileread{publicstaticvoidmain(Stringargs[])throwsException{ FileReaderfileread=newFileReader("file.txt");//打開(kāi)文件
chardata[]=newchar[1024]; intcharsread=fileread.read(data);//讀入
System.out.println(newString(data,0,charsread));//顯示
fileread.close();//關(guān)閉文件流}}程序運(yùn)行結(jié)果【例15.11】下例中打開(kāi)一個(gè)文件file.txt(內(nèi)容為:字符流【例15.12】下例中,分別采用三種方式:逐字符地寫(xiě)數(shù)據(jù)、一次寫(xiě)入所有數(shù)據(jù)、分批寫(xiě)數(shù)據(jù),使用類(lèi)FileWriterimportjava.io.*;publicclassfilewrite{publicstaticvoidmain(Stringargs[])throwsException{chardata[]={'T','h','i','s','','i','s','','a','','s','t','r','i','n','g','','o','f','','t','e','x','t','.'};FileWriterfilewriter1=newFileWriter("file1.txt");for(intloop_index=0;loop_index<data.length;loop_index++){filewriter1.write(data[loop_index]);}FileWriterfilewriter2=newFileWriter("file2.txt");filewriter2.write(data);FileWriterfilewriter3=newFileWriter("file3.txt");filewriter3.write(data,5,10);filewriter1.close();filewriter2.close();filewriter3.close();}}程序執(zhí)行后:file1.txt和file2.txt的內(nèi)容為:Thisisastringoftext。file3.txt的內(nèi)容為:isastrin。字符流【例15.12】下例中,分別采用三種方式:逐字符地寫(xiě)數(shù)字符流【例15.13】從鍵盤(pán)接受輸入并回顯importjava.io.*;publicclassEchotest{publicstaticvoidmain(String[]args){BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));Strings;System.out.print("pleaseenterastring:");try{while((s=in.readLine()).length()!=0)System.out.println("輸入是:"+s);}catch(IOExceptione){e.printStackTrace();}}}程序運(yùn)行結(jié)果字符流【例15.13】從鍵盤(pán)接受輸入并回顯importj字符流【例15.14】下例演示CharArrayReader類(lèi)的作用,該例從字符數(shù)組中逐個(gè)讀取字符并顯示chararrayreader.javaimportjava.io.*;publicclasschararrayreader{publicstaticvoidmain(Stringargs[])throwsIOException{chardata[]={'T','h','i','s','','i','s','','a','','s','t','r','i','n','g','','o','f','','t','e','x','t','.'};CharArrayReaderchararrayreader=newCharArrayReader(data);intcharacter;while((character=chararrayreader.read())!=-1){System.out.print((char)character);}}}程序運(yùn)行結(jié)果為:Thisisastringoftext.字符流【例15.14】下例演示CharArrayReader文件的隨機(jī)訪問(wèn)【例15.15】把若干個(gè)32位整數(shù)寫(xiě)到一個(gè)名為test.txt的文件中,利用seek()方法,以相反的順序讀取這些數(shù)據(jù)importjava.io.*;publicclassRandomFile{publicstaticvoidmain(Stringargs[]){RandomAccessFileraf=null;intdata[]={12,31,56,23,27,1,43,65,4,99};try{raf=newRandomAccessFile("test.txt","rw");for(inti=0;i<data.length;i++)raf.writeInt(data[i]);for(inti=data.length-1;i>=0;i--){raf.seek(i*4);System.out.println(raf.readInt());}catch(Exceptione){e.getMessage();}finally{if(raf!=null)try{raf.close();}catch(Exceptione){e.getMessage();}}}}程序運(yùn)行結(jié)果文件的隨機(jī)訪問(wèn)【例15.15】把若干個(gè)32位整數(shù)寫(xiě)到一個(gè)名為再見(jiàn)謝謝你的配合!再見(jiàn)謝謝你的配合!第十五章輸入輸出流與文件操作第十五章輸入輸出流與文件操作目錄
重點(diǎn)與難點(diǎn)點(diǎn)撥輸入輸出流的分類(lèi)目錄和文件管理文件和隨機(jī)訪問(wèn)其他常用的流綜合案例字符流字節(jié)流經(jīng)典練習(xí)題目錄重點(diǎn)與難點(diǎn)點(diǎn)撥輸入輸出流的分類(lèi)目錄和文件管理文件和本章知識(shí)重點(diǎn)3132輸入輸出流的分類(lèi)33java.io包中流的體系結(jié)構(gòu)34目錄和文件管理涉及到的類(lèi)輸入輸出流的概念本章知識(shí)重點(diǎn)3132輸入輸出流的分類(lèi)33java.io包中流本章知識(shí)難點(diǎn)33java.io包中的輸入輸出流類(lèi)3132目錄和文件管理涉及到的類(lèi)流輸入及輸出的一般過(guò)程本章知識(shí)難點(diǎn)33java.io包中的輸入輸出流類(lèi)3132目錄輸入輸出流的分類(lèi)Java流的概念
Java使用流(stream)來(lái)執(zhí)行輸入輸出(I/O)的功能,流是一種數(shù)據(jù)的源頭和目的之間的通信途徑標(biāo)準(zhǔn)輸入輸出
Java系統(tǒng)事先定義好兩個(gè)流對(duì)象,分別與系統(tǒng)的標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出相聯(lián)系,它們是System.in和System.outSystem是Java中一個(gè)功能很強(qiáng)大的類(lèi),利用它可以獲得很多Java運(yùn)行時(shí)的系統(tǒng)信息。
3132【例15.1】輸入輸出流的分類(lèi)Java流的概念3132【輸出流(程序?qū)懗鰯?shù)據(jù))
輸入流(程序讀入數(shù)據(jù))
Java中根據(jù)流操作的種類(lèi)可分為:字節(jié)流和字符流根據(jù)流的方向,流可分為兩類(lèi):輸入流和輸出流Java流類(lèi)體系結(jié)構(gòu)1
Java流類(lèi)體系結(jié)構(gòu)2Java流類(lèi)體系結(jié)構(gòu)3
Java流類(lèi)體系結(jié)構(gòu)4
——Java流的概念輸入輸出流的分類(lèi)輸出流(程序?qū)懗鰯?shù)據(jù))輸入流(程序讀入數(shù)據(jù))Java中根目錄和文件管理
32文件名的處理31File類(lèi)文件或目錄的生成文件屬性測(cè)試普通文件信息和工具目錄操作◆publicFile(Stringpath):如果path是實(shí)際存在的路徑,則該File對(duì)象表示的是目錄;如果path是文件名,則該File對(duì)象表示的是文件?!魀ublicFile(Stringpath,Stringname):path是路徑名,name是文件名(不可為空)?!魀ublicFile(Filedir,Stringname):dir是路徑名,name是文件名?!鬝tringgetName():得到一個(gè)文件的名稱(chēng)(不包括路徑)?!鬝tringgetPath():得到一個(gè)文件的路徑名。◆StringgetAbsolutePath():得到一個(gè)文件的絕對(duì)路徑名?!鬝tringgetParent():得到一個(gè)文件的上一級(jí)目錄名?!鬝tringrenameTo(FilenewName):將當(dāng)前文件名更名為給定文件的完整路徑?!纠?5.2】◆booleanexists():測(cè)試當(dāng)前File對(duì)象所指示的文件或目錄是否存在,若存在,返回True?!鬮oolean
createNewFile():創(chuàng)建當(dāng)前文件?!鬮ooleancanWrite():測(cè)試當(dāng)前文件是否可寫(xiě)?!鬮ooleancanRead():測(cè)試當(dāng)前文件是否可讀?!鬮ooleanisFile():測(cè)試當(dāng)前文件是否是文件(不是目錄)。◆booleanisDirectory():測(cè)試當(dāng)前文件是否是目錄,若為目錄則返回True?!纠?5.3】◆longlastModified():得到文件最近一次修改的時(shí)間?!鬺onglength():得到文件的長(zhǎng)度,以字節(jié)為單位,若不存在,返回0。◆booleandelete():刪除File對(duì)象代表的文件或目錄,目錄需為空。刪除成功,返回True。◆booleanmkdir():生成一個(gè)由該對(duì)象指定的路徑(新目錄),若成功,返回True?!鬮ooleanmkdirs():生成一個(gè)新的目錄,包含子目錄。若成功,返回true?!鬮ooleanrenameTo(FilenewName):將當(dāng)前File對(duì)象所代表的路徑名改為newName所代表的路徑名。若成功,返回true?!鬝tringlist():列出當(dāng)前目錄下的文件?!鬎ile[]listFiles():得到該對(duì)象所代表的目錄下的File對(duì)象數(shù)組。◆StringtoString():得到抽象路徑表示法。【例15.4】File類(lèi)的應(yīng)用【例15.5】【例15.6】目錄和文件管理32文件名的處理31File類(lèi)文件或目錄字節(jié)流
緩沖區(qū)流BufferedInputStream和BufferedOutputStream33順序讀/寫(xiě)文件(FileInputStream與FileOutputStream)31ByteArrayInputStream和ByteArrayOutputStream32字節(jié)流緩沖區(qū)流BufferedInputStream和Bu順序讀/寫(xiě)文件(FileInputStream與FileOutputStream)⑴FileInputStream類(lèi)從磁盤(pán)文件讀取數(shù)據(jù)。常用的構(gòu)造方法有:◆FileInputStream(Stringname):打開(kāi)文件name用來(lái)讀取數(shù)據(jù)。如:FileInputStreamf=newFileInputStream("c:/test.txt");◆FileInputStream(Filefile):打開(kāi)文件file用來(lái)讀取數(shù)據(jù)。如:Filef=newFile("c:/test.txt");FileInputStreamf1=newFileinputStream(f);◆將FileDescriptor對(duì)象作為其參數(shù)。如:FileDescriptor()fd=newFileDescriptor();FileinputStreamf2=newFileInputstream(fd);⑵FileOutputStream類(lèi)創(chuàng)建文件(如果文件不存在),并將數(shù)據(jù)寫(xiě)入文件。FileOutputStream類(lèi)常用的構(gòu)造方法有:◆FileOutputStream(Stringname):打開(kāi)文件name用來(lái)寫(xiě)入數(shù)據(jù)。如:FileOutputStreamf=newFileOutputStream("c:/test.txt");◆FileOutputStream(Filefile):打開(kāi)文件file用來(lái)寫(xiě)入數(shù)據(jù)。如:Filef=newFile("c:/test.txt");FileOutputStreamf1=newFileOutputStream(f);◆FileOutputStream(Stringname,Booleanappend):打開(kāi)文件name用來(lái)寫(xiě)入數(shù)據(jù),若append為true,則寫(xiě)入的數(shù)據(jù)會(huì)加到原有文件后面,否則,覆蓋原有的文件。如:FileOutputStreamf=newFileOutputStream("c:/test.txt",true);◆將FileDescriptor對(duì)象作為其參數(shù)。FileDescriptor()fd=newFileDescriptor();FileOutputStreamf=newFileOutputStream(fd);【例15.7】字節(jié)流
順序讀/寫(xiě)文件(FileInputStream與FileOuByteArrayInputStream和ByteArrayOutputStream字節(jié)流
⑴ByteArrayInputStream將字節(jié)數(shù)組用作源,并在該數(shù)組中執(zhí)行讀操作它有兩種構(gòu)造方法。第一種構(gòu)造方法將字節(jié)數(shù)組作為參數(shù)?!鬊yteArrayInputStream(byte[]buffer):生成一個(gè)字節(jié)數(shù)組的輸入流,并指定一個(gè)字節(jié)數(shù)組buffer為此輸入流的流緩沖區(qū)。如:ByteArrayInputStreamb=newByteArrayInputStream(buf[]);另外一種構(gòu)造方法有助于從指定的字節(jié)數(shù)組來(lái)創(chuàng)建ByteArrayInputStream?!鬊yteArrayinputStreamb=newByteArra
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 樓房加固施工方案(3篇)
- 2025年山西省職教高考《語(yǔ)文》核心考點(diǎn)必刷必練試題庫(kù)(含答案)
- 《國(guó)防動(dòng)員法》考試題庫(kù)100題(含答案)
- 2025年池州職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 2025年武威職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年常考版參考題庫(kù)含答案解析
- 2025年棗莊科技職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 專(zhuān)題05 名句名篇默寫(xiě)(第3期)
- 消防工程維修合同書(shū)
- 廣西二手房買(mǎi)賣(mài)合同
- 建材購(gòu)銷(xiāo)合同格式范本
- 2025年度院感管理工作計(jì)劃(后附表格版)
- 勵(lì)志課件-如何做好本職工作
- 2024年山東省濟(jì)南市中考英語(yǔ)試題卷(含答案解析)
- 2024年社區(qū)警務(wù)規(guī)范考試題庫(kù)
- 2025中考英語(yǔ)作文預(yù)測(cè):19個(gè)熱點(diǎn)話題及范文
- 靜脈治療護(hù)理技術(shù)操作標(biāo)準(zhǔn)(2023版)解讀 2
- 華為員工股權(quán)激勵(lì)方案
- 衛(wèi)生院安全生產(chǎn)知識(shí)培訓(xùn)課件
- 語(yǔ)文七年級(jí)下字帖打印版
- 兒童尿道黏膜脫垂介紹演示培訓(xùn)課件
- 《民航服務(wù)溝通技巧(第2版)》王建輝教案 第7課 有效處理投訴
評(píng)論
0/150
提交評(píng)論