07输入输出流.ppt
Java程序设计赵志崑 山东财政学院计算机信息工程学院JDK帮助文档使用编写Java程序时,许多功能都是调用JDK提供的类库中的类来实现。JDK提供帮助文档(Java API Docs)介绍了这些类如何使用,是学习和使用Java语言中最经常使用的参考资料。帮助文档可以从Sun的Java网站下载,为英文版。Java SE 5.0的全部API文档已经中文汉化,可以通过Sun 中国技术社区的网站在线浏览相关文档,也可以将全部文档下载到本地以方便检索和使用(http:/ java.util.*;Random rand=new Random();/创建一个随机数发生器对象int j=rand.nextInt(100);/产生一个0-99之间的整数boolean b=rand.nextBoolean();/产生true或false原理说明:求伪随机数利用了数学中的混沌函数。以Random对象构造时的系统时钟值作为初值。因此,若两个Random对象在同一时钟值(毫秒)创建,将产生相同的随机数序列。流流:Java中文件以流(Stream)的方式读写。一个流是字节的源或目的。流是比文件更高的抽象。流文件读写网络传输键盘输入屏幕输出共同特点:都是一串字节序列。流的分类根据数据流向输入流:数据从程序外部流向程序内部,如读文件、网络接收数据、键盘输入。输出流:数据从程序内部流向程序外部,如写文件、网络发送数据、屏幕输出。根据流的入口和出口节点流:只有入口或只有出口,本身可以从一个特定的地方读写的流,例如磁盘或者一块内存。过滤器流:同时有入口和出口,即用一个到已存在的输入流的连接创建的。当试图从过滤输入流对象读数据时,它提供来自另一个输入流对象的字符。标准输入输出System类管理标准输入输出流和错误流 System.out:把输出送到缺省的显示(通常是显示器)。System.in:从标准输入获取输入(通常是键盘)。System.err:把错误信息送到缺省的显示。每当main方法被执行时,就自动生成上述三个对象,所以我们能够直接使用。从键盘读入一个字符串:InputStreamReader ins=new InputStreamReader(System.in);BufferedReader br=new BufferedReader(ins);String str=br.readLine();/ins和br都是过滤器输入流。System.ininsbr输入输出流的基类Java中每一种字节流的基本功能都依赖于基本类InputStream和OutputStream。InputStream和OutputStream是抽象类,不能直接使用。其他字节流类都是这两个类的子类。Unicode流的基本功能依赖于Reader和Writer。这些流用于处理双字节的Unicode字符,而不是单字节字符。Reader和Writer是抽象类,不能直接使用。其他Unicode流类都是这两个类的子类。Java从这四个抽象类派生出了许多具体类,约有60多个。之所以提供这么多类,Java类库的设计者声称是用强制的方法减少编程错误。这些类全部定义在java.io包中,所以使用时要声明:import java.io.*;InputStream类的主要子类InputStreamByteArrayInputStreamFileInputStreamPipedInputStreamFilterInputStreamSequenceInputStreamStringBufferInputStreamObjectInputStreamBufferedInputStreamCheckedInputStreamDigestInputStreamInflaterInputStreamLineNumberInputStreamPushbackInputStreamDataInputStreamGZIPInputStreamZipInputStreamJarInputStreamDataInputDataOutputRandomAccessFileObjectInputOutputStream类的主要子类OutputStreamByteArrayOutputStreamFileOutputStreamFilterOutputStreamPipedOutputStreamObjectOutputStreamBufferedOutputStreamCheckedOutputStreamDigestOutputStreamDeflaterOutputStreamPrintStreamDataOutputStreamGZIPOutputStreamZipOutputStreamJarOutputStreamDataOutputObjectOutputReader类的主要子类ReaderBufferedReaderCharArrayReaderPipedReaderFilterReaderInputStreamReaderStringReaderLineNumberReaderPushbackReaderFileReaderWriter类的主要子类WriterBufferedWriterCharArrayWriterPipedWriterFilterWriterOutputStreamWriterStringWriterPushbackWriterFileWriterInputStream类的方法三个基本的从流中读数据的方法.int read():读一个字节。int read(byte b):读多个字节到数组b中。int read(byte b,int off,int len):读多个字节到数组b中从off开始长度为len的位置。其它的方法:long skip(long n):跳过流中若干字节数。int available():返回流中可用字节数。void mark(int readlimit):在流中标记一个位置。void reset():返回到标记过的位置。boolean markSupport():是否支持标记和复位操作。void close():关闭流。Reader类的方法与InputStream类似。OutputStream类的方法三个基本的向流中写数据的方法:abstract void write(int b):将一个字节输出到流中。void write(byte b):将数组中的数据输出到流中。void write(byte b,int off,int len):将数组b中从off开始len长度的数据输出到流中。其它方法:void flush():将缓冲区中的数据强制送出。void close():关闭流。Writer类的方法与OutputStream类似。PrintStream类的方法两个常用的打印方法:void print():对于各种输入参数类型都有对应的重载函数,所以能输出各种形式的数据。如:print(String s);print(char c);void println():类似于print方法,但在输出的最后自动换行。两个基本的写方法:void write(byte buf,int off,int len):写入多个字节。void write(int b):写入一个字节。其他的方法有:void close():关闭流。void flush():将缓冲区中的数据强制送出。读文件读文件要定义一个FileInputStream类型的输入流。import java.io.*;public class FileInputpublic static void main(String args)throws IOException/异常FileInputStream in=new FileInputStream(“FileInput.java”);/创建流int length=in.available();/获得流中字节数(文件长度)char c;for(int i=0;i length;i+)c=(char)in.read();/读取一个字符System.out.print(c);in.close();/关闭流FileInputStreamFile写文件写文件要定义一个FileOutputStream类型的输出流。import java.io.*;public class FileOutputpublic static void main(String args)throws IOException/异常FileOutputStream out=new FileOutputStream(“abc.txt”);/创建流for(int i=a;i=z;i+)out.write(i);/写入一个字节out.close();/关闭流FileOutputStreamFile缓冲区读写文件时增加缓冲区有以下好处:减少访问硬盘的次数,提高读写效率。file1.txtfile2.txtFileInputStream输入缓冲区输入缓冲区输出缓冲区输出缓冲区读取读取处理处理写入写入BufferedInputStreamBufferedOutputStreamFileOutputStreamfile1.txtfile2.txtFileInputStream读取读取处理处理写入写入FileOutputStream不使用缓冲区不使用缓冲区使用缓冲区使用缓冲区带缓冲区读文件读文件要定义一个FileInputStream类型的输入流。import java.io.*;public class FileInput public static void main(String args)throws IOExceptionFileInputStream in=new FileInputStream(FileInput.java);BufferedInputStream bufIn=new BufferedInputStream(in);int length=bufIn.available();char c;for(int i=0;i length;i+)c=(char)bufIn.read();System.out.print(c);bufIn.close();in.close();FileInputStreamFileBufferedInputStream带缓冲区写文件写文件要定义一个FileOutputStream类型的输出流。import java.io.*;public class FileOutputpublic static void main(String args)throws IOExceptionFileOutputStream out=new FileOutputStream(abc.txt);BufferedOutputStream bufOut=new BufferedOutputStream(out);for(int i=a;i 0)/检查是否是空行studentscount=line;count+;if(count=100)break;/检查是否存储得下line=in.readLine();in.close();fin.close();说明:当文件中行数大于100时,后面的会忽略不计。若文件中出现空行,不影响程序运行。必须在函数声明处加入“throw Exception”将异常全部交给虚拟机处理随机选出10个学生依靠随机数类选出10个学生int selectedCount=10;Random rand=new Random();for(int i=0;i selectedCount;i+)int j=rand.nextInt(count);/从学生中随机挑选一个line=studentsj;/选出的学生System.out.println(line);/打印输出studentsj=studentscount-1;/将该学生去除count-;/总人数减1说明:每次选出的10名学生中不能有重复的,所以学生选出后要从名单中去除。结果存入文件结果保存到文件selected.txt中。FileWriter fout=new FileWriter(Selected.txt);BufferedWriter out=new BufferedWriter(fout);for(int i=0;i selectedCount;i+)int j=rand.nextInt(count);line=studentsj;System.out.println(line);out.write(line,0,line.length();out.newLine();studentsj=studentscount-1;count-;out.close();fout.close();说明:此处将随机选出的学生直接保存到文件中,省去了选出学生缓冲区。必须在函数声明处加入“throw Exception”将异常全部交给虚拟机处理抽奖器总结与说明根据需求决定程序设计方案。三个关键点数组随机数产生输入输出程序中有IO操作,所以要进行异常处理,即在main方法声明时说明异常的处理方法:public static void main(String args)throws IOException问题:用数组能否解决100人限制的问题?改进1数据格式化问题:对输入的字符串没有进行分析,所以很多操作无法进行,如按姓名排序、按班级抽取等;解决方法:读入数据时,对各字段进行解析,各字段分别存放;输出时再将这些字段组合成字符串。Student类为了保存格式化的数据定义Student类:class Student private String id;/学号private String name;/姓名private String department;/学院public void parseStudent(String str)/字符串解析public String toString()/生成字符串数据保存在Student类型的对象数组中:Student students=new Student100;数据读入时格式化:Studentstudent=new Student();student.parseStudent(line);studentscount=student;count+;数据输出:line=studentsj.toString();设计parseStudent方法主要使用了字符串处理中的切词类StringTokenizer,该类提供的方法可以根据空格符将字符串分切成多个词。public void parseStudent(String str)int tokenCount;StringTokenizer t=new StringTokenizer(str);tokenCount=t.countTokens();id=t.nextToken();/学号name=t.nextToken();/姓名department=t.nextToken();/班级设计toString方法主要输出三个字段:学号、姓名和班级。学号的长度都一致。姓名的长度不一致,有两个字有三个字,会对后面的班级字段的起始位置产生影响。因此,加入姓名后,采用了一条对齐语句。public String toString()String s=id+name;for(int l=s.length();l 0)selectedCount=Integer.parseInt(args0);文件读写作业文本文件读写将students.txt中数据全部读入内存数组;可选步骤:对格式不统一的数据进行格式化处理;将学生按照姓名排序,并将结果保存到文件ordered.txt中;将本班的学生全部选出,保存到文件class.txt中。students.txt文件从文件交换处下载。