Java语言程序设计课件:10课ch10 IO与流_第1页
Java语言程序设计课件:10课ch10 IO与流_第2页
Java语言程序设计课件:10课ch10 IO与流_第3页
Java语言程序设计课件:10课ch10 IO与流_第4页
Java语言程序设计课件:10课ch10 IO与流_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、以下内容比较晦涩难懂I/O与流I/O是程序设计中的重要问题,大部分的应用程序都需要I/O操作,比如从键盘获得用户输入、在屏幕输出运行结果、对磁盘文件进行读写等等。应用程序只有通过I/O操作才能实现与用户的交互及数据的处理及存储 在Java语言中,将不同类型的I/O抽象为流。所谓“流(stream)”,可以看作是数据在文件或程序之间的传递 输入流和输出流 一般来说,流有两种基本形式:输入流和输出流,根据程序是作为数据流的目的端还是源端来划分。程序首先要打开一个流,才能与数据文件进行通信。 通过输入流,程序可以从数据文件读取数据,但不可向输入流中写入数据;反之,通过输出流,程序可以向数据文件中写入

2、数据。程序与其他设备间的I/O也可以使用流,这时可将设备看作是一个数据文件。 Java I/O流类的组织模式 java.io在Java开发环境中,主要是由包java.io中提供的一系列的类和接口来实现输入/输出处理。而标准输入/输出处理则是由包java.lang中提供的类来处理的,这些类又都是从包java.io中的类继承而来的。I/O类提供了低层次和高层次的界面。每一种介质都有一对与之相关联的输入输出类,它们提供低层次的面向数据序列(字符、字节)的界面。与介质相关的各个类都分别是输入输出抽象流类的子类,它们通常具有与介质相关的构造器及方法。I/O抽象类为所有与介质相关的具体输入输出类提供了一个

3、统一的界面。反过来各个具体的与介质相关的输入输出类也扩展了抽象类,通过它们可以实现在具体介质上的输入输出操作 I/O操作的一般步骤 构造一个与介质相关的I/O对象,以提供一种低层次的方法将数据输入或输出到相应的介质;将与介质相关的对象强制类型转换为它的父类(即抽象I/O类),并利用该对象构造一个流对象。这样便建立起了流类对象与介质相关对象的关联;这时就可利用流对象的I/O方法进行相应介质上的数据读写。字节流类 /面向byte InputStream类InputStream类定义了一套所有字节输入流所需的方法 方法描述read()将数据读入流中skip()跳过流中的若干字节available()

4、返回当前流中的可用字节mark()在流中标记一个位置reset()返回到流中的标记位置markSupported()返回一个boolean值,描述流是否支持标记和复位close()关闭流OutputStream类OutputStream类定义了一套所有字节输出流所需的方法。 方法描述write()写数据到流flush()强制将被缓冲的内容写到输出close()关闭流字符流类/面向charOutputStreamWriterReader与Writer类Reader类的相关方法:void close()void mark(int readAheadLimit)boolean markSupport

5、ed()int read() int read(char cbuf) int read(char cbuf, int off, int len) boolean ready() void reset() long skip(long n) Writer类的相关方法:void close() void flush() void write(char cbuf) void write(char cbuf, int off, int len) void write(int c) void write(String str) void write(String str, int off, int le

6、n) 流的使用(1)I/O类型流作用内存CharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStream用来从内存读取数据或向内存写入数据StringReaderStringWriterStringBufferInputStream从内存里的某个String或StringBuffer读字符或字节管道PipedReaderPipedWriterPipedInputStreamPipedOutputStream实现一个输入、输出管道。管道可用于一个线程的输出连接到另一个线程的输入流的使用(2)文件FileReaderFi

7、leWriterFileInputStreamFileOutputStream用于对本机文件系统上的一个件行读写联结N/ASequenceInputStream将多个输入流联结成为一个输入流对象串行化N/AObjectInputStreamObjectOutputStream将对象串行化数据转换N/ADataInputStreamDataOutputStream以一种与机器无关的格式读写原始数据类型流的使用(3)计数LineNumberReaderLineNumberInputStream在读取时记录行数预览PushbackReaderPushbackInputStream带有“回推(push

8、back)”缓冲区的输入流打印PrintWriterPrintStream包含便捷的打印方法的流。流的使用(4)缓冲BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream缓冲流,用于在读写时进行数据缓冲过滤FilterReaderFilterWriterFilterInputStreamFilterOutputStream过滤流的抽象类接口。数据读写时对数据进行过滤在字节和字符之间转换InputStreamReaderOutputStreamWriter字节流和字符类间的转换桥梁文件流要对本机文件系统上的文件进行读

9、写,需要使用文件流。Java的文件流类包括字符流的FileReader、FileWriter和字节流的FileInputStream、FileOutputStream。文件流对象的构造需要提供文件名作为参数,也即可以通过文件名来创建文件流。这里的所谓文件名可以是字符串、File对象或FileDescriptor对象。内存流为了支持内存上的输入输出,java.io包内提供了一组相关的类:字节流类ByteArrayInputStream ByteArrayOutputStream StringBufferInputStream字符流类CharArrayReader CharArrayWriter

10、StringReader StringWriter例程importjava.io.*;publicclassByteArrayOutputStreamTest publicstaticvoidmain(Stringargs) try ByteArrayOutputStreambaos=newByteArrayOutputStream(); PrintStreamps=newPrintStream(baos); for(inti=0;i1000;i+) ps.println(i+ABCDEFGHIJKLMNOPQRSTUVWXYZ); longstart=System.currentTimeMi

11、llis(); FileOutputStreamfos= newFileOutputStream(ByteArrayOutputStreamTest); baos.writeTo(fos); fos.close(); longstop=System.currentTimeMillis(); System.out.println(timeelapsed(milliseconds)=+(stop-start); catch(FileNotFoundExceptionfnfe) System.out.println(fnfe.getMessage(); catch(IOExceptionioe) S

12、ystem.out.println(ioe.getMessage(); 管道流 管道是用来把一个线程的输出连接到另一个线程的输入。管道输入流作为一个通信管道的接收端,管道输出流则作为发送端。管道流必须是输入输出并用,也就是说在使用管道前,两者必须进行连接。为什么要用到管道流?当某个程序的输出作为另外一个程序的输入时,如果没有管道,就必须为程序提供一个存放中间结果的位置,前一个程序将输出数据写入该位置,而后一个程序再从该位置读出这些数据,这样的做法无疑是低效率的。通过管道,可以连接程序的输出和输入,直接将前一程序的输出作为后一程序的输入,提高了程序效率。 管道流的连接方式java.io中为字符类

13、型和字节类型各提供了一对输入输出管道流类:PipedReader/ PipedWriter和PipedInputStream/PipedOutputStream。管道流的连接方式有两种,以PipedInputStream/PipedOutputStream为例:在构造方法中进行连接:PipedInputStream(PipedOutputStream pos); PipedOutputStream(PipedInputStream pis);通过各自的connect()方法连接: 在类PipedInputStream中,connect(PipedOutputStream pos); 在类Pip

14、edOutputStream中,connect(PipedInputStream pis);例程class PipedExample public static void main(String args) throws IOException byte dataA = 123, dataB= 321; PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(pis); System.out.println(PipedInputStream); try pos.wr

15、ite(dataA); pos.write(dataB); System.out.println(byte)pis.read(); System.out.println(byte)pis.read(); finally pis.close(); pos.close(); 过滤器流在某些情况下,对于由程序写入或读取的数据,需要在写入或读取之前对其进行处理或者过滤 总的来说,过滤器的作用是对相关输入输出流中的数据进行处理,而对于程序而言,这些过滤器是透明的。过滤器流类 类型类作用字节FilterInputStreamFilterOutputStream字节类型的过滤器类的抽象父类BufferedI

16、nputStreamBufferedOutputStream缓冲过滤器流,用于提高输入输出效率PushBackInputStream允许将已读取的数据“压回”到流中GZIPInputStreamGZIPOutputStreamZipInputStreamZipOutputStream对数据进行zip格式或gzip格式的压缩字符FilterReaderFilterWriter字符类型过滤器类的抽象父类BufferedReaderBufferedWriter缓冲过滤器流,用于提高输入输出效率PushBackReader允许将已读取的数据“压回”到流中LineNumberReader用计数器统计从输

17、入中读取的数据行数例程import java.io.*; public class ReadLineTest public static void main(String args) try BufferedReader br = new BufferedReader(new FileReader(args0); String line = null; int i = 0; while(line = br.readLine() != null) i+; System.out.println(i + : + line); br.close(); catch(Exception e) e.prin

18、tStackTrace(); 对象的串行化所谓对象串行化是指读写对象的过程,其关键之处在于以串行的流的形式来表示结构化的对象。为了实现完整对象的输入输出,java.io包中提供了两个类:ObjectOutputStream和ObjectInputStream。这两个流类与其他的字节流类的功能类似,其特殊之处在于通过它们可以读写对象。对象的串行化通常在下面两个方式下使用:远程方法调用(RMI)在远程方法调用时,需要在客户机与服务器之间传递各种对象。对象持久性保存允许对象在创建它们的程序的生命周期结束后仍然存在保存,供以后的程序调用。Serializable接口 并非所有对象都是可串行化的,如果要

19、对某对象进行串行化,该对象的类必须实现Serializable接口 Serializable接口是一个空接口,也就是说,它不包含任何方法的声明,该接口的作用只是表明这个类的对象可以被串行化 随机文件处理使用流的形式对文件进行读写必须顺序进行,也就是说这些文件流的数据必须按先后次序进行处理。在对某些顺序存储访问介质,例如磁带等进行访问时,这样的文件流方式非常有用 随机文件存取提供了一种更灵活的文件读写方式,它允许对文件的内容进行非顺序的访问。在这里,“随机”是指所存取的数据不需要与以前存取过的历史数据有任何的关系。使用随即文件存取方式可以在打开一个文件后同时进行读写操作,并且可以移动文件指针使其

20、指向文件中的任何位置 随机存取文件的结构在文件内部,文件被分成固定长度的数据块(记录)。从概念上来说,文件可以看作是一个记录数组。文件指针的移动是以记录为单位的。文件类 FileFile类的核心概念是封装用户文件系统中的某个文件或目录,它包含许多用于执行文件常规操作的方法以及检查、访问、删除、创建、更改指定的文件或目录File类的构造函数有三个,分别根据文件名、文件路径与文件名、文件对象(目录)与文件名创建实例:public File(String path)public File(String path,String name)public File(File dir,String name

21、) RandomAccessFile类RandomAccessFile类的构造函数使用了两个参数,第一个参数表示要操作的文件,可以使用字符串类型的文件名也可以使用一个文件对象;第二个字符串类型的参数mode表示了对文件的操作方式:mode为 ”r” 时表示可以从文件读取;mode 为 ”rw” 时表示既可以从文件读取也可以向文件写入 RandomAccessFile类通过实现DataInput和DataOutPut的方法来实现文件数据的读写,这些方法允许使用二进制编码形式将基本的Java类型写入或读出文件。在RandomAccessFile类中还提供了一些操作文件指针的方法,如通过seek方法可以将文件指针移动到其参数所制定的位置。例程importjava.io.*;publicclassFileTest publicstaticvoidmain(Stringargs)throwsIOException RandomAccessFileraf=newRandomAccessFile(foo.txt,rw); try Writerout= newOutputStreamWriter(newFileOutputStream(raf.getFD(),UTF-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论