版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《尊重他人是我的需要》課件
- 2024屆江蘇省興化市高三上學(xué)期期末考試歷史試題(解析版)
- 單位管理制度集粹匯編職工管理篇十篇
- 單位管理制度匯編大合集員工管理篇十篇
- 單位管理制度分享匯編【人員管理篇】
- 單位管理制度呈現(xiàn)合集【人員管理篇】
- 2017-2021年安徽專升本考試英語(yǔ)真題卷
- 《雨點(diǎn)兒》教案(15篇)
- 《行政職業(yè)能力測(cè)驗(yàn)》陜西省咸陽(yáng)市禮泉縣2023年公務(wù)員考試深度預(yù)測(cè)試卷含解析
- 《電工復(fù)習(xí)題》課件
- 代理記賬機(jī)構(gòu)自查報(bào)告范文
- 博士畢業(yè)鑒定表的自我鑒定5篇
- 項(xiàng)目貸款保證函書
- 新編英語(yǔ)語(yǔ)法教程第6講.課件
- 月下獨(dú)酌(其一)李白
- 七年級(jí)上冊(cè)數(shù)學(xué)壓軸題幾何試卷(帶答案)
- 網(wǎng)絡(luò)安全保密教育知識(shí)普及培訓(xùn)課件
- 小學(xué)語(yǔ)文-部編版四年級(jí)語(yǔ)文上冊(cè)第六單元習(xí)作:記一次游戲教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 面向5G網(wǎng)絡(luò)建設(shè)的站點(diǎn)供電技術(shù)應(yīng)用與發(fā)展
- 裝飾公司與項(xiàng)目經(jīng)理合作協(xié)議
- 接待上級(jí)領(lǐng)導(dǎo)工作總結(jié)
評(píng)論
0/150
提交評(píng)論