深圳大学实验报告课程名称:Java实验序号:上机实践9实验名称:统计英文单词&读取Zip文件班级:计算机3姓名:卢志敏同组人:实验日期:2008年12月29日教师签字:一、实验目的掌握RandomAccessFile类的使用。掌握ZipInputStream流的使用。二、实验环境JDK1.5WinXpSP3三、实验要求实验1使用RandomAccessFile流统计一篇英文中的单词,要求如下:(1)一共出现了多少个英文单词。(2)有多少个互不相同的单词。(3)给出每个单词出现的频率,并将这些单词按频率大小顺序显示在一个Text--Area中。实验2读取book.zip,并将book.zip中含有的文件重新存放到当前目录中的book文件夹中,即将book.zip的内容解压到book文件夹中。四、实验步骤和内容实验1源代码:WordStatistic.javaimportjava.io.*;importjava.util.Vector;publicclassWordStatistic{VectorallWords,noSameWord;WordStatistic(){allWords=newVector();noSameWord=newVector();}publicvoidwordStatistic(Filefile){try{RandomAccessFileinOne=newRandomAccessFile(file,rw);//创建指向文件file的inOne的对象RandomAccessFileinTwo=newRandomAccessFile(file,rw);//创建指向文件file的inTwo的对象longwordStarPostion=0,wordEndPostion=0;longlength=inOne.length();intflag=1;intc=-1;for(intk=0;k=length;k++){c=inOne.read();//inOne调用read()方法booleanboo=(c='Z'&&c='A')||(c='z'&&c='a');if(boo){if(flag==1){wordStarPostion=inOne.getFilePointer()-1;flag=0;}}else{if(flag==0){if(c==-1)wordEndPostion=inOne.getFilePointer();elsewordEndPostion=inOne.getFilePointer()-1;inTwo.seek(wordStarPostion);//inTwo调用seek方法将读写位置移动到wordStarPostionBytecc[]=newbyte[(int)wordEndPostion-(int)wordStarPostion];inTwo.readFully(cc);//inTwo调用readFully方法Stringword=newString(cc);allWords.add(word);if(!noSameWord.contains(word))noSameWord.add(word);}flag=1;}}inOne.close();inTwo.close();}catch(Exceptione){}}publicVectorgetAllWords(){returnallWords;}publicVectorgetNoSameWord(){returnnoSameWord;}}StatisticFrame.javaimportjava.awt.*;importjava.awt.event.*;importjava.util.Vector;importjava.io.File;publicclassStatisticFrameextendsFrameimplementsActionListener{WordStatisticstatistic;TextAreashowMessage;ButtonopenFile;FileDialogopenFileDialog;VectorallWord,noSameWord;publicStatisticFrame(){statistic=newWordStatistic();showMessage=newTextArea();openFile=newButton(OpenFile);openFile.addActionListener(this);add(openFile,BorderLayout.NORTH);add(showMessage,BorderLayout.CENTER);openFileDialog=newFileDialog(this,打开文件对话框,FileDialog.LOAD);allWord=newVector();noSameWord=newVector();setSize(350,300);setVisible(true);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});validate();}publicvoidactionPerformed(ActionEvente){noSameWord.clear();allWord.clear();showMessage.setText(null);openFileDialog.setVisible(true);StringfileName=openFileDialog.getFile();if(fileName!=null){statistic.wordStatistic(newFile(fileName));allWord=statistic.getAllWords();noSameWord=statistic.getNoSameWord();showMessage.append(\n+fileName+中有+allWord.size()+个英文单词);showMessage.append(\n其中有+noSameWord.size()+个互不相同的英文单词);showMessage.append(\n按使用频率排列:\n);intcount[]=newint[noSameWord.size()];for(inti=0;inoSameWord.size();i++){Strings1=(String)noSameWord.elementAt(i);for(intj=0;jallWord.size();j++){Strings2=(String)allWord.elementAt(j);if(s1.equals(s2))count[i]++;}}for(intm=0;mnoSameWord.size();m++){for(intn=m+1;nnoSameWord.size();n++){if(count[n]count[m]){Stringtemp=(String)noSameWord.elementAt(m);noSameWord.setElementAt((String)noSameWord.elementAt(n),m);noSameWord.setElementAt(temp,n);intt=count[m];count[m]=count[n];count[n]=t;}}}for(intm=0;mnoSameWord.size();m++){showMessage.append(\n+(String)noSameWord.elementAt(m)+:+count[m]+/+allWord.size()+=+(1.0*count[m])/allWord.size());}}}}StatisticMainClass.javapublicclassStatisticMainClass{publicstaticvoidmain(Stringargs[]){newStatisticFrame();}}实验2源代码ReadZipFile.javaimportjava.io.*;importjava.util.zip.*;publicclassReadZipFile{publicstaticvoidmain(String[]args){Filef=newFile(book.zip);Filedir=newFile(Book);byteb[]=newbyte[100];dir.mkdir();try{ZipInputStreamin=newZipInputStream(newFileInputStream(f));ZipEntryzipEntry=null;while((zipEntry=in.getNextEntry())!=null){Filefile=newFile(dir,zipEntry.getName());FileOutputStreamout=newFileOutputStream(file);intn=-1;System.out.println(file.getAbsolutePath()+的内容);while((n=in.read(b,0,100))!=-1){Stringstr=newString(b,0,n);System.out.println(str);out.write(b,0,n);}out.close();}in.close();}catch(IOExceptionee){System.out.println(ee);}}}运行效果截屏:五、实验后的练习在StatisticFrame的showMessage中增加单词按字典序排序输出的信息。解答:在StatisticFrame.java中加入如下代码:VectorsortWord=newVecor(noSameWord);showMessage.append(\n按字典排序:\n);for(inti=0;isortWord.size();i++){if((int)(String)sortWord.elementAt(i).charAt(0)(int)(String)sortWord.elementAt(i+1).charAt(0))//比较相邻两个单词首字母在字母表中的大小顺序{tempStr=(String)sortWord.elementAt(i);sortWord.elementAt(i)=sortWord.elementAt(i+1);sortWord.elementAt(i+1)=tempStr;}//如果前面的大于后面的则对调}for(intk=0;ksortWord.size();k++)showMessage.append(\n+(String)sortWord.elementAt(k));六、心得体会1.RandomAccessFile类中的seek(longa)方法用来移动流的读写位置,getFilePointer()方法可以获取当前流的读写位置。2.Vector()对象可以使用add(Objecto)方法把对象自动添加到向量末尾。3.ZipInputStream流必须指向一个字节流的子类的实例。4.使用ZipInputStream流之前要先使用getNextEntry()方法找到压缩文件中的下一个内容,然后开始读取。