第九章__java_输入输出流.ppt
第九章第九章输入输出流输入输出流输入输出流:输入输出流:lJava的输入输出功能必须借助于输入输出类库的输入输出功能必须借助于输入输出类库Java.io包来实现,这个包中的类大部分是用来完包来实现,这个包中的类大部分是用来完成流式输入输出的流类。成流式输入输出的流类。l在在java中,把能够读取一个字节序列的对象称为中,把能够读取一个字节序列的对象称为一个一个输入流输入流,把能够写一个字节的对象称为一个,把能够写一个字节的对象称为一个输出流输出流。分别由。分别由InputStream和和OutputStream表表示。示。l处理处理Unicode码的字符流,由抽象类码的字符流,由抽象类Reader和和Writer派生。派生。流流是指在计算机的输入与输出之间的数据的序流是指在计算机的输入与输出之间的数据的序列,而列,而Java中的数据流有中的数据流有位流(字节流)位流(字节流)和和字字符流符流之分;之分;就流的运动方向而言,流可分为就流的运动方向而言,流可分为输入流输入流(inputstream)和和输出流输出流(outputstream),),输入流代表从外设流入计算机的数据序列;输输入流代表从外设流入计算机的数据序列;输出流代表从计算机流向外设的数据序列。出流代表从计算机流向外设的数据序列。9.1java.io包简介包简介ljava.io包通过数据流、序列和文件系统为系统包通过数据流、序列和文件系统为系统提供输入输出。提供输入输出。9.2InputStream类类和和 OutputStream类类InputStream类的实现:类的实现:publicabstractclassInputStreamextendsObjectInputStream类的方法类的方法publicintavailable()throwsIOException返回目前输入数据流中已有几个字符准备好被读取了返回目前输入数据流中已有几个字符准备好被读取了publicvoidclose()throwsIOException将这个输入数据流关闭将这个输入数据流关闭publicabstractintread()throwsIOException从输入数据流读取下一个字节并返回返回值的范围从到从输入数据流读取下一个字节并返回返回值的范围从到,但如果已经到达数据流的结尾,没有数据可以读取了,但如果已经到达数据流的结尾,没有数据可以读取了,则会返回抛出异常则会返回抛出异常InputStream类的方法publicintread(byteb)throwsIOException从输入数据流中读取数个字节放进数组从输入数据流中读取数个字节放进数组b中,并返回所读取到的中,并返回所读取到的字符数目,最多可以读取和字符数目,最多可以读取和b长度相同的字符数,但如果没有读取长度相同的字符数,但如果没有读取到则返回到则返回publiclongskip(longn)throwsIOException略过略过n个字节不读取,会返回实际略过的字节数目因为数据流个字节不读取,会返回实际略过的字节数目因为数据流中剩下的数据可能不到中剩下的数据可能不到n个字节那么多,所以此时返回值会小于个字节那么多,所以此时返回值会小于nInputStream类的继承关系InputStreamFileInputStream(文件输入字节)(文件输入字节)FilterInputStreamDataInputStream(格式转换格式转换)BufferedInputStream(缓冲功能)(缓冲功能)LSystem.in是是System的一个静态属性,属于的一个静态属性,属于InputStream类对象,用于输入字节数据流,对应标准输入设备:键盘。类对象,用于输入字节数据流,对应标准输入设备:键盘。Java实例实例标准输入标准输入 import java.io.*;public class StandardIn1 public static void main(String args)throws IOException char c;System.out.println(输入一个字符输入一个字符);c=(char)System.in.read();System.out.print(输入的字符是:输入的字符是:+c);标准输入标准输入System.inOutputStream类 OutputStreamOutputStream类类是所有输出数据流的父类,所以它也被实现成是所有输出数据流的父类,所以它也被实现成抽象类,定义了所有输出数据流都具有的共同特性抽象类,定义了所有输出数据流都具有的共同特性 OutputStreamOutputStream类类的实现:的实现:public abstract class public abstract class OutputStreamOutputStream extends Object extends ObjectOutputStream类的继承关系OutputStreamFileOutputStream(文件输出)文件输出)FilterOutputStreamPrintStream(输出到屏幕)输出到屏幕)DataOutputStream(格式转换)格式转换)BufferedOutputStream(缓冲功能)缓冲功能)OutputStream类的methodpublicvoidclose()throwsIOException关闭与输出数据流的连系关闭与输出数据流的连系publicvoidflush()throwsIOException将写入的数据确实送到接受数据的装置去因为写入的数据通将写入的数据确实送到接受数据的装置去因为写入的数据通常会先放到高速缓存(常会先放到高速缓存(cache)里面,等到数量达到某一程度时,里面,等到数量达到某一程度时,用这个方法将强迫数据写进去用这个方法将强迫数据写进去publicvoidwrite(byteb)throwsIOException将数组将数组b中的数据写入输出数据流中的数据写入输出数据流OutputStream类的methodpublicvoidwrite(byteb,intoff,intlen)throwsIOException将将b数组中从第数组中从第off个字节开始,共写入个字节开始,共写入len个字节到输出数据流个字节到输出数据流publicabstractvoidwrite(intb)throwsIOException写入一个字符到输出数据流这个写入一个字符到输出数据流这个method只会将只会将b的个低位写入,的个低位写入,将将24个高位忽略掉个高位忽略掉标准输出标准输出System.outlSystem.out是它的一个静态属性,属于是它的一个静态属性,属于PrintStream类对象,用于输出字节数据流,对应类对象,用于输出字节数据流,对应标准输出设备:屏幕。标准输出设备:屏幕。9.3File类类lFile类指的是磁盘上的目录或文件类指的是磁盘上的目录或文件.“”表示分隔符。例表示分隔符。例如:如:D:myjavaHello.java文件类的主要方法:文件类的主要方法:public File(File parent,String child):建建立立一一个个以以parent加加上上child为路径的为路径的File组件。组件。public File(String pathname):建建立立一一个个以以pathname为为路路径径的的File组件组件 public String getName():得到文件的名字:得到文件的名字public String getPath():得到文件的路径名:得到文件的路径名public String getParent():得到文件的上级路径名:得到文件的上级路径名public boolean exists():判断文件或目录是否存在:判断文件或目录是否存在public long length():返回文件的字节数:返回文件的字节数 public boolean createNewFile()throws IOException:以:以File组件的内容为文件名建立一个新文件,如果原文件已存在,组件的内容为文件名建立一个新文件,如果原文件已存在,返回返回false,如果建立成功,则返回,如果建立成功,则返回true.public void delete():删除文件:删除文件 Java实例实例limport java.awt.*;limport java.io.*;lpublic class FileTest lpublic static void main(String args)lFile f=new File(D:,c.txt);ltryl boolean b=f.createNewFile();l System.out.println(f.getPath();l System.out.println(f.getParent();l System.out.println(f.getName();l System.out.println(b);l lcatch(Exception e)l l9.4RandomAccessFile类类lRandomAccessFile流由于实现了流由于实现了DataInput和和DataOutput两个接口,所以既可以用来处理文件的输入,又可以处理两个接口,所以既可以用来处理文件的输入,又可以处理文件的输出。文件的输出。l主要方法:主要方法:l public RandomAccessFile(String name,String mode)构造构造RandomAccessFile流对文件进行读写。流对文件进行读写。name为文件名,为文件名,mode为读写模式,包括为读写模式,包括r(只读只读)rw(可读写可读写).lpublic RandomAccessFile(File name,String mode)构造构造RandomAccessFile流对文件对象进行读写。流对文件对象进行读写。name为文件为文件名,名,mode为读写模式,包括为读写模式,包括r(只读只读)rw(可读写可读写).lclose()关闭关闭RandomAccessFile流,并释放资源。流,并释放资源。lgetFilePointer()返回文件指针位置。返回文件指针位置。l length()返回文件长度返回文件长度l read()从文件中读取一个字节的数据从文件中读取一个字节的数据l readInt()从文件中读取一个从文件中读取一个int值(值(4个字节)个字节)l readLine()读取一行读取一行l seek(long pos)定位参数)定位参数pos在文件中指定的位置在文件中指定的位置skipBytes():在文件中跳过指定数量的字节,数量由:在文件中跳过指定数量的字节,数量由n指定。指定。writeChars(String s):向文件写入一个作为字符数据的字符:向文件写入一个作为字符数据的字符串。串。writeInt():向文件写入一个向文件写入一个int型数据。型数据。Java实例:实例:l将一组数据写入到名为将一组数据写入到名为test.dat的文件中,然后再按相反顺的文件中,然后再按相反顺序读出这些数据。序读出这些数据。limport java.io.*;lpublic class Io l public static void main(String args)l RandomAccessFile test=null;l int data=100,101,102,103,104,105;l tryl test=new RandomAccessFile(test.dat,rw);l l catch(Exception e)l tryl for(int i=0;i=0;i=i-4)l test.seek(i);l System.out.println(test.readInt();l l test.close();l l catch(Exception e)l lReader类Reader子类的继承关系子类的继承关系 ReaderBufferedReader(缓冲功能的字符输入类)缓冲功能的字符输入类)InputStreamReader(输入字节转换为字符)输入字节转换为字符)FileReader(从文件读入字符)从文件读入字符)Reader类的methodpublicabstractvoidclose()throwsIOException关闭数据流关闭数据流publicintread()throwsIOException从输入数据流读取下一个字节并返回返回值的范围从到从输入数据流读取下一个字节并返回返回值的范围从到,但如果已经到达数据流的结尾,没有数据可以读取了,则,但如果已经到达数据流的结尾,没有数据可以读取了,则会返回会返回publicintread(charcbuf)throwsIOException从数据流读取数个字符放进数组从数据流读取数个字符放进数组cbuf中,并返回所读取到的字中,并返回所读取到的字符数目,最多可读取和符数目,最多可读取和cbuf长度相同的字符数,如果没有读取到长度相同的字符数,如果没有读取到则返回则返回-1.这个这个method会一直等待直到读取到字符产生会一直等待直到读取到字符产生IOException或数据读完为止或数据读完为止Reader类的methodpubliclongskip(longn)throwsIOException略过略过n个字节不读取,会返回实际略过的字节数目因为数据个字节不读取,会返回实际略过的字节数目因为数据流中剩下的数据可能不到流中剩下的数据可能不到n个字节那么多,所以此时返回值会小于个字节那么多,所以此时返回值会小于npublicbooleanready()throwsIOException检查数据流是否已经准备好要被读取,是则返回检查数据流是否已经准备好要被读取,是则返回true,否则返回,否则返回false如果返回值是如果返回值是true则紧跟着的则紧跟着的read指令将指令将不会受到阻碍不会受到阻碍Writer类Writer类类的实现:的实现:publicabstractclassWriterextendsObjectWriter子类的继承关系子类的继承关系 WriterPrintWriter(格式化输出功能)格式化输出功能)BufferedWriter(缓冲功能)缓冲功能)OutputStreamWriter(字符字节转换)字符字节转换)FileWriter(向文件读入字符)向文件读入字符)Writer类的methodpublicabstractvoidclose()throwsIOException关闭与输出数据流的连接,但关闭之前会先调用一次关闭与输出数据流的连接,但关闭之前会先调用一次flushmethod.如果程序结束前没有调用这个如果程序结束前没有调用这个method则写入的数据则写入的数据可能会流失调可能会流失调publicabstractvoidflush()throwsIOEception将写入的数据确实送到收据的装置去将写入的数据确实送到收据的装置去publicvoidwrite(charcbuf)将将cbuf数组中的字符一一写入输出数据流数组中的字符一一写入输出数据流Writer类的methodpublicvoidwrite(charcbuf,intoff,intlen)将将cbuf数组中从第数组中从第off个字符开始,共写入个字符开始,共写入len个字符到输出数据流个字符到输出数据流publicvoidwrite(Stringstr)写入一个字符串到输出数据流写入一个字符串到输出数据流二、标准输入输出Java系统预先定义好系统预先定义好3个流对象分别表示标准输出设备、标准个流对象分别表示标准输出设备、标准输入设备和标准错误设备,它们分别是输入设备和标准错误设备,它们分别是System.out,System.in和和System.err。LSystem.out是它的一个静态属性,属于是它的一个静态属性,属于PrintStream类对象,用类对象,用于输出字节数据流,对应标准输出设备:屏幕。于输出字节数据流,对应标准输出设备:屏幕。LSystem.in也是也是System的一个静态属性,属于的一个静态属性,属于InputStream类对类对象,用于输入字节数据流,对应标准输入设备:键盘。象,用于输入字节数据流,对应标准输入设备:键盘。LSystem.err也是也是System的一个静态属性,属于的一个静态属性,属于PrintStream类对类对象,用于系统错误信息的输出,对应屏幕。象,用于系统错误信息的输出,对应屏幕。Java实例标准输入import java.io.*;public class StandardIn1 public static void main(String args)throws IOException char c;System.out.println(输入一个字符输入一个字符);c=(char)System.in.read();System.out.print(输入的字符是:输入的字符是:+c);Java实例实例例10-3输入字符串l可以利用可以利用BufferedReader类的类的readLine()方法从键盘输入字符串,方法从键盘输入字符串,该方法一次读入一行字符串,即按回车键前面输入的所有字符,该方法一次读入一行字符串,即按回车键前面输入的所有字符,同时具备缓冲功能,提高运行效率。同时具备缓冲功能,提高运行效率。l输入字节输入字节转化为字符转化为字符具有缓冲功能的输入字符具有缓冲功能的输入字符lInputStream(System.in)InputStreamReader(iin)BufferedReader(bin)Java实例实例Importjava.io.*;PublicclassStandardin3publicstaticvoidmain(Stringargs)throwsIOExceptionInputStreamReaderiin=newInputStreamReader(System.in);BufferedReaderbin=newBufferedReader(iin);Strings;floatf;inti;Booleanb;System.out.println(“请输入任一字符串请输入任一字符串”);S=bin.readLine();System.out.println(“请输入浮点数请输入浮点数”););f=Float.parseFloat(bin.readLine();System.out.println(“输入整数输入整数”););i=Integer.parseInt(bin.readLine();System.out.println(“输入布尔变量输入布尔变量”););b=newBoolean(bin.readLine().booleanValue();System.out.println(“输入的字符串:输入的字符串:”);System.out.println(“输入的浮点数:输入的浮点数:”+f);System.out.println(“输入的整数:输入的整数:”+i);System.out.println(“输入的布尔变量:输入的布尔变量:”+b);标准输出 Java的标准输入设备:显示器用System.out表示,System.out属于PrintStream类对象。利用PrintStream类的print()或println()方法可以非常方便地输出各类数据,这两个方法的唯一区别是print()输出后不换行,而println()方法输出完毕后要换行。三、文件操作 在程序中要对磁盘文件或目录进行操作,首先在程序中要对磁盘文件或目录进行操作,首先要对文件或目录建立连接,为此要对文件或目录建立连接,为此Java提供了提供了File类。类。File类也位于类也位于java.io包中,但包中,但不是流类不是流类,而是,而是专门用来管理磁盘文件和目录。专门用来管理磁盘文件和目录。一个一个File类对象表示一个磁盘文件或目录,其类对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,如名对象属性中包含了文件或目录的相关信息,如名称、长度、所含文件个数等,其方法可以完成对称、长度、所含文件个数等,其方法可以完成对文件或目录的文件或目录的常用管理常用管理操作,如创建、删除等。操作,如创建、删除等。File类File类提供了类提供了3个不同的构造方法个不同的构造方法:File(Stringpath)String类参数类参数path指定所建对象对应的磁盘文件名或目录名指定所建对象对应的磁盘文件名或目录名及其路径名。及其路径名。File(Stringpath,Stringname)此构造方法中的参数此构造方法中的参数path表示文件或目录的路径,参数表示文件或目录的路径,参数name表示文件或目录名。表示文件或目录名。File(Filedir,Stringname)此构造方法中的参数此构造方法中的参数dir表示一个磁盘目录对应的表示一个磁盘目录对应的File对象,参对象,参数数name表示文件名或目录名。表示文件名或目录名。File类主要方法publicStringgetName():得到文件的名字得到文件的名字publicStringgetPath():得到文件的得到文件的路径路径名名 publicbooleanexists():判断文件或目录是否存在判断文件或目录是否存在publiclonglength():返回文件的字节数返回文件的字节数 publicbooleancanRead():返回当前文件是否可写返回当前文件是否可写publicbooleancanWrite():返回当前文件是否可读返回当前文件是否可读 publicbooleanequals(Filefile):比较文件或目录比较文件或目录publicbooleanisFile():检测是否是文件检测是否是文件publicbooleanisDirectiry():检测是否是目录检测是否是目录 publicbooleanrenameTo(Filefile):重命名文件重命名文件publicvoiddelete():删除文件删除文件FileOutputStream类流FileOutputStream流流类的构造方法有两个类的构造方法有两个:FileOutputStream(StringfileName):参数参数fileName表示带路径的磁盘文件名。表示带路径的磁盘文件名。FileOutputStream(Filefile):参数参数file表示为磁盘文件所建立的表示为磁盘文件所建立的File对象名对象名Java实例FileOutputStreamimport java.io.*;public class File2 public static void main(String args)throws IOExceptionchar ch;File file1=new File(c:jdk1.3examplenewFile.txt);try FileOutputStream fout=new FileOutputStream(file1);System.out.println(输入任一字符串,以?结束输入任一字符串,以?结束);ch=(char)System.in.read();while(ch!=?)fout.write(ch);ch=(char)System.in.read();fout.close();catch(FileNotFoundException e)System.out.println(e);catch(IOException e)System.out.println(e);FileInputStream类流FileInputStream流流类的构造方法有两个类的构造方法有两个:FileInputStream(StringfileName):参数参数fileName表示带路径的磁盘文件名。表示带路径的磁盘文件名。FileInputStream(Filefile):参数参数file表示为磁盘文件所建立的表示为磁盘文件所建立的File对象名对象名。Java实例FileInputStreamimport java.io.*;public class File3 public static void main(String args)throws IOExceptionint ch;File file1=new File(c:jdk1.3examplenewFile.txt);tryFileInputStream fin=new FileInputStream(file1);System.out.println(文件中的信息为:文件中的信息为:);ch=fin.read();while(ch!=-1)System.out.print(char)ch);ch=fin.read();fin.close();catch(FileNotFoundException e)System.out.println(e);catch(IOException e)System.out.println(e);DataOutputStream类流 使用使用DataOutputStream类向文件中写入各种类型数据的操作类向文件中写入各种类型数据的操作步骤是:步骤是:为磁盘文件建立为磁盘文件建立File类对象;类对象;为该为该File对象建立对象建立FileOutputStream类流对象,建立其类流对象,建立其与磁盘文与磁盘文件的连接件的连接;为该为该FileOutputStreamFileOutputStream类对象类对象建立建立DataOutputStreamDataOutputStream类对象类对象,利,利用用DataOutputStreamDataOutputStream类的类的writeIntwriteInt()(),writeFloatwriteFloat()(),writeDoublewriteDouble()(),writeBooleanwriteBoolean()()等方法分别向文件中写入整型、单精度型、等方法分别向文件中写入整型、单精度型、双精度型、布尔型等数据;双精度型、布尔型等数据;写入操作完成后,写入操作完成后,利用利用close()close()方法将流关闭,方法将流关闭,断开断开与磁盘文件与磁盘文件的联系。的联系。Java实例DataOutputStreamimport java.io.*;public class File4 public static void main(String args)int ch;InputStreamReader iin=new InputStreamReader(System.in);BufferedReader bin=new BufferedReader(iin);File file1=new File(c:jdk1.3exampledataFile.txt);tryFileOutputStream fout=new FileOutputStream(file1);DataOutputStream dout=new DataOutputStream(fout);System.out.println(输入整数输入整数);int i=Integer.parseInt(bin.readLine();System.out.println(输入浮点数输入浮点数);Java实例(续)float f=Float.parseFloat(bin.readLine();System.out.println(输入布尔量输入布尔量);boolean b=new Boolean(bin.readLine().booleanValue();dout.writeInt(i);dout.writeFloat(f);dout.writeBoolean(b);dout.close();catch(FileNotFoundException e)System.out.println(e);catch(IOException e)System.out.println(e);l从磁盘文件中读入各类数据从磁盘文件中读入各类数据l本程序的功能是将磁盘文件本程序的功能是将磁盘文件dataFile.txt中保存的各类中保存的各类数据复制到磁盘文件数据复制到磁盘文件outFile.txt中中DataInputStream类流类流Importjava.io.*;publicclassFile5publicstaticvoidmain(Stringargs)throwsIOExceptionintch;Filefile1=newFile(“c:dataFile.txt”);Filefile2=newFile(“c:outFile.txt”);tryFileInputStreamfin=newFileInputStream(file1);DataInputStreamdin=newDataInputStream(fin);inti=din.readInt();floatf=din.readFloat();booleanb=din.readBoolean();din.close();FileOutputStreamfout=newFileOutputStream(file2);DataOutputStreamdout=newDataOutputStream(fout);Java实例DataInputStreamJava实例(续)dout.writeInt(i);dout.writeFloat(f);dout.writeBoolean(b);dout.close();System.out.println(“整数:整数:”+i);System.out.println(“浮点数:浮点数:”+f);System.out.println(“布尔量:布尔量:”+b);Catch(FileNotFoundExceptione)System.out.println(e);Catch(IOExceptione)ystem.out.println(e);Writer和Reader 以字符流方式向文件写入或从文件中读取数据,可以使用以字符流方式向文件写入或从文件中读取数据,可以使用Writer和和Reader类及其子类。类及其子类。Writer和和Reader类类都都是是抽抽象象类类,不不能能建建立立它它们们的的对对象象,所所以以只只能能通通过过它它们们子子类类对对象象对对文文件件进进行行操操作作。常常用用的的Writer类类的的子子类类包包括括FileWriter类和类和BufferedFileWriter类。类。FileWriter类构造方法类构造方法如下:如下:l lFileWriter(StringfileName):参数参数fileName表示带路径的磁盘文件名。表示带路径的磁盘文件名。FileWriter(Filefile):参数参数file表示为磁盘文件所建立的表示为磁盘文件所建立的File对象名。对象名。注:使用注:使用FileWriter进行文件操作时,为了减少和磁盘打交道的次数,进行文件操作时,为了减少和磁盘打交道的次数,常常使用具有缓冲功能的常常使用具有缓冲功能的BufferedWriter类类。Java实例Writerimport java.io.*;public class File8 public static void main(String args)throws Exception InputStreamReader iin=new InputStreamReader(System.in);BufferedReader br=new BufferedReader(iin);FileWriter fw1=new FileWriter(c:jdk1.3exampledataFile.txt);BufferedWriter bw=new BufferedWriter(fw1);String s;while(true)System.out.print(输入一个字符串:输入一个字符串:);System.out.flush();s=br.readLine();if(s.length()=0)break;bw.write(s);bw.newLine();bw.close();Java实例Readerimport java.io.*;public class File9 Public static void main(String args)throws Exception FileReader fr1=new FileReader(“c:dataFile.txt”);Bufferedreader br1=new BufferedReader(fr1);Bufferedreader bw1=new BufferedWriter(new FileWriter(“c:targetFile.txt”);Int lineNum=0;String s=br1.readLine();While(s!=null)lineNum+;bw1.write(String.valueOf(lineNum);bw1.write(“”);bw1.write(s);bw1.newLine();s=br1.readLine();bw1.close();