Java程序设计――07输入输出流

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计算机科学与技术学院赵志崑zhaozk@sdufe.edu.cn赵志崑Java程序的输入输出•以一个小应用为例,介绍Java的输入输出机制。小应用需求分析需要实现的功能点Java中的实现方法具体代码总结与扩展赵志崑随机点名器功能:设计开发一个Java程序,每节课可以随机抽取几名同学点名,达到随机点名的目的。数据来源:教务系统提供的学生名单(文本文件)Java程序显示到屏幕保存到文件随机选出10个学生赵志崑程序流程与要点文本文件屏幕打印学生名单(内存)选中名单(内存)随机选择1读文件2存数据3随机选4写文件学生名单选中名单选中名单文本文件随机点名器赵志崑要点一:读文件•Java中文件以流(Stream)的方式读写,将程序的输入输出看作是数据的流动,一个流是一个字节的序列。•流的使用不局限于文件读写,还可用于网络传输、键盘输入、屏幕输出等和程序输入输出有关的一切活动。•根据用途,Java中提供了几十种流,类库中为每一种流提供一个类,用于创建流(对象)。赵志崑读文件流•用于读文本文件内容的流是FileReader,主要方法:–FileReader(Stringfilename):构造函数,创建流。–intread():读一个字节,若读到文件结尾返回-1。–voidclose():关闭流。FileReaderfr=newFileReader(“Students.txt”);intd=fr.read();fr.close();FileReader20-1赵志崑学生数据读入•从文件students.txt中读入学生数据。//Selector.javaimportjava.io.*;publicclassSelector{publicstaticvoidmain(String[]args)throwsException{FileReaderfr=newFileReader(Students.txt);intc=fr.read();while(c!=-1){System.out.print((char)c);c=fr.read();}fr.close();}}•说明:–文件Students.txt必须放在同一个目录下。–必须在主函数声明处加入“throwsException”将异常全部交给虚拟机处理以字符为单位处理数据?赵志崑按行读取•BufferedReader类能实现按行读取的功能,主要方法:–BufferedReader(Readerreader):构造函数,创建流。–StringreadLine():读一行字符,若读到文件结尾返回null。–voidclose():关闭流。BufferedReaderFileReader字符字符串20080854101伦永涛2008计算机科学与技术1BufferedReaderbr=newBufferedReader(fr);Strings=br.readLine();br.close();null赵志崑按行读取数据的代码•按行读取学生数据的代码如下://Selector.javaimportjava.io.*;publicclassSelector{publicstaticvoidmain(String[]args)throwsException{FileReaderfr=newFileReader(Students.txt);BufferedReaderbr=newBufferedReader(fr);Strings=br.readLine();while(s!=null){System.out.println(s);s=br.readLine();}br.close();fr.close();}}BufferedReaderFileReader文件流的嵌套赵志崑要点二:数据存放•从文件读入的数据是一个个字符串,如何在程序中存放?20080854101伦永涛……20080854102王楚尧……20080854103李燕……•用数组来保存批量数据创建一个字符串数组,将读入的数据依次放入用一个整数型变量记录数据个数,并作为空闲位置的指针String[]students=newString[100];intcount=0;students[count]=s;count++;[0][1][2][3][4][…][…][98][99]students0count123赵志崑数据存放的代码•加入数据存放后的代码如下://Selector.javaimportjava.io.*;publicclassSelector{publicstaticvoidmain(String[]args)throwsException{String[]students=newString[100];intcount=0;FileReaderfr=newFileReader(Students.txt);BufferedReaderbr=newBufferedReader(fr);Strings=br.readLine();while(s!=null){students[count]=s;count++;s=br.readLine();}br.close();fr.close();}}赵志崑要点三:随机选取•学生信息存放在数组中,对应下标为0到count-1。•如何从中随机选出1个?(产生一个0到count-1的随机整数)可能会有重复选择?•Java提供Random类来创建随机数对象,方法包括:Random():构造函数,创建随机数对象,初始值为当前时间。nextInt(intn):产生一个0到n之间的随机整数。•要选出几个,就循环调用几次。Randomrand=newRandom();intn=rand.nextInt(count);20080854101伦永涛……20080854102王楚尧……20080854103李燕……[0][1][2][3][4][…][…][98][99]students78count20080854104董风华……20080854105李晶……?nrandRandom的实现利用了混沌函数:Xn+1=f(Xn),Xn+1和Xn之间几乎没有任何规律;X0为对象创建时的系统时钟值(从1970年1月1日0时0分0秒到当前经过的毫秒数)。赵志崑避免重复选择•避免重复选择:将选中过的学生数据从数组中删除20080854101伦永涛……20080854102王楚尧……20080854103李燕……[0][1][2][3][4][…][…][98][99]students79count20080854104董风华……20080854105李晶……[77][78][79][…]20080854239秦露……20080854240王萍……3nrand•用最后一名学生替换选中的学生,总数量减1students[n]=students[count-1];count--;78赵志崑要点四:结果存入文件•将选中学生的名单保存到文件selected.txt中。•向文件中写入字符用的流是FileWriter,相关方法是:FileWriter(Stringfilename):构造函数,创建文件输出流。write(Strings,intstart,intend):将字符串s中第start个字符到第end个字符写入文件。close():关闭流,保证文件内容写入磁盘。FileWriterFileWriterfw=newFileWriter(Selected.txt);fw.write(line,0,line.length());fw.close();要换行,只需要写入一个”\r\n”字符串20080854219徐飞飞2008计算机科学与技术220080854201张慧丽2008计算机科学与技术2赵志崑写文件的代码•将结果写入文件的代码如下:Randomrand=newRandom();intselectCount=10;FileWriterfw=newFileWriter(Selected.txt);for(inti=0;iselectCount;i++){intn=rand.nextInt(count);Stringline=students[n];System.out.println(line);line+=\r\n;fw.write(line,0,line.length());students[n]=students[count-1];count--;}fw.close();赵志崑Java中的流•Java中提供了几十种流,本例中用到了三个:FileReaderBufferedReaderFileWriter•所有流都派生自四个最基本的流:Reader、WriterInputStream、OutputStream赵志崑总结与说明文本文件屏幕打印学生名单(内存)选中名单(内存)随机选择1读文件2存数据3随机选4写文件学生名单选中名单选中名单文本文件随机点名器改进1自动生成文件名改进2配置选出个数改进3分切数据字段赵志崑改进1—自动生成文件名•问题:–生成的文件名始终为selected.txt;–后一次生成的结果会覆盖掉前一次的结果。•解决方法:–为输出文件名编号,第一次结果为no1.txt,第二次为no2.txt,这样就不会覆盖了。–文件编号规则为:•如果不存在no1.txt文件,则结果为no1.txt;•如果不存在no2.txt文件,则结果为no2.txt;•……赵志崑自动生成文件名•自动生成文件名利用了File类–其exists()方法可以判断文件是否存在;–File类的对象可以直接用于创建FileWriter流。intno=0;Fileoutf;do{no++;outf=newFile(No+no+.txt);}while(outf.exists());FileWriterfout=newFileWriter(outf);赵志崑改进2—配置选出人数•问题:–每次固定选出10名学生,过于死板;–如果某次想选出15名学生就需要改源程序,比较麻烦。•解决方法:–使用main函数的参数,即运行时,可以带参数,如javaselector15–大多数情况下都选出10名,所以为方便起见,应该在不提供参数的情况下,默认为选出10名。赵志崑main函数参数的使用•main函数的参数为字符串数组(String[])。•第一个参数下标为0。publicstaticvoidmain(String[]args)throwsIOException……intselectedCount=10;if(args.length0)selectedCount=Integer.parseInt(args[0]);……赵志崑改进3—分切数据字段•问题:–对输入的字符串没有进行分析,所以很多操作无法进行,如按姓名排序、按班级抽取等;•解决方法:–读入数据时,对各字段进行解析,各字段分别存放;–输出时再将这些字段组合成字符串。赵志崑Student类•为了保存格式化的数据定义Student类:classStudent{privateStringid;//学号privateStringname;//姓名privateStringdepartment;//学院publicvoidparseStudent(Stringstr){}//字符串解析publicStringtoString(){}//生成字符串}•数据保存在Student类型的对象数组中:Student[]students=newStudent[100];•数据读入时格式化:Studentstudent=newStudent();student.parseStudent(line);students[count]=student;count++;•数据输出:line=students[j].toString();赵志崑设计parseStudent方法•主要使用了字符串处理中的切词类S

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功