1、Java 2实用教程(第版)教学课件,课件制作 耿祥义 张跃平 配合例子代码一同使用例子代码可登录下载,第10章 输入输出流,10.1 File类 10.2 FileInputStream类 10.3 FileOutputStream类 10.4 FileReader类和FileWriter类 10.5 使用文件对话框打开和保存文件 10.6 RandomAccessFile类,10.7 数据流 10.8 数组流 10.9 对象流 10.10 序列化与对象克隆 10.11 文件锁FileLock 10.12 Process 类中的流 10.13 带进度条的输入流,I/O流,I/O流提供一条通道
2、程序,可以使用这条通道把源中的字节序列送给目的地。把输入流的指向称做源,程序从指向源的输入流中读取源中的数据。而输出流的指向是字节要去的一个目的地(或用户),程序通过向输出流中写入数据把信息传递到目的地。虽然I/O流经常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口。 Java的I/O流库提供大量的流类(在包java.io中)。但是,所有输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类,而所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。,10.1 File类,File
3、类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度、文件读写权限等,不涉及对文件的读写操作 构造方法有3个:File(String filename);File(String directoryPath,String filename);File(File f, String filename);,10.2 FileInputStream类,使用文件输入流构造方法建立通往文件的输入流时,可能会出现错误(也被称为异常)。为了把一个文件输入流对象与一个文件关联起来,使用类似于下面所示的代码: try FileInputStream ins = new FileInputStre
4、am(“myfile.dat“); catch (IOException e ) System.out.println(“File read error: “ +e ); /文件I/O错误,从输入流中读取字节,read方法给程序提供一个从输入流中读取数据的基本方法 , read方法从输入流中顺序读取源中的单个字节数据,该方法返回字节值(0255之间的一个整数),如果到达源的末尾,该方法返回-1。 read方法还有其它一些形式。这些形式能使程序把多个字节读到一个字节数组中:int read(byte b);int read(byte b, int off, int len);,10.3 File
5、OutputStream类,FileOutputStream提供了基本的文件写入能力。构造方法:FileOutputStream(String name)FileOutputStream(File file) FileOutputStream流使用write方法把字节写入到输出流达到目的地,write的格式如下:public void write(byte b)其功能是写b.length个字节到输出流。public void.write(byte b,int off,int len)其功能是从给定字节数组中起始于偏移量off处写len个字节到输出流。,10.4 FileReader类和File
6、Writer类,与FileInputStream、FileOutputStream字节流相对应的是FileReader、FileWriter字符流,他们分别是Reader和Writer的子类,其构造方法分别是:FileReader(String filename),FileWriter (String filename)。 由于汉字在文件中占用2个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象,因为,在Unicode字符中,一个汉字被看作一个字符。,10.5 使用文件对话框打开和保存文件,使用文件对话框方便地打开和保存文件,因为文件对话框可以使用户很方便的选择文件所
7、在的目录以及文件的名字。,10.6 RandomAccessFile类,RandomAccessFile类既不是输入流类InputStream类的子类,也不是输出流类OutputStram类的子类流。RandomAccessFile类创建的流的指向既可以作为源也可以作为目的地,换句话说,当我们想对一个文件进行读写操作时,我们可以创建一个指向该文件的RandomAccessFile流即可,这样我们既可以从这个流中读取文件的数据,也可以通过这个流写入数据到文件 . 构造方法。 (1)RandomAccessFile(String name,String mode) 参数name 用来确定一个文件名
8、,给出流的源,同时也是流目的地。参数mode取r(只读)或rw(可读写)决定流对文件的访问权限。 (2)RandomAccessFile(File file,String mode) 参数file 是一个File对象,给出流的源,同时也是流目的地。参数mode取r(只读)或rw(可读写)决定流对文件的访问权限。,10.7 数据流,DataInputStream 类和DataOutputStream类创建的对象被称为数据输入流和数据输出流。这两个流是很有用的两个流,它们允许程序按着机器无关的风格读取Java原始数据。也就是说,当我们读取一个数值时,不必再关心这个数值应当是多少个字节。 构造方法
9、(1)DataInputStream(InputStream in) 将创建的数据输入流指向一个由参数in指定的输入流,以便从后者读取数据(按着机器无关的风格读取)。 (2)DataOutputStream(OutnputStream out) 将创建的数据输出流指向一个由参数out指定的输出流,然后通过这个数据输出流把Java数据类型的数据写到输出流out。,10.8 数组流,流的源和目标除了可以是文件外,还可以是计算机内存。字节输入流:ByteArrayInputStream 和字节输出流:ByteArrayOutputStream分别使用字节数组作为流的源和目标。使用下列ByteArra
10、yInputStream流的两个构造方法构造字节数组输入流对象:ByteArrayInputStream(byte buf)ByteArrayInputStream(byte buf,int offset,int length),10.9 对象流,ObjectInputStream类和ObjectOutputStream类创建的对象被称为对象输入流和对象输出流。对象输出流使用writeObject(Object obj)方法将一个对象obj写入输出流送往目的地,对象输入流使用readObject()从源中读取一个对象到程序中。构造方法分别是:ObjectInputStream(InputStr
11、eam in),ObjectOutputStream(OutputStream out)。,10.10 序列化与对象克隆,有时我们想得到对象的一个“复制品”,该复制品的实体是原对象实体的拷贝。复制品实体的变化不会引起原对象实体发生变化,这样的复制品称为原对象的克隆对象或简称克隆。 使用对象流很容易得获取一个序列化对象的克隆。我们只需将该对象写入到对象输出流,那么用对象输入流读回的对象一定是原对象的一个克隆。 一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。Serializable接口中的方法对程序是不可见的,因此实现该接口的类不需要实现额外的方法,当把一
12、个序列化的对象写入到对象输出流时,JVM就会实现Serializable接口中的方法,将一定格式的文本对象的序列化信息,写入到目的地。,10.11 文件锁FileLock,JDK1.4增加了一个FileLock类,该类的对象称做文件锁。 RondomAccessFile创建的流在读写文件时可以使用文件锁,那么只要不解除该锁,其它线程无法操作被锁定的文件,使用文件锁的步骤,首先使用RondomAccessFile流建立指向文件的流,该流的读写属性必须是“rw”,例如:RandomAccessFile input=new RandomAccessFile(“Example.java“,“rw“);
13、 input流调用方法getChannel()获得一个连接到地层文件的FileChannel 对象(信道),例如FileChannel channel=input.getChannel(); 信道调用tryLock()或lock()方法获得一个FileLock(文件锁)对象,这一过程也称做对文件加锁,例如:FileLock lock=channel.tryLock();,10.12 Process 类中的流,Process是java.lang包中的一个类,可以使用该包中的Runtime类调用其静态方法exec得到Process的一个实例,exec方法可以运行一个可执行文件,即启动一个进程,ex
14、ec方法返回一个Process对象。一个Process对象可以使用方法 getErrorStream()获取该进程错误信息的输入流;使用方法 getInputStream()获取指向该进程的输入流。方法 getOutputStream()获取指向该进程的输出流。利用Process中的流,我们可以获取该进程的某些信息。,10.13 带进度条的输入流,使用javax.swing包提供的输入流类:ProgressMonitorInputStream,它的构造方法是:ProgressMonitorInputStream(Conmponent c,String s,InputStream in); 该类创建的输入流在读取文件时会弹出一个显示读取速度的进度条 .,