2020/6/19第九章JavaI/0系统︳Java程序设计luqiang@hfut.edu.cn系统本章学习提示本章我们主要学习Java语言的输入输出处理的机制基本流的使用字符流的使用字节流的使用文件的访问LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage3/38Chapter09JavaI/O系统目录JavaI/O流概述1文件处理54字节流基本流2字符流3LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage4/38Chapter09JavaI/O系统常用软件LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage5/38Chapter09JavaI/O系统输入输出类库输入和输出是程序与用户之间沟通的桥梁,程序与用户进行信息交互的重要手段。Java提供了专用于输入输出功能的包java.io,其中包含5个非常重要的类,所有与输入输出有关的类都继承了这5个类。基本流System.outSystem.in字符流ReaderWriter字节流InputStreamOutputStream文件流FileInputStreamFileOutputStream过滤流FilterInputStreamFilterOutputStreamJava的输入输出是以流(stream)的方式进行处理的。流是在计算机的输入、输出操作中流动的数据序列。Java按流的单位分有位流(字节流)和字符流;按流动方向分为输入流和输出流。LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage6/38Chapter09JavaI/O系统输入流示意图输出流示意图LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage7/38Chapter09JavaI/O系统I/O流的分类按所读写的数据类型分两类:字符流类(CharacterStreams)字符流类用于向字符流读写16位二进制字符。字节流类(ByteStreams)字节流类用于向字节流读写8位二进制的字节。一般地,字节流类主要用于读写诸如图象或声音等的二进制数据。LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage8/38Chapter09JavaI/O系统目录JavaI/O流概述1文件处理54字节流基本流2字符流3LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage9/38Chapter09JavaI/O系统基本流为了减少程序开发人员,因频繁应用标准的输入输出设备,需要频繁地建立输入输出流对象的工作量,java系统预先定义好3个流对象,分别表示标准输出设备、标准输入设备和标准错误设备。他们分别是:System.in:用于程序的输入;对应外设为键盘System.out:用于一般输出;对应外设为屏幕System.err:用于显示出错信息;对应外设为屏幕System类的所有属性都是静态static的,调用时以类名System为前缀。上述3个流对象均为静态属性。Page10/38LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationChapter09JavaI/O系统基本I/O之例1.//从键盘输入字符,然后在屏幕上显示输入结果2.importjava.io.*;3.publicclassstandardIO{4.publicstaticvoidmain(String[]args)throwsIOException{5.//IO操作必须捕获IO异常6.charc;7.System.out.println(输入任一字符);8.c=(char)System.in.read();9.System.out.println(输入的字符是:+c);10.}11.}Page11/38LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationChapter09JavaI/O系统基本IO之例1.//基本IOstandardIO2.java,从命令行读入字符串,并处理和显示2.importjava.io.*;3.publicclassstandardIO{4.publicstaticvoidmain(String[]args)throwsIOException{5.//IO操作必须捕获IO异常6.//先使用System.in构造InputStreamReader,再构造BufferedReader。7.InputStreamReaderiin=newInputStreamReader(System.in);8.BufferedReaderstdin=newBufferedReader(iin);9.//读取并输出字符串。10.System.out.print(Enterastring:);11.System.out.println(stdin.readLine());12.//读取字符串并转换成double类型数据输出13.System.out.print(Enteradouble:);14.//将字符串解析为带符号的double类型数据。15.doublenumber2=Double.parseDouble(stdin.readLine());16.System.out.println(number2);17.}18.}LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage12/38Chapter09JavaI/O系统目录JavaI/O流概述1文件处理54字节流基本流2字符流3LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage13/38Chapter09JavaI/O系统Unicode字符流I/O类层次关系图BufferedReaderReaderCharArrayReaderFilterReaderInputStreamReaderPipedReaderStringReaderPushbackReaderLineNumberReaderFileReaderCharArrayWriterWriterFilterWriterOutputStreamWriterBufferedWriterPipedWriterObjectPrintWriterStringWriterFileWriterLuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage14/38Chapter09JavaI/O系统Reader类用来以字符方式从流中读入数据。Reader类中包含了一套所有字符输入流都需要的方法,可以完成最基本的从字符输入流读取数据的功能。Reader是一个抽象类,所以实际应用中创建的对象是Reader某个子类的对象,通过该子类对象与外接数据源连接。子类必须实现的方法只有intread(char[]b,intoffset,intlength)voidclose()当输入流使用完毕后,可以调用该方法将其关闭,断开java程序与外设数据源的联系,释放此连接所占用的系统资源LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage15/38Chapter09JavaI/O系统Reader常用子类BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取可以指定缓冲区的大小InputStreamReader字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符。每次调用InputStreamReader的read()方法都会导致从底层输入流读取一个或多个字节。FileReader用来读取字符文件的类用于读取字符流详细内容见软件包java.io的Reader类LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage16/38Chapter09JavaI/O系统Writer类用来以字符方式向输出流中写入数据。Writer类中包含了一套所有字符输出流都需要的方法,可以完成最基本的向字符输出流写入数据的功能。Writer是一个抽象类,所以实际应用中创建的对象是Writer某个子类的对象,通过该子类对象与外接数据源连接。子类必须实现的方法仅有voidwrite(char[]b,intoffset,intlength)voidclose()voidflush()//强制清空缓冲区当输入流使用完毕后,关闭输出流,断开java程序与外设数据源的连接,释放所占有的系统资源LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationPage17/38Chapter09JavaI/O系统Writer常用子类BufferedWriter将文本写入字符输出流,缓冲各个字符可以指定缓冲区的大小OutputStreamWriter字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节每次调用write()方法都会导致在给定字符(或字符集)上调用编码转换器FileWriter用来写入字符文件的类文件是否可用或是否可以被创建取决于底层平台PrintWriter向文本输出流打印对象的格式化表示形式详细内容见软件包java.io的Writer类Page18/38LuQiang,2009HefeiUniversityofTechnology,SchoolofComputerandInformationChapter09JavaI/O系统字符流之例1.//输入字符串、浮点数、整数在屏幕上显示输入结果2.importjava.io.*;3.publicclassstandardIO3{4.publicstaticvoidmain(String[]args)throwsIOException{5.InputStreamReaderiin=newInputStreamReader(System.in);6.BufferedReaderbin=newBufferedReader(iin);7.Strings;8.floatf;9.inti=0;10.System.out.println(输入任一字符串);11.s=bin.readLine();12.System.out.println(输入浮点数);13.f=Float.pa