第8章Java输入输出流ppt课件.ppt
第8章 Java输入输出流第第8 8章章 JavaJava输入输出流输入输出流JavaJava程序设计基础程序设计基础主要内容:主要内容:p 文件系统和文件系统和File类及其常用方法类及其常用方法p 输出输入流和输出输入流和Inputstream,Outputstream类类p Reader和和Writer类类p InputStreamReader和和OutputStreamWriter类类p FileReader和和FileWriterp BufferedReader和和BufferedWriter类类教学目的和要求教学目的和要求:1.学会使用文件输入输出流读、写字节文件等。学会使用文件输入输出流读、写字节文件等。2.掌握如何提高读写效率和增强读写功能,灵活使掌握如何提高读写效率和增强读写功能,灵活使用用BufferedInputStream类和类和BufferedOutputStream类、类、DataInputStream类和类和DataOutputStream类类及类中的响应方法。及类中的响应方法。3.掌握如何存储和还原串行化对象。掌握如何存储和还原串行化对象。4.熟悉目录和文件操作熟悉目录和文件操作File类。类。5.掌握掌握RandomAccessFile类的使用类的使用定位读写。定位读写。6.熟悉字符流类熟悉字符流类Reader和和Writer的相关子类的使的相关子类的使用。用。 教学重点教学重点 :1.掌握常用的字节流类、字符流类的使用。掌握常用的字节流类、字符流类的使用。2.RandomAccessFile类实现定位读写。类实现定位读写。3.掌握目录和文件操作掌握目录和文件操作File类。类。4.掌握存储和还原串行化对象。掌握存储和还原串行化对象。5.综合所学知识编写能解决实际问题的输入输出程综合所学知识编写能解决实际问题的输入输出程序。序。 教学难点教学难点 :1.流的概念、输入和输出。流的概念、输入和输出。2.Java输入输出流的读写指针、流的结束等概念。输入输出流的读写指针、流的结束等概念。3.区别字节流、字符流。常用字节流类和字符流类区别字节流、字符流。常用字节流类和字符流类的使用。的使用。4.串行化的概念,如何串行化对象。串行化的概念,如何串行化对象。5.综合所学知识编写能解决实际问题的输入输出程综合所学知识编写能解决实际问题的输入输出程序。序。 Java的输入输出/概述Java的输入输出是由定义在的输入输出是由定义在Java.io这个包中的这个包中的一系列一系列类和接口来实现的类和接口来实现的所以在需要输入输出的程序的前面都要所以在需要输入输出的程序的前面都要import java.io.*;在在java.io这个包里有这个包里有50个类和个类和10个接口个接口,我们会用到我们会用到 File RandomAccessFile InputStream及其子类及其子类(常用的常用的7个个) OutputStream及其子类及其子类(常用的常用的5个个)Java的输入输出流(1)什么是输入输出流什么是输入输出流? ?输入输出流说的都是数据流输入输出流说的都是数据流, ,而而数据流数据流是指一组有顺序是指一组有顺序的、有起点和终点的字节集合的、有起点和终点的字节集合文件文件程序程序网络端点网络端点数据流数据流起点起点终点终点 终端设备终端设备文件文件程序程序网络端点网络端点终端设备终端设备Java的输入输出流(2)数据流分为输入数据流和输出数据流数据流分为输入数据流和输出数据流, ,各自在分为各自在分为字节流和字符流字节流和字符流Java中的输入数据流中的输入数据流(字节流字节流)都是抽象类都是抽象类InputStream的的子类子类Java中的输入数据流中的输入数据流(字符流字符流)都是抽象类都是抽象类Reader的子类的子类输入数据流只能读输入数据流只能读,不能写不能写Java中的输出数据流中的输出数据流(字节流字节流)都是抽象类都是抽象类OutputStream的的子类子类Java中的输出数据流中的输出数据流(字符流字符流)都是抽象类都是抽象类Writer的子类的子类输出数据流只能写输出数据流只能写,不能读不能读本章概要本章概要 :ObjectInputStreamReaderWriterFileRandomAccessFileOutputStreamFileInputStream FileReaderFileWriterFileOutputStream 字节字节8位位字符字符16位位Java的输入输出流(3)输入数据流输入数据流InputStream(字节流字节流)的继承关系的继承关系InputStreamFileInputStreamPipedIntputStreamFilterInputStreamByteArrayInputStreamDataInputStreamBufferedInputStreamSequencedInputStreamObjectInputStreamPushbackInputStreamAudioInputStream只画出了我们感兴趣的类只画出了我们感兴趣的类Java的输入输出流(4)输出数据流输出数据流OutputStream(字节流字节流)的继承关系的继承关系OutputStreamFileOutputStreamPipedOutputStreamFilterOutputStreamByteArrayOutputStreamDataOutputStreamBufferedOutputStreamObjectOutputStreamPrintStream只画出了我们感兴趣的类只画出了我们感兴趣的类Java的输入输出流(5)输入数据流输入数据流reader(字符流字符流)的继承关系的继承关系ReaderInputStreamReaderPipedReaderFilterReaderCharArrayReaderPushbackReaderLineNumberReaderStringReaderBufferedReaderFileReader只画出了我们感兴趣的只画出了我们感兴趣的Java的输入输出流(6)输出数据流输出数据流Writer(字符流字符流)的继承关系的继承关系只画出了我们感兴趣的只画出了我们感兴趣的WriterBufferedWriterFilterWriterCharArrayWriterOutputStreamWriterFileWriterPipedWriterPrintWriterStringWriterJava的输入输出流(7)输入数据流输入数据流InputStream(字节流字节流)的主要方法的主要方法现版本现版本Java的的InputStream类有类有9个方法个方法:int available();返回可以读取的字节数返回可以读取的字节数void close();关闭输入流关闭输入流,释放系统资源释放系统资源void mark(int readlimit);在当前位置做一个标记在当前位置做一个标记int read();读下一个字节读下一个字节(InputStream类里唯一的抽象方法类里唯一的抽象方法)int read(byte b);读若干字节到读若干字节到b里去里去int read(byte b, int off, int len);读最多读最多len个字节到个字节到bytevoid reset();返回到最后一个返回到最后一个mark做的标记处做的标记处long skip(long n);跳过跳过n个字节个字节InputStream的子类必须重写的子类必须重写read();InputStream();构造方法构造方法第一个字节放在第一个字节放在byteoffJava的输入输出流(8)输出数据流输出数据流OutputStream(字节流字节流)的主要方法的主要方法现版本现版本Java的的OutputStream类共有类共有5个方法个方法如下:如下:void close();关闭输出流关闭输出流,释放系统资源释放系统资源void flush();清空输出缓冲区清空输出缓冲区,把里面的数据写出去把里面的数据写出去void write(byte b);从从b写写b.length个字节数到输出流个字节数到输出流void write(byte b, int off, int len);*void write(int b);写入一个字节写入一个字节b (该类里唯一的抽象方法该类里唯一的抽象方法)OutputStream();构造方法构造方法OutputStream的子类必的子类必须重写须重写write(int b)方法方法*从从byte数组数组b的的boff开始向输出开始向输出流里写流里写len个字节;如果个字节;如果off+len大大于数组的长度于数组的长度b.length就会出错就会出错Java的输入输出流(9)FileInputStream的主要方法的主要方法只列出了我们感兴趣的只列出了我们感兴趣的现版本现版本Java的的FileInputStream类共有类共有9个方法个方法:int available();返回可以读取的字节数返回可以读取的字节数void close();关闭输入流关闭输入流,释放系统资源释放系统资源int read();读下一个字节读下一个字节int read(byte b);读若干字节到读若干字节到b里去里去long skip(long n);跳过跳过n个字节个字节现版本现版本Java的的FileInputStream类共有类共有3个构造方法个构造方法:FileInputStream(File f);FileInputStream(FileDescriptor fd);FileInputStream(String name);FileInputStream的用途是从一个文件里获得输入的字节。特别适的用途是从一个文件里获得输入的字节。特别适用于获得图象数据等;如果是输入字符,建议使用用于获得图象数据等;如果是输入字符,建议使用FileReader类类err,in,outerr,in,out等等Java的输入输出流(10)FileOutputStream的主要方法的主要方法只列出了我们感兴趣的只列出了我们感兴趣的现版本现版本Java的的FileOutputStream类共有类共有7个方法个方法:void close();关闭输出流关闭输出流,释放系统资源释放系统资源void write(int b);写字节写字节bvoid write(byte b);从从b写写b.length个字节数到输出流个字节数到输出流void write(byte b, int off, int len);从从boff开始写开始写len字节字节现版本现版本Java的的FileOutputStream类共有类共有5个构造方法个构造方法:FileOutputStream(File f);FileOutputStream(File f, boolean append);FileOutputStream(FileDescriptor fd);FileOutputStream(String name);FileOutputStream(String name, boolean append);FileOutputStream适用于获得适用于获得image data,输出字符用输出字符用FileWriterJava的输入输出流(11)ByteArrayInputStream的介绍的介绍现版本现版本Java的的ByteArrayInputStream类有类有2个构造方法个构造方法:ByteArrayInputStream(byte buf); ByteArrayInputStream(byte buf, int offset, int length);现版本现版本Java的的ByteArrayInputStream类有类有8个方法个方法:int available();返回可以读取的字节数返回可以读取的字节数void close();关闭输入流关闭输入流,释放系统资源释放系统资源void mark(int readlimit);在当前位置做一个标记在当前位置做一个标记boolean markSupported();测试是否支持测试是否支持mark和和resetint read();读下一个字节读下一个字节int read(byte b, int off, int len);读最多读最多len个字节到个字节到bytevoid reset();返回到最后一个返回到最后一个mark做的标记处做的标记处Java的输入输出流(12)ByteArrayOutputStream的介绍的介绍现版本现版本Java的的ByteArrayOutputStream类有类有9个方法个方法:void close();关闭输出流对象,但关闭输出流对象,但不影响其它方法的使用不影响其它方法的使用void reset();将这个对象缓冲区的将这个对象缓冲区的count值置值置0int size();返回缓冲区大小返回缓冲区大小byte toByteArray();复制一个内容、大小都一样的复制一个内容、大小都一样的byteString toString();将缓冲区将缓冲区buf的内容转换成一个字符串的内容转换成一个字符串String toString(String enc);按指定的字符集按指定的字符集enc转换字符串转换字符串void write(int b);将字节将字节b写到这个写到这个ByteArrayOutputStream现版本现版本Java的的ByteArrayOutputStream类有类有2个构造方法个构造方法:ByteArrayOutputStream(); ByteArrayOutputStream(int size);Java的输入输出流(13)ByteArrayInputStream和和ByteArrayOutputStream将输入与输出面向一个将输入与输出面向一个byte型的数组型的数组在这两个类里都有成员变量在这两个类里都有成员变量protected byte buf和和protected int count这个这个buf就是数据缓冲区就是数据缓冲区ByteArrayInputStream将数据读入一个缓冲区将数据读入一个缓冲区ByteArrayOutputStream将数据写入一个缓冲区将数据写入一个缓冲区Java的输入输出流(13)ByteArrayInputStream和和ByteArrayOutputStream将输入与输出面向一个将输入与输出面向一个byte型的数组型的数组在这两个类里都有成员变量在这两个类里都有成员变量protected byte buf和和protected int count这个这个buf就是数据缓冲区就是数据缓冲区ByteArrayInputStream将数据读入一个缓冲区将数据读入一个缓冲区ByteArrayOutputStream将数据写入一个缓冲区将数据写入一个缓冲区Java的输入输出流(14)FilterInputStream这个过滤器输入流是其它带过滤器的输入流的超类这个过滤器输入流是其它带过滤器的输入流的超类FilterInputStream的方法与的方法与InputStream的方法完全的方法完全一样,也就是说前者只是简单地重写了后者的所有方法一样,也就是说前者只是简单地重写了后者的所有方法构造方法构造方法: FilterInputStream(InputStream in); 过滤器输入流以一个过滤器输入流以一个InputStream为自己的数据源为自己的数据源成员变量:成员变量:protected InputStream in在构造方法里会对这个变量赋值,即:在构造方法里会对这个变量赋值,即:this.in = in;Java的输入输出流(15)FilterOutputStream这个过滤器输出流是其它带过滤器的输出流的超类这个过滤器输出流是其它带过滤器的输出流的超类FilterOutputStream的方法与的方法与OutputStream的方法的方法完全一样,也就是说前者只是简单地重写了后者的所有完全一样,也就是说前者只是简单地重写了后者的所有方法方法构造方法构造方法: FilterOutputStream(OutputStream out);过滤器输出流位于一个过滤器输出流位于一个OutputStream之上之上成员变量:成员变量:protected OutputStream out在构造方法里会对这个变量赋值,即:在构造方法里会对这个变量赋值,即:this.out = out;Java的输入输出流(16)DataInputStream的主要方法的主要方法只列出了我们感兴趣的只列出了我们感兴趣的现版本现版本Java的的DataInputStream类共有类共有17个方法个方法:int read(byte b);读若干字节到缓冲区读若干字节到缓冲区b里里int read(byte b,int off, int len);读最多读最多len个字节到个字节到b里去里去readBoolean(); readByte(); readChar(); readDouble();readFloat(); readInt(); readLong(); readShort();这些方法分别返回相应数这些方法分别返回相应数据类型的值据类型的值String readUTF();读入一个读入一个UTF-8格式的字符串格式的字符串Static String readUTF(DataInput in);从输入流读入一个从输入流读入一个UTF-8格式的格式的字符串字符串构造方法构造方法:DataInputStream(InputStream in);DataInputStream实现了接口实现了接口DataInput,这个类使我们可以非常这个类使我们可以非常方便地读取方便地读取Java常用基本数据类型的数据常用基本数据类型的数据Java的输入输出流(17)DataOutputStream的主要方法的主要方法只列出了我们感兴趣的只列出了我们感兴趣的现版本现版本Java的的DataOutputStream类共有类共有15个方法个方法:void flush();flushes这个这个data output streamint size(int b);返回返回written的值的值,至今写入的字节数至今写入的字节数void write(int b);将将b的低的低8位写到输出流位写到输出流void write(byte b, int off, int len);boff起起len字节输出流字节输出流void writeBoolean(boolean v);void writeInt(int v);各类各类型数型数据写据写到输到输出流出流void writeDouble(double v);void writeChar(int v);void writeFloat(float v);void writeByte(int v) ; void writeLong(long v); void writeShort(short v);void writeBytes(String s);void writeChars(String s);构造方法构造方法: :DataOutputStream(OutputStream out);Java的输入输出流(18)BufferedInputStream的主要方法的主要方法只列出了我们感兴趣的只列出了我们感兴趣的现版本现版本Java的的BufferedInputStream类共有类共有8个方法个方法:int available();返回可以从这个返回可以从这个input stream读到的字节数读到的字节数void close();关闭这个输入流关闭这个输入流void mark(int limit);在当前位置做一个标记在当前位置做一个标记bollean markSupported();测试是否支持测试是否支持mark和和reset方法方法int read();读下一个字节读下一个字节int read(byte b,int off, int len);读最多读最多len个字节到个字节到b里去里去void reset();返回到最后一个返回到最后一个mark做的标记处做的标记处long skip(long n);跳过跳过n个字节个字节构造方法构造方法:BufferedInputStream(InputStream in); BufferedInputStream(InputStream in, int size);Java的输入输出流(19)BufferedOutputStream的主要方法的主要方法只列出了我们感兴趣的只列出了我们感兴趣的现版本现版本Java的的BufferedOutputStream类有类有3个方法个方法:void flush();flushes这个这个buffered output streamvoid write(int b);将将b的低的低8位写到输出流位写到输出流void write(byte b, int off, int len);boff起起len字节输出流字节输出流构造方法构造方法: :BufferedOutputStream(OutputStream out); BufferedOutputStream(OutputStream out, int size);Java的输入输出流-例(1)import java.io.*;import java.util.*;public class FileIO FileIO()f1 = new File(aNewFile.txt);/f1 = new File(FileIO.java);f2 = new File(bdfz/root/, anotherFile.java);tryfis = new FileInputStream(f1);fos = new FileOutputStream(f2);catch(FileNotFoundException fe) 转下页转下页Java的输入输出流-例(1*)接上页接上页 public static void main(String s)FileIO fio = new FileIO();tryint i = fio.fis.read();while(i != -1)fio.fos.write(i);i = fio.fis.read();fio.fis.close();fio.fos.close();catch(IOException e) private File f1, f2; private FileInputStream fis; private FileOutputStream fos;Java的输入输出流-例(2)import java.io.*;import java.util.*;public class IOStream public static void main(String s) throws Exception ByteArrayOutputStream baos = new ByteArrayOutputStream(); System.out.println(请输入五个字符,然后按回车请输入五个字符,然后按回车键键);while(baos.size()!=5)baos.write(System.in.read();转下页转下页Java的输入输出流-例(2*)接上页接上页 System.out.println(baos.toString is: + baos.toString(); byte a = baos.toByteArray(); for(int i=0;ia.length;i+)System.out.print(char)ai + ); System.out.println(); OutputStream os = new FileOutputStream(aNewFile.txt);baos.writeTo(os);baos.close();os.close(); Java的输入输出流(20)-2004/11/25PrintStream的主要方法的主要方法现版本现版本Java的的PrintStream类共有类共有25个方法个方法:void close();关闭输出流关闭输出流,释放系统资源释放系统资源void flush();清空输出缓冲区清空输出缓冲区,把里面的数据写出去把里面的数据写出去void write(byte b, int off, int len);*void write(int b);* 这两个方法的意义与这两个方法的意义与OutputStream相同相同boolean checkError();将输出流清空,查是否有将输出流清空,查是否有IOExceptionvoid setError();把出错状态设置成把出错状态设置成truePrintStream(OutputStream out);共有共有3个构造方法个构造方法PrintStream(OutputStream out, boolean autoFlush);PrintStream(OutputStream out , boolean autoFlush, String encoding);Java的输入输出流(20*)PrintStream的主要方法的主要方法(续续)void print(boolean s);void print(char s);void print(double s);void print(char s);void print(float s);void print(String s);void print(long s);void print(Object s);void print(int s);void println();打印一个换行符打印一个换行符void println(boolean s);void println (char s);void println (double s);void println (char s);void println (float s);void println (String s);Java的输入输出流(20*)PrintStream是我们的一个老朋友,我们一直在用的是我们的一个老朋友,我们一直在用的System.out.println(“XXX”)就是它就是它查一下查一下Java文档,找到文档,找到System这个类,我们可以看到这个类,我们可以看到它有三个它有三个static的类变量:的类变量:static InputStream in、static PrintStream out、和、和static PrintStream err也就是说也就是说in是一个是一个InputStream类的对象、其它两个都类的对象、其它两个都是是PrintStream类的对象类的对象Java的输入输出流(21)输入字符流输入字符流Reader的主要方法的主要方法现版本现版本Java的的Reader类共有类共有9个方法个方法:void close();关闭输入流关闭输入流,释放系统资源释放系统资源int read();读一个字符读一个字符int read(char cbuf);将字符读到字符数组将字符读到字符数组cbuf里里int read(char cbuf, int off, int len);off始始, ,读入读入len个字符个字符void mark(int limit);标记标记boolean markSupported();检查是否支持检查是否支持markvoid reset();回到标记处回到标记处boolean ready();检查输入流是否已经准备好了检查输入流是否已经准备好了Reader();Reader类的构造方法类的构造方法Reader(Object lock);标成红色的是抽象方法标成红色的是抽象方法Java的输入输出流(22)输出字符流输出字符流Writer的主要方法的主要方法标成红色的是抽象方法标成红色的是抽象方法现版本现版本Java的的Writer类共有类共有7个方法个方法:void close();关闭输出流关闭输出流,释放系统资源释放系统资源void flush();void write(int c);写字符写字符cvoid write(char b);从从b写写b.length个字符到输出流个字符到输出流void write(char b, int off, int len);从从boff开始写开始写len字符字符void write(String s);向输出流写一个字符串向输出流写一个字符串void write(String s, int off, int len);写一个子串写一个子串Writer();Writer类的构造方法类的构造方法Writer(Object lock);Java的输入输出流(23)InputStreamReader的主要方法的主要方法现版本现版本Java的的InputStreamReader类有类有5个方法个方法:void close();关闭输入流关闭输入流,释放系统资源释放系统资源String getEncoding();返回系统的返回系统的encoding名名int read();读一个字符读一个字符int read(char cbuf, int off, int len);从从off始读入始读入len个字符个字符boolean ready();检查输入流是否已经准备好了检查输入流是否已经准备好了InputStreamReader(InputStream in);构造方法构造方法InputStreamReader(InputStream in, Charset cs);InputStreamReader(InputStream in, CharsetDecoder dc);InputStreamReader(InputStream in, String charset);Java的输入输出流(23*)InputStreamReader是字节流与字符流之间的是字节流与字符流之间的一个桥梁,实现了字节到字符的转变;一个桥梁,实现了字节到字符的转变;为了提高效率常常把它与为了提高效率常常把它与BufferedReader一起一起用,例:用,例:BufferedReader in = BufferedReader in = new BufferedReader(new InputStreamReader(System.in);new BufferedReader(new InputStreamReader(System.in); Java的输入输出流(24)OutputStreamWriter的主要方法的主要方法现版本现版本Java的的OutputStreamWriter类有类有6个方法个方法:void close();关闭输出流关闭输出流,释放系统资源释放系统资源void flush();清空输出流清空输出流void write(int c);写字符写字符cvoid write(char b, int off, int len);从从boff开始写开始写len字符字符void write(String s, int off, int len);写一个子串写一个子串OutputStreamWriter(OutputStream Out);构造方法构造方法OutputStreamWriter(OutputStream Out, Charset cs);OutputStreamWriter(OutputStream Out, CharsetEncoder enc);OutputStreamWriter(OutputStream Out, String charset);Java的输入输出流(24*)OutputStreamWriter是字符流与字节流之间的是字符流与字节流之间的一个桥梁,实现了字符到字节的转变;一个桥梁,实现了字符到字节的转变;为了提高效率常常把它与为了提高效率常常把它与BufferedWriter一起用,一起用,例:例:Writer out = new BufferedWriter(new OutputStreamWriter(System.out); Java的输入输出流(25)FileReader的主要方法的主要方法FileReader类是类是InputStreamReader的子类,可以方便地用来处的子类,可以方便地用来处理字符文件,自己本身没有更进一步的扩展,方法都是从起超类理字符文件,自己本身没有更进一步的扩展,方法都是从起超类继承来的继承来的如果想处理字节文件,建议使用如果想处理字节文件,建议使用FileInputStreamFileReader(File f);构造方法构造方法FileReader(FileDescriptor fd);FileReader(String fileName);Java的输入输出流(26)FileWriter的主要方法的主要方法FileWriter(File f);构造方法构造方法FileWriter(File f, boolean append);FileWriter(FileDescriptor fd);FileWriter(String fileName);FileWriter(String fileName, boolean append);FileWriter类是类是OutputStreamWriter的子类,可以方便地用来处的子类,可以方便地用来处理字符文件,自己本身没有更进一步的扩展,方法都是从起超类理字符文件,自己本身没有更进一步的扩展,方法都是从起超类继承来的继承来的如果想处理字节文件,建议使用如果想处理字节文件,建议使用FileOutputStream如果构造方法涉及到的文件已经为了某种目的打开了,使用构造如果构造方法涉及到的文件已经为了某种目的打开了,使用构造方法会导致失败方法会导致失败Java的输入输出流(27)BufferedReader的主要方法的主要方法BufferedReader(Reader in);构造方法构造方法BufferedReader(Reader in, int size);现版本现版本Java的的BufferedReader类共有类共有9个方法个方法:void close();关闭输入流关闭输入流,释放系统资源释放系统资源int read();读一个字符读一个字符int read(char cbuf, int off, int len);off始始, ,读入读入len个字符个字符String readLine();读一行文本读一行文本void mark(int limit);标记标记boolean markSupported();检查是否支持检查是否支持markvoid reset();回到标记处回到标记处boolean ready();Java的输入输出流(28)BufferedWriter的主要方法的主要方法现版本现版本Java的的BufferedWriter类类6个方法个方法:void close();关闭输出流关闭输出流,释放系统资源释放系统资源void flush();清空输出流清空输出流void write(int c);写字符写字符cvoid write(char b, int off, int len);从从boff开始写开始写len字符字符void write(String s, int off, int len);写一个子串写