《Java面向对象程序设计》实验实验八输入输出流复习课程.docx
《《Java面向对象程序设计》实验实验八输入输出流复习课程.docx》由会员分享,可在线阅读,更多相关《《Java面向对象程序设计》实验实验八输入输出流复习课程.docx(13页珍藏版)》请在冰豆网上搜索。
《Java面向对象程序设计》实验实验八输入输出流复习课程
《Java面向对象程序设计》实验-实验八(输入输出流)
广西科技大学
计通学院
《Java面向对象程序设计》实验
实验八输入输出流
学生姓名:
×××
学号:
×××
班级:
×××
指导老师:
×××
专业:
计算机科学与技术
提交日期:
×××年××月××日
实验报告内容
1.实验目的
掌握字符输入、输出流用法;
掌握使用Scanner类解析文件;
掌握Console流的使用。
2.实验内容
实验教材-第12章实验1、2、3
字符输入输出流;Scanner类和Console类。
要求:
完善程序,给出实验结果截图;
完成试验后练习。
3.程序代码及运行结果:
实验1举重成绩单
//AnalysisResult.java
importjava.io.*;
importjava.util.*;
publicclassAnalysisResult{
publicstaticvoidmain(String[]args){
FilefRead=newFile("score.txt");
FilefWrite=newFile("scoreAnalysis.txt");
try{
Writerout=newFileWriter(fWrite);
BufferedWriterbufferWrite=newBufferedWriter(out);
Readerin=newFileReader(fRead);
BufferedReaderbufferRead=newBufferedReader(in);
Stringstr=null;
while((str=bufferRead.readLine())!
=null){
doubletotalScore=Fenxi.getTotalScore(str);
str=str+"总成绩:
"+totalScore;
System.out.println(str);
bufferWrite.write(str);
bufferWrite.newLine();
}
bufferRead.close();
bufferWrite.close();
}
catch(IOExceptione){
System.out.println(e.toString());
}
}
}
//Fenxi.java
importjava.util.*;
publicclassFenxi{
publicstaticdoublegetTotalScore(Strings){
Stringregex="[^0123456789.]";
StringdigitMess=s.replaceAll(regex,"*");
StringTokenizerfenxi=newStringTokenizer(digitMess,"*");
doubletotalScore=0;
while(fenxi.hasMoreTokens()){
doublescore=Double.parseDouble(fenxi.nextToken());
totalScore=totalScore+score;
}
returntotalScore;
}
}
//score.txt
姓名:
张三,抓举成绩106kg,挺举189kg。
姓名:
李四,抓举成绩108kg,挺举186kg。
姓名:
周五,抓举成绩112kg,挺举190kg。
运行结果如图1所示
图1
实验2统计英文单词
//WordStatistic.java
importjava.io.*;
importjava.util.*;
publicclassWordStatistic{
VectorallWord,noSameWord;
Filefile=newFile("english.txt");
Scannersc=null;
Stringregex;
WordStatistic(){
allWord=newVector();
noSameWord=newVector();
regex="[\\s\\d\\p{Punct}]+";//正则表达式
try{
sc=newScanner(file);
sc.useDelimiter(regex);
}
catch(IOExceptionexp){
System.out.println(exp.toString());
}
}
voidsetFileName(Stringname){
file=newFile(name);
try{
sc=newScanner(file);
sc.useDelimiter(regex);
}
catch(IOExceptionexp){
System.out.println(exp.toString());
}
}
voidWordStatistic(){
try{
while(sc.hasNext()){
Stringword=sc.next();
allWord.add(word);
if(!
noSameWord.contains(word))
noSameWord.add(word);
}
}
catch(Exceptione){}
}
publicVectorgetAllWord(){
returnallWord;
}
publicVectorgetNoSameWord(){
returnnoSameWord;
}
}
//OutputWordMess.java
importjava.util.*;
publicclassOutputWordMess{
publicstaticvoidmain(String[]args){
VectorallWord,noSameWord;
WordStatisticstatistic=newWordStatistic();
statistic.setFileName("hello.txt");
statistic.WordStatistic();
allWord=statistic.getAllWord();
noSameWord=statistic.getNoSameWord();
System.out.println("共有"+allWord.size()+"个英文单词");
System.out.println("有"+noSameWord.size()+"个互不相同英文单词");
System.out.println("按出现的频率排列:
");
intcount[]=newint[noSameWord.size()];
for(inti=0;iStrings1=noSameWord.elementAt(i);
for(intj=0;jStrings2=allWord.elementAt(j);
if(s1.equals(s2))
count[i]++;
}
}
for(intm=0;mfor(intn=m+1;nif(count[n]>count[m]){
Stringtemp=noSameWord.elementAt(m);
noSameWord.setElementAt(noSameWord.elementAt(n),m);
noSameWord.setElementAt(temp,n);
intt=count[m];
count[m]=count[n];
count[n]=t;
}
}
}
for(intm=0;mdoublefrequency=(1.0*count[m])/allWord.size();
System.out.printf("%s:
%-7.3f",noSameWord.elementAt(m),frequency);
}
}
}
运行结果如图2所示
图2
实验3密码流
//PassWord.java
importjava.io.*;
publicclassPassWord{
publicstaticvoidmain(String[]args){
booleansuccess=false;
intcount=0;
Consolecons;
char[]passwd;
cons=System.console();
while(true){
System.out.print("输入密码:
");
passwd=cons.readPassword();
count++;
Stringpassword=newString(passwd);
if(password.equals("tiger123")){
success=true;
System.out.println("您第"+count+"次输入的密码正确!
");
break;
}else{
System.out.println("您第"+count+"次输入的密码"+password+"不正确!
");
}if(count==3){
System.out.println("您"+count+"次输入的密码都不正确!
");
System.exit(0);
}
}
if(success){
Filefile=newFile("score1.txt");
try{
FileReaderinOne=newFileReader(file);
BufferedReaderinTow=newBufferedReader(inOne);
Strings=null;
while((s=inTow.readLine())!
=null){
System.out.println(s);
}
inOne.close();
inTow.close();
}catch(IOExceptionioe){}
}
}
}
//score.txt
姓名:
张三,抓举成绩106kg,挺举189kg。
姓名:
李四,抓举成绩108kg,挺举186kg。
姓名:
周五,抓举成绩112kg,挺举190kg。
运行结果如图3所示
图3
4.实验后的练习:
实验1
有如下格式的成绩单(文本格式)score.txt。
姓名:
张三,数学72分,物理67分,英语70分。
姓名:
李四,数学92分,物理98分,英语88分。
姓名:
周五,数学68分,物理80分,英语77分。
要求按行读入取成绩单,并在该行的后面尾加上该同学的总成绩,然后再将该行写入到一个名字为scoreAnalysis.txt的文件中。
//AnalysisResult.java
importjava.io.*;
importjava.util.*;
publicclassAnalysisResult{
publicstaticvoidmain(String[]args){
FilefRead=newFile("score.txt");
FilefWrite=newFile("scoreAnalysis.txt");
try{
Writerout=newFileWriter(fWrite,true);
BufferedWriterbufferWrite=newBufferedWriter(out);
Readerin=newFileReader(fRead);
BufferedReaderbufferRead=newBufferedReader(in);
Stringstr=null;
while((str=bufferRead.readLine())!
=null){
doubletotalScore=Fenxi.getTotalScore(str);
str=str+"总分:
"+totalScore;
System.out.println(str);
bufferWrite.write(str);
bufferWrite.newLine();
}
bufferRead.close();
bufferWrite.close();
}
catch(IOExceptione){
System.out.println(e.toString());
}
}
}
//Fenxi.java
importjava.util.*;
publicclassFenxi{
publicstaticdoublegetTotalScore(Strings){
Scannerscanner=newScanner(s);
scanner.useDelimiter("[^0123456789.]+");
doubletotalScore=0;
while(scanner.hasNext()){
try{
doublescore=scanner.nextDouble();
totalScore=totalScore+score;
}
catch(InputMismatchExceptionexp){
Stringt=scanner.next();
}
}
returntotalScore;
}
}
//score.txt
姓名:
张三,数学72分,物理67分,英语70分。
姓名:
李四,数学92分,物理98分,英语88分。
姓名:
周五,数学68分,物理80分,英语77分。
运行结果如图4所示
图4
实验2
按字典序输出全部不相同的单词。
//Dictionary.java
importjava.util.*;
publicclassDictionary{
publicstaticvoidmain(Stringargs[]){
VectorallWord,noSameWord;
WordStatisticstatistic=newWordStatistic();
statistic.setFileName("hello.txt");
statistic.WordStatistic();//statistic调用WordStatistic()方法
allWord=statistic.getAllWord();
noSameWord=statistic.getNoSameWord();
System.out.println("共有"+allWord.size()+"个英文单词");
System.out.println("有"+noSameWord.size()+"个互不相同英文单词");
System.out.println("按字典顺序排列:
");
Strings[]=newString[noSameWord.size()];
for(inti=0;is[i]=noSameWord.elementAt(i);
}
Arrays.sort(s);
for(inti=0;iSystem.out.println(s[i]+"");
}
}
}
运行结果如图5所示
图5
实验3
编写一个程序,程序运行时,要求用户输入的密码是:
hello。
如果用户输入了正确的密码。
程序将输出“你好,欢迎你!
”。
程序允许用户2次输入的密码不正确,一旦超过2次,程序将立刻退出。
//PassWord.java
importjava.io.*;
importjava.util.Scanner;
publicclassPassWord{
publicstaticvoidmain(Stringargs[]){
intcount=0;
Consolecons;
Stringpasswd;
Scannersc=newScanner(System.in);//cons=System.console();
while(true){
System.out.print("输入密码:
");
passwd=sc.next();//
count++;
Stringpassword=newString(passwd);
if(password.equals("hello")){
System.out.println("你好,欢迎你!
");
break;
}
else{
System.out.println("您第"+count+"次输入的密"+password+"不正确");
}
if(count==3){
System.out.println("您"+count+"次输入的密码都不正确");
System.exit(0);
}
}
}
}
运行结果如图6所示
图6
5.实验心得和体会
这次实验中,我感觉比较难理解和掌握的就是Console类了,在实验3密码流的代码在eclipse中运行出错如下图所示:
就是输入不了密码,后来通过找寻解决方法,才知道了在JDK6中java.io.Console类专用来访问基于字符的控制台设备,然后使用cmd命令提示符来运行就可以输入密码和显示结果了。
通过这次实验,大概了解了字符输入、输出流用法,如何去使用Scanner类解析文件,对Console类的使用有个大概的认知。
总而言之,这次实验收获蛮大的,敲代码的效率比以往提高了,出错率也少了。