《Java語(yǔ)言程序設(shè)計(jì)》課件第9章_第1頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)》課件第9章_第2頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)》課件第9章_第3頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)》課件第9章_第4頁(yè)
《Java語(yǔ)言程序設(shè)計(jì)》課件第9章_第5頁(yè)
已閱讀5頁(yè),還剩189頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

9.1文件管理

9.2字節(jié)流和字符流

9.3RandomAccessFile類9.4標(biāo)準(zhǔn)I/O

9.5小結(jié)

9.6習(xí)題

9.1.1File類

1.文件操作實(shí)例

【例9-1】指定并顯示目錄下所有的文件名。

假設(shè)“D:\student”的目錄結(jié)構(gòu)如圖9-1所示,需要得到圖9-2中的結(jié)果。9.1文件管理圖9-1指定目錄下的結(jié)構(gòu)圖9-2要求得到的統(tǒng)計(jì)信息這個(gè)操作有三個(gè)關(guān)鍵點(diǎn):①如何確定指定目錄?②如何篩選出該目錄下的文件?

③怎樣得到文件名或目錄名并顯示?利用File類就可以解決上面的問(wèn)題。

程序清單如下:

importjava.io.*;//File類位于這個(gè)包中

publicclassFileDir

{//利用StringBuffer類存放不斷取出的信息

StringBufferallDirectorys;//存放目錄名信息

StringBufferallFiles;//存放文件名信息publicFileDir()

{allDirectorys=newStringBuffer();

allFiles=newStringBuffer();

}

publicvoidgetInformation()

{Filedir=newFile(“D:\\student”);

//用dir指定要操作的目錄

Filea[]=dir.listFiles();

//以File對(duì)象形式得到該目錄下的所有文件(包括子目錄)inti=0,j=0;

for(intk=0;k<a.length;k++)

{if(a[k].isDirectory())//判斷是否是目錄

allDirectorys.append(a[k].getName()+"\n");

if(a[k].isFile())//判斷是否是文件

allFiles.append(a[k].getName()+"\n");

}

Stringstr1=newString(allDirectorys);//將BufferString對(duì)象處理成字符串Stringstr2=newString(allFiles);

System.out.println("該目錄下的文件夾有:\n"+str1);

System.out.println("該目錄下的文件有:\n"+str2);

}

publicstaticvoidmain(String[]args)

{FileDirfd=newFileDir();

fd.getInformation();

}

} 程序中,F(xiàn)ile類解決了以下關(guān)鍵問(wèn)題:

(1)?Filedir=newFile(“D:\\student”);

利用File類的構(gòu)造方法,使得dir對(duì)象指向D:\student目錄,即操作對(duì)象被確定下來(lái)。其中“\\”是目錄分隔符。

(2)?Filea[]=dir.listFiles();

通過(guò)dir對(duì)象調(diào)用File類的listFiles()方法,得到該目錄下所有文件和子目錄的抽象路徑名(返回類型是File),并存儲(chǔ)到數(shù)組里。之后就可以操作數(shù)組元素,依次處理每個(gè)文件。

(3)?a[k].isDirectory()和a[k].isFile()方法的執(zhí)行,可判斷數(shù)組元素里存儲(chǔ)的抽象路徑名給定的文件是普通文件還是目錄。

2.File類的基本操作

在進(jìn)行文件操作時(shí),需要知道一些關(guān)于文件的信息。File類提供了一些方法來(lái)操縱文件和獲得文件的信息。對(duì)于目錄,Java把它當(dāng)作一種特殊的文件,即文件名的列表。通過(guò)File類的方法,可以得到文件或目錄的描述信息,包括名稱、所在路徑、讀/寫性、長(zhǎng)度等,還可以進(jìn)行創(chuàng)建新目錄、創(chuàng)建臨時(shí)文件、改變文件名、刪除文件、列出一個(gè)目錄中所有的文件或與某個(gè)模式相匹配的文件等操作。

1)構(gòu)造方法

File類的構(gòu)造方法見(jiàn)表9-1。表9-1File類的構(gòu)造方法其中,路徑名既可以是字符串,也可以是File對(duì)象。

【例9-2】File類的構(gòu)造方法應(yīng)用(假設(shè)“D:\student\天使寶貝”目錄結(jié)構(gòu)如圖9-3所示)。

importjava.io.*;

publicclassTestFile

{publicstaticvoidmain(String[]args)

{Filedir=newFile(“d:\\student”);//創(chuàng)建一個(gè)父路徑

Filef1=newFile(dir,“2008-2-1.jpg”);//指定一個(gè)文件

Filef2=newFile(“d:\\student”,“天使寶貝”);

//指定一個(gè)子目錄圖9-3“D:\student\天使寶貝”的目錄結(jié)構(gòu)

Stringstr1,str2[];

str1=f1.getPath();//得到字符串路徑名

str2=f2.list();//得到目錄列表中文件名的字符串形式,存儲(chǔ)到數(shù)組中

System.out.println(“\nf1可操作的對(duì)象是:”);

System.out.println(str1);

System.out.println(“\nf2可操作的對(duì)象是:”);

for(inti=0;i<str2.length;i++)

System.out.print(str2[i]+“\t”);

}

}

程序運(yùn)行結(jié)果如圖9-4所示。圖9-4運(yùn)行結(jié)果

2)?File類提供的方法

創(chuàng)建一個(gè)文件對(duì)象后,可以用File類提供的方法來(lái)獲得文件相關(guān)信息,并對(duì)文件進(jìn)行操作。表9-2列舉了一部分File提供的方法。表9-2File類提供的方法

【例9-3】創(chuàng)建目錄,構(gòu)造文件。假設(shè)“D:\example”目錄結(jié)構(gòu)如圖9-5所示,現(xiàn)在要建立它的一個(gè)子目錄“temp”,并且在這個(gè)子目錄里創(chuàng)建一個(gè)新文件“ok.java”,不含任何內(nèi)容,如圖9-6所示。圖9-5“d:\example”的目錄結(jié)構(gòu)圖9-6運(yùn)行結(jié)果程序清單如下:

importjava.io.*;

publicclassFileAction

{publicstaticvoidmain(String[]args)

{FilenewPath=newFile("d:\\example\\temp");

FilenewFile=newFile("d:\\example\\temp\\Ok.java");

newPath.mkdir();//建立temp目錄System.out.println("Creatdirectorysuccessfully!");

try//建立新文件ok.java

{newFile.createNewFile();

}

catch(Exceptione){}

System.out.println("Creatfilesuccessfully!");

}

}9.1.2文件過(guò)濾器

1.FileFilter和FilenameFilter接口

Java提供了兩個(gè)接口FileFilter和FilenameFilter來(lái)實(shí)現(xiàn)對(duì)文件名字符串的過(guò)濾。這兩個(gè)接口中都有accept()方法。

(1)?FileFilter接口中的accept()方法:

publicinterfaceFileFilter

{publicbooleanaccept(Filepathname);

}

(2)?FilenameFilter接口中的accept方法:

publicinterfaceFilenameFilter

{publicbooleanaccept(Filedir,Stringname);

}

FileFilter和FilenameFilter接口的區(qū)別在于,其中accept()方法的參數(shù)不同。

2.顯示文件清單時(shí)使用過(guò)濾器

使用File類的list()方法和listFiles()方法顯示文件清單時(shí),可以設(shè)置一個(gè)文件過(guò)濾器作為參數(shù)(如表9-2中最后四個(gè)方法所示)。當(dāng)調(diào)用list()方法或listFiles()方法時(shí),原始列表中的每個(gè)項(xiàng)目將調(diào)用accept()方法。如果accept()方法返回true,則相應(yīng)的項(xiàng)目就留在列表內(nèi);如果返回false,則相應(yīng)的項(xiàng)目將從列表中刪除。顯然,提供accept()方法的接口成為使過(guò)濾器機(jī)制運(yùn)轉(zhuǎn)起來(lái)的載體,因此需要定義自己的類來(lái)實(shí)現(xiàn)適當(dāng)?shù)慕涌?,以獲得具有特定擴(kuò)展名或者以特定字符序列開(kāi)始的文件名列表。

【例9-4】使用過(guò)濾器對(duì)指定文件進(jìn)行過(guò)濾。

假設(shè)“D:\student”目錄結(jié)構(gòu)如圖9-7所示,現(xiàn)在要將該目錄下所有擴(kuò)展名為“mp3”的文件顯示出來(lái)。在這個(gè)過(guò)程中對(duì)目錄下的文件名要進(jìn)行篩選,將符合要求的文件存儲(chǔ)起來(lái)。利用文件過(guò)濾器就可以實(shí)現(xiàn)這個(gè)功能,操作的關(guān)鍵點(diǎn)有如下兩個(gè):

(1)如何實(shí)現(xiàn)接口中的accept()方法?

(2)怎樣運(yùn)用過(guò)濾機(jī)制?圖9-7“d:\student”目錄的結(jié)構(gòu)程序清單如下:

importjava.io.*;

publicclassDirFilterimplementsFilenameFilter

{publicbooleanaccept(Filedir,Stringname)

{booleanboo=false;

intstart=name.indexOf('.'); //確定文件名中?'.'?的位置

Stringsuffix=name.substring(start+1); //截取文件擴(kuò)展名

if(suffix.equalsIgnoreCase("mp3")) //擴(kuò)展名忽略大小后與?"mp3"?比較

boo=true;

returnboo;

}publicstaticvoidmain(String[]args)

{Stringresult[];

Filedir=newFile(“d:\\student”);

result=dir.list(newDirFilter());

//實(shí)現(xiàn)文件過(guò)濾,結(jié)果保存到數(shù)組中

System.out.println("\n后綴是\'mp3\'的文件如下:");

for(inti=0;i<result.length;i++)

System.out.println(result[i]);

}

}

程序運(yùn)行的結(jié)果如圖9-8所示。圖9-8運(yùn)行結(jié)果程序中,DirFilter類是一個(gè)自定義的文件名過(guò)濾器類,實(shí)現(xiàn)了FilenameFilter接口。類中的accept()方法完成了文件擴(kuò)展名的截取和比較,返回邏輯值。dir對(duì)象在調(diào)用list()方法時(shí)通過(guò)參數(shù)設(shè)置了過(guò)濾器,list()方法通過(guò)為此目錄對(duì)象下的每個(gè)文件名調(diào)用accept(),來(lái)判斷該文件是否包含在內(nèi);判斷結(jié)果由accept()返回的布爾值表示。9.2.1流機(jī)制

I/O類庫(kù)中常使用“流”這個(gè)抽象概念,它代表任何有能力輸出數(shù)據(jù)的數(shù)據(jù)源對(duì)象或者是有能力接受數(shù)據(jù)的接受端對(duì)象。

9.2字節(jié)流和字符流

Java的輸入/輸出流提供了一條通道:可以利用輸入流將數(shù)據(jù)從“源頭”讀進(jìn)來(lái),利用輸出流將數(shù)據(jù)寫到目的地,如圖9-9和圖9-10所示。流通過(guò)Java的輸入/輸出系統(tǒng)與物理設(shè)備鏈接,盡管物理設(shè)備不盡相同,但是所有流的行為具有同樣的方式,能夠適應(yīng)所有類型的外部設(shè)備。創(chuàng)建一個(gè)好的輸入/輸出(I/O)系統(tǒng)是一項(xiàng)艱難的任務(wù)。Java類庫(kù)的設(shè)計(jì)者通過(guò)創(chuàng)建大量的類來(lái)解決這個(gè)難題,使得“流”屏蔽了實(shí)際的I/O設(shè)備中處理數(shù)據(jù)的細(xì)節(jié)。圖9-9輸入流示意圖圖9-10輸出流示意圖

Java類庫(kù)中的I/O類分為輸入和輸出兩部分。通過(guò)繼承,任何自InputStream或Reader派生而來(lái)的類都含有名為read()的基本方法,用于讀取單個(gè)字節(jié)或者字符。同樣,任何自O(shè)utputStream或Writer派生而來(lái)的類都含有名為write()的基本方法,用于寫單個(gè)字節(jié)或者字符。根據(jù)讀/寫數(shù)據(jù)的機(jī)制,可以分成兩種類型的數(shù)據(jù)流:二進(jìn)制字節(jié)流(BinaryStream)和字符流(CharacterStream)。表9-3列出了java.io包中數(shù)據(jù)流的抽象類。表9-3java.io包中數(shù)據(jù)流的抽象類

1.字節(jié)流InputStream和OuputStream

兩者均為所有面向字節(jié)的輸入/輸出流的超類。類中聲明了用于字節(jié)輸入/輸出的多個(gè)方法,包括讀取數(shù)據(jù)、寫入數(shù)據(jù)、標(biāo)記位置、獲取數(shù)據(jù)量、關(guān)閉數(shù)據(jù)流等。

InputStream類別的類從不同數(shù)據(jù)源產(chǎn)生輸入,這些數(shù)據(jù)源包括:

(1)字節(jié)數(shù)組。

(2)??String對(duì)象。

(3)文件。

(4)“管道”,其工作方式與實(shí)際管道相似,即從一端輸入,從另一端輸出。

(5)一個(gè)由其他種類的流組成的序列,以便將它們收集合并到一個(gè)流內(nèi)。

(6)其他數(shù)據(jù)源,如Internet連接等。

OutputStream類決定了輸出的目標(biāo):字節(jié)數(shù)組、文件或管道。

2.字符流Reader和Writer

兩者均為所有面向字符的輸入/輸出流的超類。設(shè)計(jì)Reader和Writer繼承層次結(jié)構(gòu)主要是為了國(guó)際化。原有的I/O流繼承層次結(jié)構(gòu)僅支持8位的字節(jié)流,并且不能很好地處理16位的Unicode字符。因?yàn)閁nicode用于字符國(guó)際化,所以添加Reader和Writer繼承層次結(jié)構(gòu)就是為了在所有的I/O操作中都支持Unicode。兩者的使用方法與InputStream類和OutputStream類基本相同。不同的是,這兩個(gè)類以Unicode字符為單位進(jìn)行讀/寫,當(dāng)寫入一個(gè)16位的Unicode字符時(shí),按字節(jié)分成兩部分,先寫高位字節(jié),后寫低位字節(jié)。

Reader類從字符數(shù)組、String對(duì)象、文件和管道等數(shù)據(jù)源產(chǎn)生輸入。Writer類決定了輸出目標(biāo):字符數(shù)組、字符緩沖區(qū)、文件或管道。

下面將講解部分I/O流類,文中提供了類的常用方法,其他方法可參閱JDKAPI文檔。9.2.2字節(jié)流類

1.ByteArrayInputStream和ByteArrayOutputStream

可以使用ByteArrayInputStream類打開(kāi)一個(gè)來(lái)自內(nèi)存中的字節(jié)數(shù)組的輸入流。下面展示了ByteArrayInputStream類的繼承關(guān)系:

ByteArrayInputStream類的構(gòu)造方法見(jiàn)表9-4,它的方法見(jiàn)表9-5。表9-4ByteArrayInputStream類的構(gòu)造方法表9-5ByteArrayInputStream類的方法

ByteArrayOuputStream類允許將字節(jié)流寫入緩沖區(qū)。下面展示了ByteArrayOutputStream類的繼承關(guān)系:

ByteArrayOutputStream類的構(gòu)造方法見(jiàn)表9-6,它的方法見(jiàn)表9-7。表9-6ByteArrayOutputStream類的構(gòu)造方法表9-7ByteArrayOutputStream類的方法【例9-5】完成字節(jié)數(shù)組輸入流與輸出流的操作。

importjava.io.*;

publicclassInByteArray

{publicstaticvoidmain(String[]args)throwsIOException

{Stringstr="PleasestudyI/O!";

byte[]a=str.getBytes();//將字符串轉(zhuǎn)化成字節(jié)數(shù)組

byte[]b;

intn;//定義一個(gè)字節(jié)數(shù)組輸入流,數(shù)據(jù)源是字節(jié)數(shù)組a

ByteArrayInputStreamin=newByteArrayInputStream(a);

System.out.println("\nDatafromByteArraya:");

//從數(shù)組a逐字節(jié)地讀數(shù)據(jù),并以字符形式輸出

while((n=in.read())!=-1)

System.out.print((char)n);

System.out.println();

//定義一個(gè)字節(jié)數(shù)組輸出流

ByteArrayOutputStreamout=newByteArrayOutputStream();

out.write(a);

//將數(shù)組a中的全部字節(jié)寫到這個(gè)數(shù)組輸出流中

b=out.toByteArray();

//創(chuàng)建一個(gè)新分配的byte數(shù)組b,數(shù)據(jù)來(lái)自輸出流

//從數(shù)組b逐字節(jié)地讀數(shù)據(jù),并以字符形式輸出

System.out.println("\nDatafromByteArrayb:");

for(inti=0;i<b.length;i++)

System.out.print((char)b[i]);

in.close();//關(guān)閉輸入流,釋放系統(tǒng)資源

}

}

運(yùn)行結(jié)果如圖9-11所示。圖9-11程序運(yùn)行結(jié)果

2.FileInputStream和FileOutputStream

FileInputStream類專為處理來(lái)自文件的面向字節(jié)的輸入而設(shè)計(jì),它的繼承關(guān)系如下:FileInputStream類的構(gòu)造方法見(jiàn)表9-8,它的方法見(jiàn)表9-9。表9-8FileInputStream類的構(gòu)造方法表9-9FileInputStream類的方法

FileOutputStream類可以逐字節(jié)地將數(shù)據(jù)寫到文件中,它的繼承關(guān)系如下:FileOutputStream類的構(gòu)造方法見(jiàn)表9-10,它的方法見(jiàn)表9-11。表9-10FileOutputStream類的構(gòu)造方法表9-11FileOutputStream類的方法

【例9-6】完成文件的讀操作。

文件t1.txt的內(nèi)容如圖9-12所示,要求將其內(nèi)容讀出來(lái)并在控制臺(tái)中顯示,運(yùn)行結(jié)果如圖9-13所示。圖9-12“t1.txt”文件的內(nèi)容圖9-13程序運(yùn)行結(jié)果程序清單如下:

importjava.io.*;

publicclassInByteFile

{publicstaticvoidmain(String[]args)

{intnum=0;

intb;//用于接收in.read()的返回值

try

{//把當(dāng)前目錄下的文件t1.txt作為數(shù)據(jù)源,建立輸入流

FileInputStreamin=newFileInputStream("t1.txt");

System.out.println("\n文件t1.txt的內(nèi)容如下:\n");//逐字節(jié)地讀文件,依次返回字節(jié)值

while((b=in.read())!=-1)

{System.out.print((char)b);//按字符形式輸出

num++;

//統(tǒng)計(jì)字節(jié)個(gè)數(shù)

}

System.out.println();

System.out.println("TOTAL="+num);in.close();//關(guān)閉輸入流,釋放系統(tǒng)資源

}

catch(Exceptione){};

}

}

【例9-7】完成圖片文件的讀/寫操作。

“D:\java”目錄結(jié)構(gòu)如圖9-14所示,其包含一個(gè)圖片文件“1.jpg”。現(xiàn)在要建立一個(gè)新文件,取名為“new.jpg”,內(nèi)容來(lái)自“1.jpg”。圖片內(nèi)容見(jiàn)圖9-15,成功讀/寫數(shù)據(jù)后的目錄結(jié)構(gòu)見(jiàn)圖9-16,這時(shí)打開(kāi)文件“new.jpg”,與圖9-15的形式完全一樣。圖9-14“D:\java”目錄結(jié)構(gòu)圖9-15“1,jpg”文件內(nèi)容

圖9-16運(yùn)行后的目錄結(jié)構(gòu)程序清單如下:

importjava.io.*;

publicclassRWPicture

{publicstaticvoidmain(String[]args)

{try

{FileInputStreamin=newFileInputStream(“1.jpg”);

//建立文件輸入流

FileOutputStreamout=newFileOutputStream(“new.jpg”);

//建立文件輸出流

intcount=in.available();

//得到了文件1.jpg的字節(jié)數(shù)

byte[]b=newbyte[count];

in.read(b);

//將1.jpg文件內(nèi)容讀到字節(jié)數(shù)組b中

out.write(b);//將字節(jié)數(shù)組b中的內(nèi)容寫到文件new.jpg中

in.close();

//關(guān)閉輸入、輸出流,釋放系統(tǒng)資源

out.close();

System.out.println("成功創(chuàng)建new.jpg文件,請(qǐng)查看!");

}

catch(Exceptione){};

}

}

FileOutputStream類在創(chuàng)建輸入流時(shí)要指定文件,有可能出現(xiàn)文件不存在、打不開(kāi)、讀不了的情況,因此要捕獲異常。在利用輸出流對(duì)象進(jìn)行寫操作時(shí),如果文件不存在,則創(chuàng)建一個(gè)新文件;如果文件已存在,使用重寫方式則會(huì)覆蓋原有數(shù)據(jù)。

3.FilterInputStream和FilterOutputStream

在直接使用擴(kuò)展子類的方法時(shí),如果導(dǎo)致產(chǎn)生了大量的、用以滿足所需的各種可能的組合的子類,通常會(huì)使用修飾器,但處理太多的子類時(shí)就顯得不太實(shí)際。修飾器模式提供了相當(dāng)多的靈活性,但同時(shí)也增加了代碼的復(fù)雜性。JavaI/O類庫(kù)操作不便的原因在于:必須要?jiǎng)?chuàng)建很多類——“核心”I/O類加所有的修飾器,才能得到所要求的單個(gè)I/O對(duì)象。

FilterInputStream和FilterOutputStream是用來(lái)提供修飾器類接口以控制特定輸入流(InputStream)和輸出流(OutputStream)的兩個(gè)類,定義如下:

publicclassFilterInputStreamextendsInputStream

publicclassFilterOutputStreamextendsOutputStream

這兩個(gè)類能為所有正在被修飾的對(duì)象提供通用接口,是修飾器的必要條件。通過(guò)FilterInputStream可以從InputStream讀取數(shù)據(jù),通過(guò)FilterOutputStream可以向OutputStream寫入數(shù)據(jù)。這個(gè)意義可以從他們子類的構(gòu)造方法上得到體現(xiàn)。

FilterInputStream類型見(jiàn)表9-12,F(xiàn)ilterOutputStream類型見(jiàn)表9-13。表9-12FilterInputStream類型表9-13FilterOutputStream類型DataInputStream類和DataOutputStream類的繼承關(guān)系如下所示:

DataInputStream類及DataOutputStream類的構(gòu)造方法見(jiàn)表9-14,類方法見(jiàn)表9-15。表9-14DataInputStream類和DataOutputStream類的構(gòu)造方法表9-15DataInputStream類和DataOutputStream類的部分方法

【例9-8】DataInputStream類和DataOutputStream類的操作。

“D:\example”目錄結(jié)構(gòu)如圖9-17所示。建立一個(gè)文件“infor.dat”,存放一些基本類型數(shù)據(jù);并將該文件的數(shù)據(jù)讀進(jìn)來(lái),在控制臺(tái)按照數(shù)據(jù)類型正確顯示數(shù)據(jù)。程序運(yùn)行后,目錄變化如圖9-18所示。圖9-17“D:\example”目錄結(jié)構(gòu)圖9-18運(yùn)行后的目錄結(jié)構(gòu)程序清單如下:

importjava.io.*;

publicclassFilter_Data

{publicstaticvoidmain(String[]args)

{try

{//建立文件輸出流對(duì)象,目標(biāo)為infor.dat

FileOutputStreamout1=newFileOutputStream("infor.dat");//建立一個(gè)指向out1的輸出流,按照DataOutputStream類提供的方法將數(shù)據(jù)寫到out1流中

DataOutputStreamout2=newDataOutputStream(out1);

//將數(shù)據(jù)寫到文件中去

out2.writeInt(300); out2.writeInt(9999);

out2.writeFloat(123.45f); out2.writeBoolean(true);

out2.writeBoolean(false); out2.writeChars("filter___DataOutputStream");

}catch(IOExceptione){}

try

{//建立文件輸入流對(duì)象,數(shù)據(jù)源為infor.dat

FileInputStreamin1=newFileInputStream("infor.dat");

//建立一個(gè)指向in1的輸入流,按照DataInputStream類提供的方法從in1流中讀取數(shù)據(jù)

DataInputStreamin2=newDataInputStream(in1);

//從文件中讀出數(shù)據(jù)并在控制臺(tái)顯示

System.out.println("thecontentof\'infor.dat\'are:");

System.out.println("整數(shù)1:\t"+in2.readInt());

System.out.println("整數(shù)2:\t"+in2.readInt());

System.out.println("float型:\t"+in2.readFloat());

System.out.println("boolean型1:\t"+in2.readBoolean());

System.out.println("boolean型2:\t"+in2.readBoolean());

System.out.print("字符串:\t");charch;

while((ch=in2.readChar())!='\0')

System.out.print(ch);

}catch(IOExceptione){}

}

}

控制臺(tái)顯示如圖9-19所示。圖9-19運(yùn)行后的顯示結(jié)果

PrintStream類以一種便利的方式將各種數(shù)據(jù)類型的數(shù)據(jù)打印至另一個(gè)作為接收端的輸出流中,即將各種數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換成字符串寫入接收端輸出流。當(dāng)數(shù)據(jù)被寫到緩沖區(qū)后,調(diào)用println()方法或?qū)懭胍粋€(gè)換行符,PrintStream對(duì)象的flush()方法將自動(dòng)執(zhí)行,并刷新緩沖區(qū),即可將緩沖區(qū)中的數(shù)據(jù)寫入接收端輸出流中。

PrintStream類的繼承關(guān)系如下:PrintStream類的部分構(gòu)造方法見(jiàn)表9-16,類方法見(jiàn)表9-17。表9-16PrintStream類的構(gòu)造方法表9-17PrintStream類的方法

【例9-9】PrintStream類的操作。

“D:\example”目錄結(jié)構(gòu)如圖9-20所示。建立一個(gè)文件“infor.txt”用于存放數(shù)據(jù)。執(zhí)行后的目錄變化如圖9-21所示,文件“infor.txt”內(nèi)容如圖9-22所示。圖9-20?“D:\example”目錄結(jié)構(gòu)圖9-21程序執(zhí)行后的目錄結(jié)構(gòu)圖9-22?“infor.txt”文件的內(nèi)容程序清單如下:

importjava.io.*;

publicclassFilter_Print

{publicstaticvoidmain(String[]args)

{try

{StringfileName="d:\\example\\infor.txt";//定義目標(biāo)的字符串形式//定義輸出流,以fileName為目標(biāo)且輸出內(nèi)容可以附加到文件末尾

FileOutputStreamout1=newFileOutputStream(fileName,true);

//定義一個(gè)指向out1的輸出流,可以按照PrintStream類提供的方法將數(shù)據(jù)寫到out1流中

PrintStreamout2=newPrintStream(out1);//進(jìn)行數(shù)據(jù)輸出

char[]c={'奧','運(yùn)','精','神'};

out2.print(c);

out2.println(true);

out2.print("祖沖之與圓周率:");

out2.println(3.1415926);

out2.print("利率:");

out2.print(5);out2.write(37);//該方法使得字節(jié)數(shù)據(jù)37對(duì)應(yīng)于ASCII碼的'%'

out2.println();

out2.println("打印輸出流對(duì)象自身:");

out2.print(out2);

}

catch(IOExceptione)

{e.printStackTrace();

}

}

}

PrintStream類的方法比較簡(jiǎn)單,使用時(shí)應(yīng)注意用write()方法寫數(shù)據(jù)與用print()/println()方法打印數(shù)據(jù)之間的區(qū)別。另外,執(zhí)行該類的方法后,目標(biāo)文件中的內(nèi)容是可見(jiàn)的,這是與DataOutputStream對(duì)象寫入文本文件數(shù)據(jù)明顯不同的地方。9.2.3字符流類

1.FileReader和FileWriter

可以使用FileReader類創(chuàng)建從文件進(jìn)行讀取的基于字符的流,它的繼承關(guān)系如下:FileReader類的構(gòu)造方法見(jiàn)表9-18。表9-18FileReader類的構(gòu)造方法這個(gè)類只定義了構(gòu)造方法,此外只具有從InputStreamReader繼承的功能。表9-19列舉了FileReader父類的一些常用方法。表9-19FileReader父類的常用方法

FileWriter類可用于創(chuàng)建寫入文件的基于字符的流,它的繼承關(guān)系如下:FileWriter類的構(gòu)造方法見(jiàn)表9-20。表9-20FileWriter類的構(gòu)造方法

FileWriter類只定義了構(gòu)造方法,此外只具有從InputStreamWriter繼承的功能。表9-21列舉了父類的一些常用方法。表9-21FileWriter父類的常用方法

【例9-10】讀取基于字符的文件。

打開(kāi)一個(gè)文件“D:\example\file.txt”,內(nèi)容見(jiàn)圖9-23。將文件內(nèi)容讀到緩沖區(qū),然后顯示數(shù)據(jù),見(jiàn)圖9-24。圖9-23文件“file.txt”的內(nèi)容圖9-24程序執(zhí)行后的結(jié)果程序清單如下:

importjava.io.*;

publicclassInFileReader

{publicstaticvoidmain(String[]args)throwsException

{FileReaderfr=newFileReader(“d:\\example\\file.txt”);

//構(gòu)造一個(gè)輸入流

chardata[]=newchar[200];//用來(lái)存儲(chǔ)數(shù)據(jù)

intcharNumber=fr.read(data);

//從流中讀取數(shù)據(jù)寫到data中,并返回讀入的字符數(shù)

Stringstr=newString(data,0,charNumber);

//將字符數(shù)組中的數(shù)據(jù)轉(zhuǎn)化成字符串System.out.println(“\n文件內(nèi)容如下:”);

System.out.println(str);

System.out.println(“\n字符個(gè)數(shù)為:”+charNumber);

}

}

【例9-11】將數(shù)據(jù)寫到文件中。

使用FileWriter將字符緩沖區(qū)中的數(shù)據(jù)寫到文件中,可采用三種方式:逐字符地寫數(shù)據(jù)、一次寫所有數(shù)據(jù)、分批寫數(shù)據(jù),分別對(duì)應(yīng)文件“D:\example\infor1.txt”、“D:\example\infor2.txt”和“D:\example\infor3.txt”,運(yùn)行結(jié)果見(jiàn)圖9-25、圖9-26和圖9-27。圖9-25?“inforl.txt”文件的內(nèi)容圖9-26?“infor2.txt”文件的內(nèi)容圖9-27?“infor3.txt”文件的內(nèi)容程序清單如下:

importjava.io.*;

publicclassOutFileWriter

{publicstaticvoidmain(String[]args)throwsException

{chardata[]={‘心','情','愉','快','地','學(xué)','習(xí)','J','a','v','a','!'};

//數(shù)據(jù)源

FileWriterfw1=newFileWriter("d:\\example\\infor1.txt");

//構(gòu)造第一個(gè)輸出流

FileWriterfw2=newFileWriter("d:\\example\\infor2.txt");//構(gòu)造第二個(gè)輸出流

FileWriterfw3=newFileWriter("d:\\example\\infor3.txt");//構(gòu)造第三個(gè)輸出流for(inti=0;i<data.length;i++)

fw1.write(data[i]);//逐字符寫

fw2.write(data);//一次性寫

fw3.write(data,5,7);//從數(shù)組的第5個(gè)位置連續(xù)寫7個(gè)字符

fw1.close();//只有關(guān)閉流的時(shí)候才發(fā)生了寫文件操作

fw2.close();

fw3.close();

}

}

2.BufferedReader和BufferedWriter

很多時(shí)候需要逐行操作文本文件的內(nèi)容,BufferedReader和BufferedWriter類提供了這樣的操作方法,使得問(wèn)題解決起來(lái)更簡(jiǎn)單、更便捷。

BufferedReader和BufferedReader類的繼承關(guān)系如下:BufferedReader類的構(gòu)造方法見(jiàn)表9-22,類方法見(jiàn)表9-23。表9-22BufferedReader類的構(gòu)造方法表9-23BufferedReader類的方法BufferedWriter類的構(gòu)造方法見(jiàn)表9-24,類方法見(jiàn)表9-25。表9-24BufferedWriter類的構(gòu)造方法表9-25BufferedWriter類的方法

【例9-12】文本文件的讀寫。

文件“D:\example\source.txt”的內(nèi)容如圖9-28所示,現(xiàn)將它的內(nèi)容寫到當(dāng)前目錄下的文件“destnation.txt”中,結(jié)果見(jiàn)圖9-29。圖9-28文件“source.txt”的內(nèi)容圖9-29文件“destnation.txt”的內(nèi)容程序清單如下:

importjava.io.*;

publicclassBuffered_IO

{publicstaticvoidmain(String[]args)

{Strings=newString();

try

{FileReaderfr=newFileReader(“source.txt”);

FileWriterfw=newFileWriter(“destnation.txt”);

BufferedReaderin=newBufferedReader(fr);

//建立一個(gè)輸入流指向in

BufferedWriterout=newBufferedWriter(fw);

//建立一個(gè)輸出流指向outout.write(“thefollowingisfromsource:”);

//給目標(biāo)文件開(kāi)始處加一行信息

out.newLine(); //寫一個(gè)換行符

while((s=in.readLine())!=null)

//讀取一行文本,不為空時(shí)完成寫功能

{out.write(s); //寫目標(biāo)文件

out.newLine();

}

in.close();out.close();//關(guān)閉輸出流,將緩沖中的數(shù)據(jù)寫到目的文件中

System.out.println("成功創(chuàng)建destnation.txt文件,請(qǐng)查看!");

}

catch(Exceptione){};

}

}

BufferedReader類的readLine()方法只是讀入一行數(shù)據(jù),但并不提供換行功能,只能再借助newLine()方法寫入一個(gè)換行符。下面利用PrintWriter類的方法可以將這兩個(gè)功能結(jié)合在一起,詳細(xì)內(nèi)容請(qǐng)參考JDKAPI中關(guān)于該類的使用方法。

程序改動(dòng)如下:

importjava.io.*;

publicclassBuffered_IO_2

{publicstaticvoidmain(String[]args)

{Strings=newString();try{BufferedReaderin=newBufferedReader(newFileReader("source.txt"));

PrintWriterout=newPrintWriter(newFileWriter("destnation.txt"));

out.println("thefollowingisfromsource");

while((s=in.readLine())!=null)

out.println(s);

in.close();

out.close();

System.out.println("成功創(chuàng)建destnation.txt文件,請(qǐng)查看!");

}catch(Exceptione){}

}

}

1.思考一個(gè)問(wèn)題

當(dāng)一個(gè)文件由大小已知的記錄組成,需要從一條記錄轉(zhuǎn)移到另一條記錄時(shí)該如何操作?對(duì)一個(gè)文件既能讀又能寫,該如何操作?

針對(duì)以上要求,可由搜尋機(jī)制來(lái)實(shí)現(xiàn)。有些類,如BufferedInputStream允許標(biāo)注(mark())位置(其值存儲(chǔ)在內(nèi)部某個(gè)簡(jiǎn)單變量)和重新設(shè)定位置(reset()),但是這些功能有限。Java的I/O流機(jī)制總是分別建立輸入流和輸出流,如何在一個(gè)流中完成讀/寫操作,RandomAccessFile類正好解決了上述問(wèn)題。9.3RandomAccessFile類

RandomAccessFile類適用于由大小已知的記錄組成的文件,它支持搜尋方法,并且只適用于文件??梢允褂胹eek()方法將記錄從一處轉(zhuǎn)移到另一處,然后讀取或者修改記錄。實(shí)際上文件中記錄的大小不一定都相同,只要能夠確定那些記錄有多大以及它們?cè)谖募械奈恢眉纯伞?/p>

RandomAccessFile類的繼承關(guān)系如下:

RandomAccessFile類的定義如下:

publicclassRandomAccessFile

extendsObject

implementsDataOutput,DataInput,Closeable

可以看出,RandomAccessFile類既不是字節(jié)流繼承層次結(jié)構(gòu)中的一部分,也不是字符流繼承層次結(jié)構(gòu)中的一部分。除了實(shí)現(xiàn)了DataInput和DataOutput接口之外,它和這兩類的繼承層次結(jié)構(gòu)沒(méi)有任何關(guān)聯(lián),它是一個(gè)完全獨(dú)立的類。

2.RandomAccessFile類的使用

RandomAccessFile類的構(gòu)造方法見(jiàn)表9-26,類方法見(jiàn)表9-27。表9-26RandomAccessFile類的構(gòu)造方法表9-27RandomAccessFile類的方法續(xù)表從本質(zhì)上來(lái)說(shuō),RandomAccessFile的工作方式類似于把DataInputStream和DataOutputStream組合起來(lái)使用,還添加了一些方法。其中,getFilePointer()方法用于查找當(dāng)前所處的文件位置,seek()方法用于在文件內(nèi)移至新的位置,length()方法用于判斷文件的最大尺寸。另外,在構(gòu)造方法中還需要第二個(gè)參數(shù)指示“隨機(jī)讀”(r)還是“既讀又寫”(rw),它并不支持只寫文件。

【例9-13】文件讀寫。

“D:\example\names.txt”文件內(nèi)容如圖9-30所示。通過(guò)程序再添加兩個(gè)動(dòng)物名稱,并在控制臺(tái)中顯示,如圖9-31和圖9-32所示。圖9-30原文件的內(nèi)容圖9-31運(yùn)行后的文件內(nèi)容圖9-32控制臺(tái)顯示結(jié)果程序清單如下:

importjava.io.*;

publicclassRandom_RW

{publicstaticvoidmain(String[]args)

{Stringstring;

Stringarray[]=newString[256];

longlen=0;

inti=0,counter=0;

try{//以既讀又寫的方式建立一個(gè)數(shù)據(jù)流,源為names.txt文件

RandomAccessFileaccess=newRandomAccessFile(“names.txt”,“rw");

len=access.length();

//統(tǒng)計(jì)文件長(zhǎng)度(按字符個(gè)數(shù)計(jì)算),回車換行統(tǒng)計(jì)為2個(gè)字符

access.seek(len);

//設(shè)置指針到下一個(gè)寫操作的位置(從位置0算起)

access.writeBytes("fox\n");

//按字節(jié)序列將一個(gè)字符串寫到這個(gè)文件中

access.writeBytes("bee\n");

access.seek(0);//將指針重新定位到文件的起始位置

while((string=access.readLine())!=null)

//行讀,結(jié)果記錄到string

{counter++; //記錄行數(shù)

array[i++]=string;

//讀出的數(shù)據(jù)(字符串)存儲(chǔ)到數(shù)組中

}access.close();

}

catch(IOExceptionex){}

for(i=0;i<counter;i++) //顯示數(shù)組信息

System.out.println(array[i]);

}

}

【例9-14】教材書目管理。

教材信息存放在“D:\example\bookinfor.txt”文件中,假設(shè)已存儲(chǔ)了一些數(shù)據(jù)資料,此時(shí)運(yùn)行該管理系統(tǒng),界面如圖9-33所示。要求從界面錄入新的數(shù)據(jù)記錄,當(dāng)單擊“增加”按鈕時(shí),將信息以追加方式存入到文件中,并且刷新列表,結(jié)果如圖9-34所示。圖9-33對(duì)已有數(shù)據(jù)的顯示

圖9-34增加新數(shù)據(jù)程序清單如下:

importjava.io.*;

importjava.awt.*;

importjavax.swing.*;

importjava.awt.event.*;

publicclassRandom_BookextendsJFrameimplementsActionListener

{//定義界面元素JButtonbt=newJButton("增加");

JTextFieldtf1=newJTextField(15);

JTextFieldtf2=newJTextField(15);

JTextFieldtf3=newJTextField(15);

JTextAreata=newJTextArea(7,20);

JLabellb1=newJLabel("編號(hào)");

JLabellb2=newJLabel("名稱");

JLabellb3=newJLabel("作者");RandomAccessFileaccess;

Stringstr;

publicvoidinit()throwsFileNotFoundException//界面初始化

{Containercp=getContentPane();

FlowLayoutlayout=newFlowLayout();

cp.setLayout(layout);

cp.add(ta);

cp.add(lb1);cp.add(tf1);

cp.add(lb2);cp.add(tf2);cp.add(lb3);cp.add(tf3);

cp.add(bt);

bt.addActionListener(this);//為按鈕注冊(cè)監(jiān)聽(tīng)者對(duì)象

ta.setEditable(false);

setSize(250,400);

setVisible(true);

access=newRandomAccessFile("bookinfor.txt","rw");

//創(chuàng)建數(shù)據(jù)流

try{while((str=access.readUTF())!=null)//以UTF-8格式讀取一個(gè)字符串

ta.append(str+"\n");

}catch(IOExceptionex){};

}

publicvoidactionPerformed(ActionEvente)

{Stringstr1=tf1.getText()+""+tf2.getText()+""+tf3.getText()+"\n";

Stringstr2=tf1.getText()+""+tf2.getText()+""+tf3.getText();

ta.append(str1);

tf1.setText("");tf2.setText("");tf3.setText("");

try{longlen=access.length();

access.seek(len);//指針定位到寫數(shù)據(jù)位置

//以UTF-8格式寫入一個(gè)字符串,與readUTF()方法配合可以正確讀出漢字

access.writeUTF(str2);

}catch(IOExceptionex){};

}publicstaticvoidmain(String[]args)throwsException

{Random_BookwFile=newRandom_Book();

wFile.init();

wFile.addWindowListener(newWindo());

//為窗口注冊(cè)監(jiān)聽(tīng)者對(duì)象

}

}classWindoextendsWindowAdapter

{publicvoidwindowClosing(WindowEvente)

{System.exit(0);

}

}

說(shuō)明:利用FileWriter類也可以完成數(shù)據(jù)的追加,請(qǐng)讀者自己嘗試。標(biāo)準(zhǔn)I/O參考了Unix中“程序所使用的單一信息流”概念,而Windows等其他操作系統(tǒng)通過(guò)不同的方式實(shí)現(xiàn)了同樣的概念。程序的所有輸入都可以來(lái)自于標(biāo)準(zhǔn)輸入,它的所有輸出也都可以發(fā)送到標(biāo)準(zhǔn)輸出,以及所有的錯(cuò)誤信息都可以發(fā)送到標(biāo)準(zhǔn)錯(cuò)誤。標(biāo)準(zhǔn)I/O的意義在于:一個(gè)程序的標(biāo)準(zhǔn)輸出可以成為另一程序的標(biāo)準(zhǔn)輸入。9.4標(biāo)準(zhǔn)I/O按照標(biāo)準(zhǔn)I/O模型,Java提供了System.in、System.out和System.err。其中:System.in作為標(biāo)準(zhǔn)輸入,System.out作為標(biāo)準(zhǔn)輸出,System.err作為標(biāo)準(zhǔn)錯(cuò)誤。Java通過(guò)系統(tǒng)類System實(shí)現(xiàn)了標(biāo)準(zhǔn)輸入/輸出的功能,它包含在java.lang包中,繼承關(guān)系如下:同時(shí),System類被聲明為一個(gè)final類,定義如下:publicfinalclassSystemextendsObjectSystem類的成員定義如表9-28所示。表9-28System類成員可以看出,System.out和System.err已被包裝成了PrintStream對(duì)象,而System.in是一個(gè)沒(méi)有被包裝過(guò)的、未經(jīng)加工的InputStream流對(duì)象。9.4.1從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)

通過(guò)以下程序,來(lái)了解怎樣通過(guò)System.in成員從鍵盤讀取數(shù)據(jù)。

【例9-15】從鍵盤讀取數(shù)據(jù)。

importjava.io.*;

publicclassReadIn_1

{publicstaticvoidmain(String[]args)

{byteb[]=newbyte[512];

//定義一個(gè)字節(jié)數(shù)組,用來(lái)存放鍵盤數(shù)據(jù)

intx;

try

{System.out.println("inputdata:");intcount=System.in.read(b);

//從鍵盤輸入數(shù)據(jù),直到回車結(jié)束,返回讀到的字節(jié)數(shù)

Stringstr=newString(b);

//將字節(jié)數(shù)組b構(gòu)造成一個(gè)字符串

str=str.substring(0,count-2);

//得到有效數(shù)據(jù),去掉“回車換行”兩個(gè)字符

System.out.println("recievedthedata:");

System.out.println(str);

}

catch(Exceptione){};

}

}

運(yùn)行結(jié)果如圖9-35所示。圖9-35從鍵盤讀取數(shù)據(jù)并顯示

System.in通過(guò)InputStream類的read()方法從鍵盤按字節(jié)讀取數(shù)據(jù),并將讀到的字節(jié)值依次存放到字節(jié)數(shù)組中,直到遇到回車結(jié)束。

從鍵盤讀取數(shù)據(jù)之前,往往要對(duì)System.in進(jìn)行包裝,即將System.in構(gòu)造成Input

StreamReader流。

InputStreamReader流的繼承關(guān)系如下:InputStreamReader流的構(gòu)造方法見(jiàn)表9-29,類方法見(jiàn)表9-30。表9-29InputStreamReader類的構(gòu)造方法表9-30InputStreamReader類的方法

【例9-16】將System.in構(gòu)造成InputStreamReader流。

importjava.io.*;

publicclassReadIn_2

{publicstaticvoidmain(String[]args)

{intx;

try

{//將鍵盤輸入構(gòu)造成一個(gè)InputStreamReader流InputStreamReaderin=newInputStreamReader(System.in);

System.out.println(“inputdata:”);

while((x=in.read())!=-1)

System.out.print((char)x);

}

catch(Exceptione){};

}

}

注意:在用戶輸入文本并按回車鍵后,回顯的行才出現(xiàn)。運(yùn)行結(jié)果見(jiàn)圖9-36。圖9-36從鍵盤讀取數(shù)據(jù)并回顯上例中是逐個(gè)讀取數(shù)據(jù)的,通常我們會(huì)用readLine()一次一行地讀取輸入,因此會(huì)將System.in包裝成BufferedReader來(lái)使用。通過(guò)對(duì)BufferedReader類構(gòu)造方法的分析,需要事先用InputStreamReader把System.in轉(zhuǎn)換成Reader。

【例9-17】將System.in構(gòu)造成BufferedReader流。importjava.io.*;

publicclassReadIn_3

{publicstaticvoidmain(String[]args)throwsIOException

{Stringstr1,str2;

InputStreamReadersin=newInputStreamReader(System.in);

//將System.in包裝成字符流

BufferedReaderin=newBufferedReader(sin);

//將System.in包裝成BufferedReader流

System.out.println(“Inputthefirststring:”);

str1=in.readLine();

//從鍵盤讀取一個(gè)字符串System.out.println(“InputtheSecondstring:”);

str2=in.readLine();

if(str1.length()==str2.length())

//字符串長(zhǎng)度比較

System.out.println("Theyhavethesamelength!");

else

System.out.println("Theyhavedifferentlength!");

}

}

運(yùn)行結(jié)果見(jiàn)圖9-37。圖9-37比較輸入字符串的長(zhǎng)度9.4.2向標(biāo)準(zhǔn)輸出寫入數(shù)據(jù)

System.out用于將數(shù)據(jù)在顯示器上打印出來(lái),它是一個(gè)PrintStream,即字節(jié)輸出流。而PrintWriter的構(gòu)造方法中提供了將OutputStream參數(shù)指定的字節(jié)流用于字符流處理的功能,因此,只要把System.out轉(zhuǎn)換成PrintWriter對(duì)象使用,就可以調(diào)用PrintWriter類的方法了。

【例9-18】將System.out構(gòu)造成PrintWriter流。importjava.io.*;

publicclassWriteOut

{publicstaticvoidmain(String[]args)

{PrintWriterout=newPrintWriter(System.out,true);

out.println(“Welcome:”);

out.println(“將System.out轉(zhuǎn)換成PrintWriter對(duì)象的用法!”);

}

}

在創(chuàng)建對(duì)象時(shí),使用了兩個(gè)參數(shù)的構(gòu)造方法,并將第二個(gè)參數(shù)設(shè)為true,以便開(kāi)啟自動(dòng)清空功能否則就不會(huì)輸出。運(yùn)行結(jié)果見(jiàn)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論