章Java数据流

上传人:沈*** 文档编号:172985011 上传时间:2022-12-08 格式:PPT 页数:52 大小:185.02KB
返回 下载 相关 举报
章Java数据流_第1页
第1页 / 共52页
章Java数据流_第2页
第2页 / 共52页
章Java数据流_第3页
第3页 / 共52页
点击查看更多>>
资源描述
第第11章章 Java数据流数据流内容提要内容提要大部分程序都需要数据的输入和输出,大部分程序都需要数据的输入和输出,从键盘读取数据,从键盘读取数据,向文件写入数据或从文件获取数据,向文件写入数据或从文件获取数据,将数据通过打印机打印出来,将数据通过打印机打印出来,通过网络进行信息交换通过网络进行信息交换本章介绍本章介绍Java标准程序库中各种处理标准程序库中各种处理I/O 操作的类操作的类的用途及使用方法。的用途及使用方法。第第1节节 输入输入/输出概念输出概念一、一、流的概述流的概述Java使用流使用流(stream)来执行输入输出来执行输入输出(I/O)的功能,流是一种数据的源头和目的之的功能,流是一种数据的源头和目的之间的通信途径。间的通信途径。用于读入数据称为输入流用于读入数据称为输入流(input stream),用于写出数据称为输出流用于写出数据称为输出流(output stream)。当使用流时需要使用当使用流时需要使用java.io包,因此在涉及数包,因此在涉及数据流操作的程序中都要先导入据流操作的程序中都要先导入java.io包:包:import java.io.*;二、二、I/O类层次结构类层次结构Java提供超过提供超过60个不同的流类型,这些流个不同的流类型,这些流类包含在上面提到的类包含在上面提到的java.io包中,包中,四个基本的抽象类:四个基本的抽象类:InputStream、OutputStream、Reader和和Writer。你不能创建这四个类型的对象,但是其他的方法的返回值可以是他们事实上,我们经常使用的是事实上,我们经常使用的是派生自他们的子类。派生自他们的子类。java.io包的结构如图包的结构如图11-1:三、三、标准输入输出标准输入输出 在在System类中有三个静态域类中有三个静态域System.in、System.out和和System.err。可以在标准位置使用这三个系统流进行可以在标准位置使用这三个系统流进行I/O操作。操作。public static InputStream in 读取字符数据的标准输入流。读取字符数据的标准输入流。public static PrintStream out 显示或打印输出信息的标准输出流显示或打印输出信息的标准输出流 public static PrintStream err 输出错误信息的标准错误流。输出错误信息的标准错误流。例例11-1:标准输入输出举例标准输入输出举例程序运行如下:程序运行如下:输入:输入:a,b,c,d 输出:输出:a,b,c,d输入:输入:Z(注:输入复合键(注:输入复合键CTRL-Z)输出:输出:program end第第2节节 文件的顺序访问文件的顺序访问 一、一、字节流字节流 字节流是用来读写字节流是用来读写8位的数据,由于不会对数据位的数据,由于不会对数据作任何转换,因此可以用来处理二进制的数据。作任何转换,因此可以用来处理二进制的数据。(一)、(一)、OutputStream(二)、(二)、InputStream(三)、(三)、FileInputStream和和FileOutputStream(四)、(四)、ByteArrayInputStream和和ByteArrayOutputStream(五)、(五)、BufferedInputStream和和BufferedOutputStream InputStreamFileInputStreamStringBufferInputStreamByteArrayInputStreamSequenceInputStreamPipedInputStreamFilterInputStreamBufferedInputStreamLineNumberInputStreamDataInputStreamPushbackInputStreamOutputStreamFileOutputStreamByteArrayOutputStreamPipedOutputStreamFilterOutputStreamBufferedOutputStreamPrintStreamDataOutputStream输入流输入流 输出流的类继承关系输出流的类继承关系(一)、(一)、OutputStreamOutputStream为所有的字节流输出流的父类,因为所有的字节流输出流的父类,因此所有源自于它的类也会继承下列的方法:此所有源自于它的类也会继承下列的方法:void write(int b):写入一个字节的数据。写入一个字节的数据。void write(byte buttfer):讲数组讲数组buffer的数据写的数据写入流。入流。void write(byte,int offset int len):从从bufferoffset开始,写入开始,写入len个字节的数据。个字节的数据。void flush():强制将强制将buffer内的数据写入流。内的数据写入流。void close():关闭流。关闭流。(二)、(二)、InputStreamInputStream为所有的字节输入流的父类,因此为所有的字节输入流的父类,因此所有源于它的类也会继承下列的方法:所有源于它的类也会继承下列的方法:int read():读入一个字节的数据,如果已达到文读入一个字节的数据,如果已达到文件的末端件的末端,返回值为返回值为-1。int read(byte buffer):读出读出buffer大小的数据,大小的数据,返回值为实际所读出的字节。返回值为实际所读出的字节。int read(byte buffer,int offset,int len):将读出的将读出的数据从数据从bufferoffset开始,写入开始,写入len个字节至个字节至buffer中,返回值为实际所读出的字节数目。中,返回值为实际所读出的字节数目。int available():返回流内可供读取的字节数目。返回流内可供读取的字节数目。long skip(long n):跳过跳过n个字节的数据,返回值个字节的数据,返回值为实际所跳过的数据数。为实际所跳过的数据数。void close():关闭流。关闭流。(三)、(三)、FileInputStream和和FileOutputStreamFileInputStream用来读取一个文件用来读取一个文件,FileOutPutStream用用来将数据写入文件。来将数据写入文件。常用的构造函数如下:常用的构造函数如下:FileInputStream(String name):打开文件打开文件name用来读取用来读取数据。数据。FileInputStream(File file):打开文件打开文件file用来读取数据。用来读取数据。FileOutputStream(String name):打开文件打开文件name用来写入用来写入数据。数据。FileOutputStream(File file):打开文件打开文件file用来写入数据。用来写入数据。FileOutputStream(String name,Boolean append):打开文打开文件件name用来写入数据,若用来写入数据,若append为为true,则写入的数据则写入的数据会加到原有文件后面,否则,覆盖原有的文件。会加到原有文件后面,否则,覆盖原有的文件。将将FileExam.java复制为复制为FileExam.java.bak。1)程序首先打开程序首先打开FileExam.java文件,文件,2)使用使用read()将其内容逐字节读取出来(如果将其内容逐字节读取出来(如果返回值为返回值为-1,则表明已到达文件尾端),则表明已到达文件尾端),3)再使用再使用write()将读出的字节逐一写入另一个将读出的字节逐一写入另一个文件文件FileExam.java.bak中。中。4)若文件无法打开(例如若文件无法打开(例如FileExam.java不存在)不存在)或无法生成(或无法生成(FileExam.java.bak),会抛出),会抛出FileNotFoundException异常,若读写出错,异常,若读写出错,则会抛出则会抛出IOException异常。异常。5)最后,我们在最后,我们在finally中关闭文件。中关闭文件。例例11-2 FileIO.java(四)、(四)、ByteArrayInputStream和和 ByteArrayOutputStream 1)使用这两个流类可以将数据转换到一个数据类型为字使用这两个流类可以将数据转换到一个数据类型为字节类型的数组(节类型的数组(byte array)中,)中,2)ByteArrayInputStream和和ByteArrayOutputStream并并没有牵涉到真正的文件,他们使用内存(一个流缓冲没有牵涉到真正的文件,他们使用内存(一个流缓冲区)作为区)作为I/O流的源头及目的。流的源头及目的。3)ByteArrayInputStream用来从一个流缓冲区(字节数用来从一个流缓冲区(字节数组)中读入数据,组)中读入数据,4)ByteArrayOutputStream用来将数据转换至一个流缓用来将数据转换至一个流缓冲区中冲区中5)由于流对象的内容存放在内存中,所以可提供较快的由于流对象的内容存放在内存中,所以可提供较快的操作。操作。常用的构造函数如下:常用的构造函数如下:ByteArrayInputStream(byte buffer):生成一个字节数组的输生成一个字节数组的输入流,并指定一个字节数组入流,并指定一个字节数组buffer为此输入流的流缓冲区。为此输入流的流缓冲区。ByteArrayOutputStream():生成一个字节数组的输出流,其生成一个字节数组的输出流,其缓冲区的默认初始大小为缓冲区的默认初始大小为32字节,若有需要,缓冲区的大小字节,若有需要,缓冲区的大小会随之增加。会随之增加。ByteArrayOutputStream(int size):同上,但分配同上,但分配size字节的初字节的初始大小给此缓冲区。始大小给此缓冲区。ByteArrayOutputStream的一些常用方法:的一些常用方法:int size():返回此流缓冲区的大小。返回此流缓冲区的大小。byte toByteArray():生成一个新的字节数组,并将流的内生成一个新的字节数组,并将流的内容复制到此字节数组。容复制到此字节数组。String toString():将流的内容转换为将流的内容转换为String对象。对象。下面程序读入文件下面程序读入文件data.in,将其内容写入内存中(一个字节数将其内容写入内存中(一个字节数组),接着转换为组),接着转换为String对象,并将该对象,并将该String对象内的令牌对象内的令牌解析出来。解析出来。例例11-3 ByteIO.java若输入数据(若输入数据(data.in中的数据)如下:中的数据)如下:Aa 00001 92 69 95Bb 00002 77 92 96则程序输出如下:则程序输出如下:Aa00001926995Bb00002779296(五)、(五)、BufferedInputStream和和BufferedOutputStream 有时候我们在处理来自输入流的数据时,希望能够有时候我们在处理来自输入流的数据时,希望能够重设流并回到较靠前的位置。重设流并回到较靠前的位置。这需要使用缓冲来实现,通过使用这需要使用缓冲来实现,通过使用BufferedInputStream类,可以利用类,可以利用mark和和reset方方法在缓冲的输入流中往回移动;法在缓冲的输入流中往回移动;同时,通过使用同时,通过使用BufferedOutputStream类,可以先将类,可以先将输出写到内存缓冲区,再使用输出写到内存缓冲区,再使用flush方法将数据写方法将数据写入磁盘,而不必每输出一个字节就向磁盘中写一入磁盘,而不必每输出一个字节就向磁盘中写一次数据。次数据。1BufferedInputStream类的构造函数和方法类的构造函数和方法 BufferedInputStream(InputStream in):构造一个构造一个BufferedInputStream。BufferedInputStream(InputStream in,int size):构造一个构造一个具有给定的缓冲区大小的具有给定的缓冲区大小的BufferedInputStream。int available():得到可以从这个输入流读取的字节数。得到可以从这个输入流读取的字节数。void close():关闭流。关闭流。void mark(int readlimit):在这个输入流的当前位置做标记。在这个输入流的当前位置做标记。boolean markSupported():检查这个输入流是否支持检查这个输入流是否支持mark和和reset方法。方法。int read():读取数据的下一个字节。读取数据的下一个字节。int read(byte b,int off,int len):从这个字节输入流的给从这个字节输入流的给定偏移量处开始读取字节,存储到给定的字节数组。定偏移量处开始读取字节,存储到给定的字节数组。void reset():将缓冲区重新设置到加标记的位置。将缓冲区重新设置到加标记的位置。long skip(long n):跳过跳过n个字节的数据。个字节的数据。2BufferedOutputStream类的构造函数和方法类的构造函数和方法:BufferedOutputStream(OutputStream out):构造一个构造一个BufferedOutputStream。BufferedOutputStream(OutputStream out,int size):构构造一个具有给定的缓冲区大小的造一个具有给定的缓冲区大小的BufferedOutputStream。void flush():刷新这个流。刷新这个流。void write(byte b,int off,int len):将给定的字节数组将给定的字节数组写到这个缓冲输出流。写到这个缓冲输出流。void write(int b):将给定的字节写到这个缓冲输出流。将给定的字节写到这个缓冲输出流。下面我们通过一个例子来演示下面我们通过一个例子来演示BufferedInputStream类的类的作用,程序读取并显示字节数组中的字符,当遇作用,程序读取并显示字节数组中的字符,当遇到到%字符时,如果和下一个字符时,如果和下一个%字符之间的字符没字符之间的字符没有空格,则两个有空格,则两个%之间的字符不显示:之间的字符不显示:例例11-4 bufinstreams.java运行结果:运行结果:This is a test of buffer#Streams 二、二、字符流字符流尽管字节流更快更高效,但是人们读起来十分困尽管字节流更快更高效,但是人们读起来十分困难(因为是二进制)。难(因为是二进制)。接下来我们讲述文本格式的输入输出,即字符流。接下来我们讲述文本格式的输入输出,即字符流。字符流主要是用来支持字符流主要是用来支持Unicode的文字内容,绝的文字内容,绝大多数在字节流中所提供的类,都有相对应的大多数在字节流中所提供的类,都有相对应的字符流的类。字符流的类。ReaderBufferedReaderInputStreamReaderFileReaderWriterPrintWriterBufferedWriterOutputStreamWriterFileWriter(一)、(一)、Reader和和Writer Reader是所有输入字符流的基类,是所有输入字符流的基类,Writer是所有输出字符流的基类。是所有输出字符流的基类。你可以使用从这两个类派生出的类来读写你可以使用从这两个类派生出的类来读写字符流,这两个类常用的方法与字符流,这两个类常用的方法与InputStream、OutputStream相类似,区相类似,区别在于参数内的别在于参数内的byte需要改为需要改为char。(二)、(二)、InputStreamReader和和OutputStreamWriter 为了从键盘读取按键,常常从为了从键盘读取按键,常常从System.in构构造一个造一个InputStreamReader流,然后使用流,然后使用InputStreamReader类的类的read方法读取用方法读取用户输入的内容。户输入的内容。而而OutputStreamWriter与与InputStreamReader相对,支持输出流。相对,支持输出流。1InputStreamReader类的构造函数和方法:类的构造函数和方法:InputStreamReader(InputStream in):构造一个构造一个InputStreamReader。InputStreamReader(InputStream in,String enc):使用命名的字符编码构造一个使用命名的字符编码构造一个InputStreamReader。void close():关闭流。关闭流。String getEncoding():得到字符编码的名称。得到字符编码的名称。int read():读取一个字符。读取一个字符。int read(char cbuf,int off,int len):将字符读到将字符读到数组中。数组中。boolean ready():如果这个流已准备好,返回如果这个流已准备好,返回True。2OutputStreamWriter类的构造函数和方法:类的构造函数和方法:OutputStreamWriter(OutputStream out):构造一个构造一个OutputStreamWriter。OutputStreamWriter(OutputStream out,String enc):使使用命名的字符编码构造一个用命名的字符编码构造一个OutputStreamWriter。void close():关闭流。关闭流。void flush():刷新流。刷新流。String getEncoding():得到这个流使用的字符编码的名称。得到这个流使用的字符编码的名称。void write(char cbuf,int off,int len):写字符数组的一部写字符数组的一部分。分。void write(int c):写一个字符。写一个字符。void write(String str,int off,int len):写一个字符串的一部写一个字符串的一部分。分。下面的程序利用下面的程序利用InputStreamReader从键盘接受输入,再将输从键盘接受输入,再将输入的字符显示出来:入的字符显示出来:例例11-5 程序运行结果如下:程序运行结果如下:输入:输入:a,b,c,d 输出:输出:a,b,c,d输入:输入:1,2,3,4 输出:输出:1,2,3,4输入:输入:Z 输出:输出:Bye(三)、(三)、FileReader 你可以使用你可以使用FileReader类创建一个字符流来读取类创建一个字符流来读取一个文件,一个文件,FileReader类只具有从类只具有从InputStreamReader继承的功能,但是它有自继承的功能,但是它有自己的构造函数:己的构造函数:FileReader(File file):构造一个构造一个FileReader。FileReader(FileDescriptor fd):从一个文件描从一个文件描述符构造一个述符构造一个FileReader。FileReader(String filename):从一个文件名构从一个文件名构造一个造一个FileReader。在下面的例子中,我们打开一个文件在下面的例子中,我们打开一个文件file.txt(内容内容为:为:”Hello from file”),将文件的内容读到缓冲将文件的内容读到缓冲区,然后显示数据:区,然后显示数据:例例11-6 程序运行结果如下:程序运行结果如下:Hello from file(四)、(四)、FileWriter FileWriter与与FileReader对应,用来将字符缓冲区中的数对应,用来将字符缓冲区中的数据写到文件中。这个类也只定义了构造函数,此外只据写到文件中。这个类也只定义了构造函数,此外只具有从具有从OutputStreamWriter继承的功能。继承的功能。FileWriter(File file):从从File对象构造一个对象构造一个FileWriter。FileWriter(FileDescriptor fd):从文件描述符构造一从文件描述符构造一个个FileWriter。FileWriter(String filename):从文件名构造一个从文件名构造一个FileWriter。FileWriter(String filename,boolean append):构造一进构造一进行附加的行附加的FileWriter。在下面例子中,我们分别采用三种方式:逐字符地写数在下面例子中,我们分别采用三种方式:逐字符地写数据、一次写入所有数据、分批写数据,使用据、一次写入所有数据、分批写数据,使用FileWriter:例例11-7 程序执行后:程序执行后:file1.txt和和file2.txt的内容为:的内容为:This is a string of text.file3.txt的内容为:的内容为:is a strin(五)、(五)、CharArrayReader和和CharArrayWriter 可以用来从数组读写字符。可以用来从数组读写字符。1CharArrayReader类的构造函数和方法如下:类的构造函数和方法如下:CharArrayReader(char buf):从给定的字符数组构造一个从给定的字符数组构造一个CharArrayReader。CharArrayReader(char buf,int offset,int length):同上。同上。void close():关闭流。关闭流。void mark(int readAheadLimit):在流中的当前位置加标记。在流中的当前位置加标记。boolean markSupported():如果这个流支持如果这个流支持mark操作,那么操作,那么返回返回True。int read():读取一个字符。读取一个字符。int read(char b,int off,int len):将字符读入数组的一部分。将字符读入数组的一部分。boolean ready():检查这个流是否已经准备好被读取。检查这个流是否已经准备好被读取。void reset():将流重设到最近的标记。将流重设到最近的标记。long skip(long n):跳过跳过n个字符。个字符。2CharArrayWriter类的构造函数和方法如下:类的构造函数和方法如下:CharArrayWriter():构造一个构造一个CharArrayWriter。CharArrayWriter(int initialSize):构造一个具有给定初始大小构造一个具有给定初始大小的的CharArrayWriter。void close():关闭流。关闭流。void flush():刷新流。刷新流。void reset():重设流。重设流。int size():得到缓冲区的当前大小。得到缓冲区的当前大小。char toCharArray():得到输入数据的副本。得到输入数据的副本。String toString():将输入数据转换为字符串。将输入数据转换为字符串。void write(char c,int off,int len):将字符写到缓冲区中。将字符写到缓冲区中。void write(int c):将一个字符写到缓冲区中。将一个字符写到缓冲区中。void write(String str,int off,int len):将字符串的一部分写到缓将字符串的一部分写到缓冲区中。冲区中。void writeTo(Writer out):将缓冲区的内容写到另一个字符流将缓冲区的内容写到另一个字符流中。中。下面我们演示下面我们演示CharArrayReader类的作用,该例从字符数组中逐类的作用,该例从字符数组中逐个读取字符并显示:个读取字符并显示:例例11-8 程序运行结果为:程序运行结果为:This is a string of text.第第3节节 文件的随机访问文件的随机访问前面所提及的流都是顺序的前面所提及的流都是顺序的I/O流,无法随流,无法随机的读写文件的某个位置,如果需要对机的读写文件的某个位置,如果需要对文件进行随机的访问,必须使用文件进行随机的访问,必须使用RandomAccessFile类,其常用的构造函类,其常用的构造函数如下:数如下:RandomAccessFile(File file,String mode):构造一个随机访构造一个随机访问文件流,问文件流,file为被访问的文件对象,为被访问的文件对象,mode是用来指定存是用来指定存取的模式,取的模式,mode可以为可以为r(读)、(读)、w(写)或(写)或rw(读写)。(读写)。RandomAccessFile(String name,String mode):构造一个随构造一个随机访问文件流,以便访问由字符串机访问文件流,以便访问由字符串name指定名字的文件,指定名字的文件,mode参数使用同上。参数使用同上。RandomAccessFile类提供的用来读取某种基本数据类型的类提供的用来读取某种基本数据类型的数据或字符串的方法如下:数据或字符串的方法如下:boolean readBoolean()byte readByte()char readChar()double readDouble()float readFloat()int readInt()long readLong()short readShort()String readLine()RandomAccessFile类提供的用来向文件中写入类提供的用来向文件中写入某种基本类型的数据或字符串的方法如下:某种基本类型的数据或字符串的方法如下:void writeByte(byte b)void writeBytes(String s)void writeChar(char c)void writeChars(String s)void writeDouble(double d)void writeFloat(float f)void writeInt(int i)void writeLong(long l)void writeShort(short s)和目前文件位置有关的方法:和目前文件位置有关的方法:void seek(long pos):将文件指针移到将文件指针移到pos(不可为负)的位置,这是相对于文(不可为负)的位置,这是相对于文件的初始位置的值(初始值为件的初始位置的值(初始值为0)。)。long getFilePointer():得到目前文件指得到目前文件指针的位置(相对于文件初始位置)。针的位置(相对于文件初始位置)。long length():得到文件的长度。得到文件的长度。第第4节节 目录和文件管理目录和文件管理File类是一个和流无关的类。类是一个和流无关的类。File对象可以用来生成与文件(及其所在的路径)对象可以用来生成与文件(及其所在的路径)或目录结构相关的对象,或目录结构相关的对象,由于不同的系统可能会有不同的目录结构表示法,由于不同的系统可能会有不同的目录结构表示法,使用使用File类可以达到与系统无关的目的(使用抽类可以达到与系统无关的目的(使用抽象的路径表示法)。象的路径表示法)。类类java.io.File提供了获得文件基本信息及操作文提供了获得文件基本信息及操作文件的一些方法。件的一些方法。File类的构造函数:类的构造函数:File(String path):将一个代表路径的字符串转换为抽象的将一个代表路径的字符串转换为抽象的路径表示法。路径表示法。File(String parent,String child):parent代表目录,代表目录,child代表文件(不可为空)。代表文件(不可为空)。File(File parent,String child):同上。同上。例如:例如:File myFile;myFile=new File(“file.txt”);或或myFile=new File(“/”,”file.txt”);或或File myDir=new File(“/”);myFile=new File(myDir,”file.txt”);使用何种构造函数经常由其他被访问的文使用何种构造函数经常由其他被访问的文件对象来决定。件对象来决定。例如,例如,当在应用程序中只用到一个文件时,那么当在应用程序中只用到一个文件时,那么使用第一种构造函数最为实用;使用第一种构造函数最为实用;但是如果使用了一个共同目录下的几个文但是如果使用了一个共同目录下的几个文件,则使用第二种或第三种构造函数会件,则使用第二种或第三种构造函数会更方便。更方便。File类一些常用的方法类一些常用的方法 boolean exists():若该文件或目录存在,返回若该文件或目录存在,返回True。boolean isDirectory():若为目录则返回若为目录则返回True。File listFiles():得到该对象所代表的目录下的得到该对象所代表的目录下的File对象数组。对象数组。String list():同上。同上。long length():得到和该对象相关的文件大小,若不存在,返回得到和该对象相关的文件大小,若不存在,返回0。String toString():得到抽象路径表示法。得到抽象路径表示法。String getParent():得到抽象路径表示法的目录部分。得到抽象路径表示法的目录部分。String getName():得到抽象路径表示法的最后一个部分。得到抽象路径表示法的最后一个部分。boolean renameTo(File newName):将当前将当前File对象所代表的路对象所代表的路径名改为径名改为newName所代表的路径名。若成功,返回所代表的路径名。若成功,返回true。boolean mkdir():生成一个新的目录。若成功,返回生成一个新的目录。若成功,返回True。boolean mkdirs():生成一个新的目录,包含子目录。若成功,生成一个新的目录,包含子目录。若成功,返回返回true。boolean delete():删除目前删除目前File对象代表的文件或目录,目录需对象代表的文件或目录,目录需为空。删除成功,返回为空。删除成功,返回true。例例11-9 使用使用File类的方法得到关于类的方法得到关于文件文件file.txt的信息的信息程序运行结果如下:程序运行结果如下:The file is exist?trueThe file can write?trueThe file can read?trueThe file is a file?trueThe file is a directory?falseThe files name is:file.txtThe files all path is:C:Javafile.txtThe files length is 15第第5节节 其他常用的流处理其他常用的流处理一、管道流一、管道流管道管道(pipe)提供一种线程之间的通信方法,可用提供一种线程之间的通信方法,可用于于IPC(Inter-Process Communication进程间通进程间通信信)或是或是ITC(Inter-Thread Communication线线程间通信程间通信),但不能够在不同主机间进行通信。,但不能够在不同主机间进行通信。一个输入管道是用来接收一个输出管道所写出的一个输入管道是用来接收一个输出管道所写出的数据,因此,一个线程会负责送出数据,因此,一个线程会负责送出(PipedOutputStream对象)数据,而另一个对象)数据,而另一个线程序要负责接收(线程序要负责接收(PipedInputStream对象)对象)这些数据,这些数据,PipedInputStream和和PipedOutputStream对象总是成对出现的。并对象总是成对出现的。并且由于管道的数据流是单向的且由于管道的数据流是单向的(一)、创建一组管道通信可以按照下面步骤进(一)、创建一组管道通信可以按照下面步骤进行行(使用无参数的构造函数使用无参数的构造函数)建立输入流:建立输入流:PipedInputStream pipedinputstream=new PipedInputStream();建立输出流:建立输出流:PipedOutputStream pipedoutputstream=new PipedOutputStream();将输入输出连接起来:将输入输出连接起来:pipedinputstream.connect(pipedoutputstream);或者或者pipedoutputstream.connect(pipedinputstream);(二)、直接建立连接(二)、直接建立连接PipedInputStream pis=new PipedInputStream();PipedOutputStream pos=new PipedOutputStream(pis);或或PipedOutputStream pos=new PipedOutputStream();PipedInputStream pis=new PipedInputStream(pos);二、二、ZIP文件流文件流ZIP文件是存储了一个或多个文件的存档文件,文件是存储了一个或多个文件的存档文件,通常使用压缩格式。通常使用压缩格式。从从Java 1.1起,起,Java能够处理能够处理GZIP和和ZIP格式的格式的存档文件。存档文件。与其他的流不同,处理与其他的流不同,处理ZIP文件的类文件的类ZipInputStream和和ZipOutputStream在在java.util.zip,而不在,而不在java.io中,因此在使用中,因此在使用ZIP文件流时记住要加上文件流时记住要加上:import java.util.*;(一)、将文件写入(一)、将文件写入ZIP文件文件 生成和所要生成的生成和所要生成的ZIP文件相关联的文件相关联的ZipOutputStream对象。对象。一个一个ZIP文件往往不止含有一个压缩文件,我们将每个文件往往不止含有一个压缩文件,我们将每个要加入的文件称为一个要加入的文件称为一个ZIP入口,我们使用入口,我们使用ZipEntry(String fileName)来生成这些来生成这些ZipEntry对象。对象。使用使用putNextEntry(ZipEntry entry)将此将此ZIP入口加入入口加入ZIP文件。文件。将文件内容写入此将文件内容写入此ZIP文件。文件。使用使用closeEntry()结束当前的结束当前的ZIP入口,继续下一个入口,继续下一个ZIP入口。入口。(二)、读取(二)、读取ZIP文件文件 生成和所要读入的生成和所要读入的ZIP文件相关联的文件相关联的ZipInputStream对对象。象。利用利用getNextEntry()得到下一个得到下一个ZIP入口。入口。三、三、DataInputStream和和DataOutputStreamDataInputStream类和类和DataOutputStream类允许类允许通过数据流来读写通过数据流来读写Java的基本数据类型,包括的基本数据类型,包括布尔型、整型、浮点型等。他们的构造函数如布尔型、整型、浮点型等。他们的构造函数如下:下:DataInputStream(InputStream inputstream);DataOutputStream(OutputStream outputstream);1DataInputStream类中处理类中处理java基本数据类型的一些方法:基本数据类型的一些方法:byte readByte()long readLong()double readDouble()int readInt()short readShort()float readFloat()boolean readBoolean()2DataOutputStream类写数据的一些方法:类写数据的一些方法:void writeByte(byte b)void writeInt(int i)void writeShort(short sh)void writeLong(long l)void writeFloat(float f)void writeDouble(double d)void writeBoolean(boolean bl)四、对象流四、对象流Java中的数据流不仅能对基本数据类型的数据进行操作,中的数据流不仅能对基本数据类型的数据进行操作,而且也提供了把对象写入文件或从文件中读取对象的而且也提供了把对象写入文件或从文件中读取对象的功能,这一功能是通过功能,这一功能是通过java.io包中的包中的ObjectInputStream和和ObjectOutputStream两个类实现两个类实现的。的。由于他们和由于他们和DataInputStream及及DataOutputStream有共有共同的接口,因此他们也可使用相同的方法来读取或写同的接口,因此他们也可使用相同的方法来读取或写入数据。入数据。除此之外,这两个类还有如下方法用于读写对象:除此之外,这两个类还有如下方法用于读写对象:void writeObject(Object obj):ObjectOutputStream的方的方法,将对象写入流。法,将对象写入流。Object readObject():ObjectInputStream的方法,将对的方法,将对象读出。象读出。习题十一习题十一9.1 什么叫做流?输入输出流分别对应那两什么叫做流?输入输出流分别对应那两个抽象类?个抽象类?9.2 利用输入输出流编写程序,实现文件拷利用输入输出流编写程序,实现文件拷贝的功能。贝的功能。9.3 编写程序,实现在屏幕上显示文本文件编写程序,实现在屏幕上显示文本文件的功能。的功能。9.4 Reader和和Writer的作用是什么?的作用是什么?
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!