《输入输出》PPT课件.ppt
第第7章章 输入输入/输出输出流式流式I/O基础基础文件文件随机存取文件随机存取文件对象输入对象输入/输出流输出流1流流Stream的概念的概念是从源到目的的字节的有序序列,先进先出。是从源到目的的字节的有序序列,先进先出。两种基本流:两种基本流:Input stream(输入流)(输入流),Output stream(输出流)(输出流)2流操作的过程Reading:Reading:open a streamopen a streamwhile more informationwhile more information read information read informationclose the stream close the stream Writing:open a streamwhile more information write informationclose the stream3两种结构的流 Node Stream Node Stream(节点流):从特定源如磁盘文件(节点流):从特定源如磁盘文件(节点流):从特定源如磁盘文件(节点流):从特定源如磁盘文件或内存某区域进行读或写入,它是一种最基本的流。或内存某区域进行读或写入,它是一种最基本的流。或内存某区域进行读或写入,它是一种最基本的流。或内存某区域进行读或写入,它是一种最基本的流。Filter Stream Filter Stream(过滤流):使用其它已存在的流(过滤流):使用其它已存在的流(过滤流):使用其它已存在的流(过滤流):使用其它已存在的流作作作作为输入源或输出目的地。它要对与其相连的另一个为输入源或输出目的地。它要对与其相连的另一个为输入源或输出目的地。它要对与其相连的另一个为输入源或输出目的地。它要对与其相连的另一个流进行某种转换。流进行某种转换。流进行某种转换。流进行某种转换。l l e HoNode InputStreamFilter InputStreamread()4两种流类的体系 Java.io Java.io包中包含了流式包中包含了流式包中包含了流式包中包含了流式I/OI/O所需要的所有类。所需要的所有类。所需要的所有类。所需要的所有类。流式流式流式流式I/OI/O类根据操作的数据类型(类根据操作的数据类型(类根据操作的数据类型(类根据操作的数据类型(1616位字符或字节)位字符或字节)位字符或字节)位字符或字节)分成两个层次体系(字节流和字符流)。分成两个层次体系(字节流和字符流)。分成两个层次体系(字节流和字符流)。分成两个层次体系(字节流和字符流)。字节流:流中的数据以字节流:流中的数据以8位字节为单位进行读写,以位字节为单位进行读写,以InputStream与与OutputStream为基础类。为基础类。字符流:流中的数据以字符流:流中的数据以16位字节为单位进行读写,以位字节为单位进行读写,以Reader与与Writer为基础类。为基础类。Java中的流常指的是字节流。中的流常指的是字节流。5两种流类的体系InputStream和和OutputStream是字节流的两个顶层父类。它是字节流的两个顶层父类。它们提供了输入流类和输出流类的能用们提供了输入流类和输出流类的能用API。6字节流字节流输入流类层次输入流类层次带阴影的类是节点流,其它类是过滤流带阴影的类是节点流,其它类是过滤流7InputStream 方法方法三个基本三个基本read()方法方法int read()/读一个字节返回读一个字节返回int read(byte )/将数据读入将数据读入byte,返回读的字节数返回读的字节数int read(byte,int offset,int length)/将读入的数据放将读入的数据放入一个字节数组中,并返回所读字节数。两个整形参数表示所读入一个字节数组中,并返回所读字节数。两个整形参数表示所读入数据在数组入数据在数组b中的存放位置。中的存放位置。其它方法其它方法void close()/关闭流。自顶向下关闭关闭流。自顶向下关闭Filter streamint available()/返回未读的字节数返回未读的字节数long skip(long n)/跳过跳过n个字节个字节 流的回读方法流的回读方法 boolean markSupported()/测试打开的流是否支持书签测试打开的流是否支持书签void mark(int readlimt)/标记当前流,并建立标记当前流,并建立readlimt大大 小的缓冲区小的缓冲区void reset()/返回到标签出返回到标签出 8字节流字节流输出流类层次输出流类层次带阴影的类是节点流,其它类是过滤流带阴影的类是节点流,其它类是过滤流9OutputStream方法方法三个基本的三个基本的write()方法方法void write(int)/写一个字节写一个字节void write(byte)/写一个字节数组写一个字节数组void write(byte,int offset,int length)其它方法其它方法void close()void flush()/强行写强行写一般在调用一般在调用close()方法关闭流前,可以先调用方法关闭流前,可以先调用flush()方法方法10字符流字符流 Reader和和Writer是字符流的两个顶层抽象超类。是字符流的两个顶层抽象超类。Reader和和Writer 类实现字节和字符间的自动转换。类实现字节和字符间的自动转换。每一个核心输入、输出流,都有相应的每一个核心输入、输出流,都有相应的Reader和和Writer版本。版本。11Reader的类层次的类层次带阴影的类是节点流,其它类是过滤流带阴影的类是节点流,其它类是过滤流12Reader的基本方法的基本方法int read()int read();/读单个字符读单个字符int read(char cbuf)int read(char cbuf);/读字符放入数组中读字符放入数组中int read(char cbuf,int offset,int length)int read(char cbuf,int offset,int length);/读字符放入数组的指定位置读字符放入数组的指定位置 void close()/关闭流。关闭流。long skip(long n)/跳过跳过n个字符个字符boolean markSupported()/测试打开的流是否支持书签测试打开的流是否支持书签void mark(int)/标记当前流,并建立标记当前流,并建立int大小缓冲区大小缓冲区void reset()/返回标签出返回标签出 boolean ready()/测试当前流是否准备好进行读测试当前流是否准备好进行读13Writer的类层次的类层次带阴影的类是节点流,其它类是过滤流带阴影的类是节点流,其它类是过滤流14Writer的基本方法的基本方法int write(int c);/int write(int c);/写单个字符写单个字符int write(char cbuf);/int write(char cbuf);/写字符数组写字符数组int write(char cbuf,int offset,int length);int write(char cbuf,int offset,int length);int write(String str);int write(String str);int write(String str,int offset,int length);int write(String str,int offset,int length);void close()/关闭流关闭流void flush()/强行写强行写15字节流与字符流的比较字节流与字符流的比较 Reader Reader 和和 InputStreamInputStream以及以及Writer Writer 与与 OutputStream定定义的义的API类似,但操作的数据类型不同。类似,但操作的数据类型不同。所有的流所有的流InputStreamInputStream、OutputStream 、ReaderReader、Writer Writer 在创建时自动打开;程序中可以调用在创建时自动打开;程序中可以调用closeclose方法关闭方法关闭流,否则流,否则JavaJava运行环境的垃圾收集器将隐含将流关闭。运行环境的垃圾收集器将隐含将流关闭。16JavaJava节节点流点流 I/O Streams I/O Streams Type of I/OType of I/OType of I/OType of I/O流类名称流类名称流类名称流类名称StreamsStreamsStreamsStreams描述描述描述描述DescriptionDescriptionDescriptionDescriptionMemoryMemory CharArrayReaderCharArrayReaderCharArrayReaderCharArrayReaderCharArrayWriterCharArrayWriterCharArrayWriterCharArrayWriterByteArrayInputStreamByteArrayInputStreamByteArrayInputStreamByteArrayInputStreamByteArrayOutputStreamByteArrayOutputStreamByteArrayOutputStreamByteArrayOutputStream 从从从从/向内存数组读写数据向内存数组读写数据向内存数组读写数据向内存数组读写数据.StringReaderStringReaderStringReaderStringReaderStringWriterStringWriterStringWriterStringWriterStringBufferInputStreamStringBufferInputStreamStringBufferInputStreamStringBufferInputStream 从从从从/向内存字符串读写数据向内存字符串读写数据向内存字符串读写数据向内存字符串读写数据 PipePipe PipedReaderPipedReaderPipedReaderPipedReaderPipedWriterPipedWriterPipedWriterPipedWriterPipedInputStreamPipedInputStreamPipedInputStreamPipedInputStreamPipedOutputStreamPipedOutputStreamPipedOutputStreamPipedOutputStream 实现管道的输入和输出实现管道的输入和输出实现管道的输入和输出实现管道的输入和输出 FileFile FileReaderFileReaderFileReaderFileReaderFileWriterFileWriterFileWriterFileWriterFileInputStreamFileInputStreamFileInputStreamFileInputStreamFileOutputStreamFileOutputStreamFileOutputStreamFileOutputStream 统称为文件流。对文件进行统称为文件流。对文件进行统称为文件流。对文件进行统称为文件流。对文件进行读、写操作读、写操作读、写操作读、写操作 17JavaJava过滤过滤流流 I/O Streams I/O Streams Type of I/OType of I/OType of I/OType of I/OStreamsStreamsStreamsStreamsDescriptionDescriptionDescriptionDescriptionObjectObjectSerializationSerialization对对象象I/OI/O ObjectInputStreamObjectInputStreamObjectInputStreamObjectInputStreamObjectOutputStreamObjectOutputStreamObjectOutputStreamObjectOutputStream 对象的输入、输出对象的输入、输出对象的输入、输出对象的输入、输出 DataDataConversionConversion数据数据转换转换DataInputStreamDataInputStreamDataInputStreamDataInputStreamDataOutputStreamDataOutputStreamDataOutputStreamDataOutputStream 读、写基本数据类型读、写基本数据类型读、写基本数据类型读、写基本数据类型 PrintingPrinting打印流打印流 PrintWriterPrintWriterPrintWriterPrintWriterPrintStreamPrintStreamPrintStreamPrintStream 包含方便的打印方法包含方便的打印方法包含方便的打印方法包含方便的打印方法 BufferingBuffering 缓存缓存I/OI/O BufferedReaderBufferedReaderBufferedReaderBufferedReaderBufferedWriterBufferedWriterBufferedWriterBufferedWriterBufferedInputStreamBufferedInputStreamBufferedInputStreamBufferedInputStreamBufferedOutputStreamBufferedOutputStreamBufferedOutputStreamBufferedOutputStream 在读入或写出时,对数据进在读入或写出时,对数据进在读入或写出时,对数据进在读入或写出时,对数据进行缓存,以减少行缓存,以减少行缓存,以减少行缓存,以减少I/OI/O的次数。的次数。的次数。的次数。18I/O StreamsI/O Streams Type of I/OType of I/OType of I/OType of I/OStreamsStreamsStreamsStreamsDescriptionDescriptionDescriptionDescriptionFilteringFiltering流流流流过滤过滤过滤过滤 FilterReaderFilterReaderFilterReaderFilterReaderFilterWriterFilterWriterFilterWriterFilterWriterFilterInputStreamFilterInputStreamFilterInputStreamFilterInputStreamFilterOutputStreamFilterOutputStreamFilterOutputStreamFilterOutputStream 过滤流过滤流过滤流过滤流,在数据进行读或写时,在数据进行读或写时,在数据进行读或写时,在数据进行读或写时进行过滤。进行过滤。进行过滤。进行过滤。ConcatenationConcatenation 流流流流连连连连接接接接SequenceInputStreamSequenceInputStreamSequenceInputStreamSequenceInputStream 把多个输入流连接成一个输入把多个输入流连接成一个输入把多个输入流连接成一个输入把多个输入流连接成一个输入流流流流 CountingCounting 流数据流数据流数据流数据计计计计数数数数LineNumberReaderLineNumberReaderLineNumberReaderLineNumberReaderLineNumberInputStreamLineNumberInputStreamLineNumberInputStreamLineNumberInputStream 在读入数据时对行记数在读入数据时对行记数在读入数据时对行记数在读入数据时对行记数 Peeking AheadPeeking Ahead 流流流流预读预读预读预读PushbackReaderPushbackReaderPushbackReaderPushbackReaderPushbackInputStreamPushbackInputStreamPushbackInputStreamPushbackInputStream 通过缓存机制,进行预读通过缓存机制,进行预读通过缓存机制,进行预读通过缓存机制,进行预读 Converting Converting between Bytes between Bytes and Charactersand Characters字字字字节节节节与字符与字符与字符与字符转换转换转换转换 InputStreamReaderInputStreamReaderInputStreamReaderInputStreamReaderOutputStreamWriterOutputStreamWriterOutputStreamWriterOutputStreamWriter 按照一定的编码按照一定的编码按照一定的编码按照一定的编码/解码标准将字解码标准将字解码标准将字解码标准将字节流转换为字符流节流转换为字符流节流转换为字符流节流转换为字符流19文件流文件流文件流类包括:文件流类包括:FileReader,FileWriter,FileInputStream,FileOutputStream创建文件流:常用文件名或创建文件流:常用文件名或File类的对象创建文件流。类的对象创建文件流。例:例:通过文件字节流实现文件复制通过文件字节流实现文件复制 CopyBytes.java,利用,利用FileInputStream,FileOutputStream。通过文件字符流实现文件复制通过文件字符流实现文件复制 Copy.java,利用,利用FileReader,FileWriter,将将farrago.txt的内容拷贝到的内容拷贝到outagain.txt中。中。20管道流管道流管道用来把一个线程的输出连接到另一个线程的输入。管道用来把一个线程的输出连接到另一个线程的输入。PipedReader/PipedInputStream实现管道的输入端;实现管道的输入端;PipedWriter/PipedOutputStream实现管道的输出端。实现管道的输出端。管道流模型:管道流模型:管道输入管道输出管道输入线程1连接线程2线程3连接管道输出21将一个线程的输出流直接挂在另一个线程的输入流,建立管将一个线程的输出流直接挂在另一个线程的输入流,建立管道,实现线程间数据交换。道,实现线程间数据交换。PipedInputStream pin=new PipedInputStream();PipedOutputStream pout=new PipedOutputStream(pin);或:或:PipedInputStream pin=new PipedInputStream();PipedOutputStream pout=new PipedOutputStream();pin.connect(pout);或或pout.connect(pin)。管道流的创建管道流的创建22管道流示例管道流示例Rhymingwords.java,输入一组单词,先将每个单词逆序,输入一组单词,先将每个单词逆序,再将所有单词排序,最后将这些单词逆序输出。再将所有单词排序,最后将这些单词逆序输出。程序处理流程:程序处理流程:23示例中的管道流示例中的管道流例例7324是过滤流。是过滤流。数据从原始流成块读入或将数据积累到数据从原始流成块读入或将数据积累到一个大数据块后再成批输出。一个大数据块后再成批输出。基本方法:基本方法:int read()int read(byte,int offset,int length)int write(int c)int write(int c)void write(byte,int offset,int length)BufferedReader增加增加readLine()方法。方法。BufferedInputStream/BufferedOutputStream25 DataInputStream和和DataOutputStream(Filter stream)读写基本数据类型:读写基本数据类型:DataInputStream方法方法 byte readByte()boolean readBoolean()long readLong()char readChar()double readDouble()float readFloat()short readShort()int readInt()DataOutputStream 方法方法 void writeByte(byte)void writeBoolean(boolean)void writeLong(long)void writeChar(char)void writeDouble(double)void writeFloat(float)void writeShort(short)void writeInt(int)void writeBytes(String)void writeChars(String)DataInputStream/DataOutputStream数据流数据流26示例示例/example of using inputData&outputData/example of using inputData&outputData/DataIOTeat.java/DataIOTeat.javaimport java.io.*;import java.io.*;public class DataIOTest public class DataIOTest public static void main(String public static void main(String args)args)throws IOExceptionthrows IOException /write the data out /write the data out DataOutputStream out=new DataOutputStream(DataOutputStream out=new DataOutputStream(new FileOutputStream(invoice1.txt);new FileOutputStream(invoice1.txt);double prices=19.99,9.99,15.99,3.99,4.99;double prices=19.99,9.99,15.99,3.99,4.99;int units=12,8,13,29,50;int units=12,8,13,29,50;String descs=Java T-shirt,String descs=Java T-shirt,Java Mug,Java Mug,Duke Juggling Dolls,Duke Juggling Dolls,Java Pin,Java Pin,Java Key Chain;Java Key Chain;27 for(int i=0;i prices.length;i+)for(int i=0;i prices.length;i+)out.writeDouble(pricesi);out.writeDouble(pricesi);out.writeChar(t);out.writeChar(t);out.writeInt(unitsi);out.writeInt(unitsi);out.writeChar(t);out.writeChar(t);out.writeChars(descsi);out.writeChars(descsi);out.writeChar(n);out.writeChar(n);out.close();out.close();/read it in again /read it in again DataInputStream in=new DataInputStream(new DataInputStream in=new DataInputStream(new FileInputStream(invoice1.txt);FileInputStream(invoice1.txt);double price;double price;int unit;int unit;String desc;String desc;double total=0.0;double total=0.0;28try try while(true)while(true)price=in.readDouble();price=in.readDouble();in.readChar();/throws out the tab in.readChar();/throws out the tab unit=in.readInt();unit=in.readInt();in.readChar();/throws out the tab in.readChar();/throws out the tab desc=in.readLine();desc=in.readLine();System.out.println(Youve ordered +System.out.println(Youve ordered +unit+units of +unit+units of +desc+at$+price);desc+at$+price);total=total+unit*price;total=total+unit*price;catch(EOFException e)catch(EOFException e)System.out.println(For a TOTAL of:$+total);System.out.println(For a TOTAL of:$+total);in.close();in.close();Youve ordered 12 units of Java T-shirt at$19.99Youve ordered 8 units of Java Mug at$9.99Youve ordered 13 units of Duke Juggling Dolls at$15.99Youve ordered 29 units of Java Pin at$3.99Youve ordered 50 units of Java Key Chain at$4.99For a TOTAL of:$892.8829标准输入输出标准输入输出uSystem.in public static final InputStream inuSystem.out public static final PrintStream out System.err public static final PrintStream err示例示例7-530文件文件 文件类提供获取文件基本信息,以及文件类提供获取文件基本信息,以及其它与文件相关的操作。其它与文件相关的操作。创建新的文件对象:创建新的文件对象:File myFile;myFile=new File(“mymotd”);myFile=new File(“”,”mymotd”);31文件测试与实用方法文件测试与实用方法文件名文件名String getName()String getPath()String getAbsolutePath()String getParent()boolean renameTo(File newName)文件测试文件测试boolean exists()boolean canWrite()boolean canRead()boolean isFile()boolean isDirectory()boolean isAbsolute()32随机存取文件例:从例:从zip文件中读取特定文件文件中读取特定文件33随机存取文件类随机存取文件类-RandomAccessFile创建随机存取文件:创建随机存取文件:myRAFile=new RandomAccessFile(String name,String mode);myRAFile=new RandomAccessFile(File file,String mode);常用的方法:常用的方法:数据读写方法;数据读写方法;long getFilePointer();/返回当前文件指针返回当前文件指针void seek(long pos);/文件指针定位到指定位置文件指针定位到指定位置long length();/返回文件长度返回文件长度“r”,”w”,”rw”34对象输入对象输入/输出流输出流把对象保存到外存,称为永久化。把对象保存到外存,称为永久化。实现接口类的对象可以被输入实现接口类的对象可以被输入/输出。输出。只有对象的数据被保存,方法与构造函数不被保存。只有对象的数据被保存,方法与构造函数不被保存。以以transient关键字标记的数据不被保存。关键字标记的数据不被保存。public class MyClass implements Serializable public transient Thread myThread;Private transient String customerID;private int total;35输出对象输出对象public class SerializeDate SerializeDate()Date d=new Date();try FileOutputStream f=new FileOutputStream(“date.ser”);ObjectOutputStream s=new ObjectOutputStream(f);s.writeObject(d);f.close();catch(IOException e)e.printStackTrace();public static void main(String args)SerializeDate b=new SerializeDate();在在java.util中,中,实现了实现了Serialization接口接口36输入对象输入对象public class UnSerializeDate UnSerializeDate()Date d=null;try FileInputStream f=new FileInputStream(“date.ser”);ObjectInputStream s=new ObjectInputStream(f);d=(Date)s.readObject();f.close();catch(Exception e)e.printStackTrace();public static void main(String args)UnSerializeDate a=new UnSerializeDate();37