Download presentation
Presentation is loading. Please wait.
1
JAVA程序设计 天津工程职业技术学院计算机工程系软件技术教研室
2
第十二章输入输出流 教学目标: 本章将重点介绍数据流的概念以及应用,以及对字节流、字符流、管道流和文件的操作。 教学重点:
教学难点: 文件的操作。
3
一、Java I/O方面的基础知识 流:它是通过缓冲机制将数据从生产者(如键盘、磁盘文件、内存或其他设备)传送到接受该数据的消费者(如屏幕、文件或者内存等)的这一过程的抽象。 缓冲区:流的两端都有数据缓冲区可以暂存数据。这样接收端可以不必每时每刻都监视流是否有数据需要接收,数据来到之后放在缓冲区内,等需要时再去读取。而发送端也不必每一个字节都调用发送方法,而是等集中了一定数量的数据后再一起发送,大大提高了效率。 数据发送端 (生产者) 数据接收端 (消费者) 缓冲区 流的数据传送
5
目的: 为用户提供与设备无关的输入输出。 Java I/O包: 在Java.io包中包括有许多类,它们为用户提供许多有关文件的各个方面操作。 实现的机制: 采用面向对象的文件读写方式来操作文件,即将所要读写的文件数据转化为相应的流类的对象,然后通过流对象操作其方法。
6
二、I/O流的层次 RandomAccessFile Reader InputStream Object File Writer
随机文件操作 RandomAccessFile Reader InputStream Object 文本格式操作 二进制格式操作 File Writer OutputStream 文件特征与管理
7
说明: 1. File类:用于文件或目录的描述信息,例如生成新的目录、改变文件名、删除文件、判断文件所在路经等。 2. InputStream类:抽象类。基于字节的输入操作。是所有输入流的父类。定义了所有输入流都具有的共同特征。 3. OutputStream类:抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。 4. Reader类:抽象类。基于字符的输入操作。 5. Writer类:抽象类。基于字符的输出操作。 6. RandomAccessFile类:它的功能丰富。可以从文件的任意位置进行存取(输入输出)操作。
10
三、有关文件名及目录名的类 File 类:它是独立于系统平台的,利用其构造函数创建出相应的File 对象;再调用其中的方法实现对文件的各个属性方面的操作。 构造函数: File( String path) File(String path, String FileName) File(File dir, String name) 用途:File类提供了一种与机器无关的方式来描述一个文件对象的属性,通过类File所提供的方法,可以得到文件或目录的描述信息,这主要包括名称、所在路经、可读性、可写性、文件的长度等,还可以生成新的目录、改变文件名、删除文件、列出一个目录中所有的文件等。
11
文件名及目录名编程操作实例 实例一: 文件的各个属性操作和各种方法的使用(FileTest.java) 实例二: 通过File类来实现列出一个目录下所有的*.class文件(FileFilterTest.java)
12
四、有关文件数据操作的类 1. 抽象基类InputStream/OutputStream :它们主要提供文件内容操作的基本功能函数read()、 write()、close()等;一般都是创建出其派生类对象(完成指定的特殊功能)来实现文件读写。 2. 文件操作的一般方法: 根据所要操作的类型生成对应输入输出文件类的对象; 调用此类的成员函数实现文件数据的读写; 关闭此文件流对象。 3. 文件操作的应用要点: 异常的捕获:由于包java.io中几乎所有的类都声明有I/O异常,因此程序应该对这些异常加以处理。 流结束的判断:方法read()的返回值为-1时;readLine()的返回值为null时。 示例:InputStream OutputStream
13
五、本地文件读写的类 1. FileInputStream/FileOutputStream:它们用于本地文件的二进制格式顺序读写。 2. 要求:读和写要分别创建出不同的文件流对象; 3. 编程过程: 生成文件流对象 调用流类中的功能函数如read()、write(int b)等读写文件内容 close()关闭文件 4. 实例:文件复制 文件拷贝的应用程序模拟Copy
14
六、文本字符流读写 1. Reader和Writer: 提供的对字符流处理的类,它们为抽象类。一般通过其子类来实现。
2. InputStreamReader(InputStream in) 和OutputStreamWriter(OutputStream out): 它们可以使用指定的编码规范并基于字节流生成对应的字符流。 注意: InputStreamReader isr=new InputStreamReader(“my.txt”); //错误 应该: FileInputStream fis=new FileInputStream(“my.txt”); InputStreamReader isr=new InputStreamReader(fis);
15
3. BufferedReader(InputStreamReader isr, int size) 和 BufferedWriter(OutputStreamWriter osr, int size): 为提高字符流的处理效率,可以采用缓冲机制的流实现对字符流作成批的处理,避免了频繁的从物理设备中读取信息 。 4. 实例讲解: CharInput.java和NumberInput.java LineNumberReader FileWrite的追加模式
16
七、管道输入输出 1. PipedInputStream/PipedOutputStream类:它用于实现管道的二进制格式的输入输出(将一个线程的输出结果直接连接到另一个线程的输入端口,实现两者数据直接传送)。 2. PipedReader/PipedWriter类:它用于实现管道的字符格式的输入输出。 3. 要求:操作时需要将两个端口相互连结。 4. 实现原理: 线程1 线程2 临时文件 管道
17
5. 管道的连接: 方法一:是通过构造函数直接将某一个程序的输出作为另一个程序的输入,在定义对象时指明目标管道对象 方法二:是利用双方类中的任一个成员函数 connect()相连接 6. 实例讲解: PipedIO.java
18
八、随机文件读写 1. RandomAccessFile类:它直接继承于Object类而非InputStream/OutputStream类,从而可以实现读写文件中任何位置中的数据(只需要改变文件的读写位置的指针)。 2. 要求:指明读写类型并改变文件读写位置的指针。 3. 编程步骤: 生成流对象并且指明读写类型; 移动读写的数据位置; 读写文件内容; 关闭文件。
19
4.由于RandomAccessFile类实现了DataOutput与DataInput接口,因而利用它可以读写Java中的不同类型的基本类型数据(比如采用readLong()方法读取长整数,而利用readInt()方法可以读出整数值等)。 5. 实例讲解: RandomFileRW.java RWFile.java
20
九、过滤流--带格式的读写操作 1.过滤流:将一个过滤流连接到另一个流上,则在从原始的流读写数据的同时,利用过滤流可以对这些数据进行加工处理。 2.DataInputStream 和DataOutputStream类:它们分别为FilterInputStream和FilterOutputStream类的子类。同时DataInputStream 和DataOutputStream类由于分别实现了DataInput和DataOutput接口中定义的独立于具体机器的带格式的读写操作,从而可以实现对Java中的不同类型的基本类型数据的读写。
21
3.编程方法: 为了使用过滤流,用户需要在创建过滤流的同时将过滤流连接到另一个输入(输出)流上。如可以将DataInputStream连接到标准的输入流上,然后用户就可以方便地使用DataInputStream类的readXXX()方法类实现从标准输入中读取数据。 4.实例讲解: dataTest.java
22
import java.io.*; public class JavaFile { public static void main(String args[]) { int X=100; float Y=3.14f; try { FileOutputStream fos=new FileOutputStream("data.dat"); DataOutputStream dos=new DataOutputStream(fos); dos.writeInt(X); dos.writeFloat(Y); dos.close(); } catch(FileNotFoundException e){ catch(IOException e){ 带格式的写操作
23
import java.io.*; public class JavaFile { public static void main(String args[]) { int X; float Y; try { FileInputStream fis=new FileInputStream("data.dat"); DataInputStream dis=new DataInputStream(fis); X=dis.readInt(); Y=dis.readFloat(); dis.close(); System.out.println("X="+X); System.out.println("Y="+Y); } catch(FileNotFoundException e){ catch(IOException e) { 带格式的读操作
24
十、标准输入输出流 1. 标准输入流:System.in是InputStream类的对象,当程序中需要从键盘读入数据时候,只需要调用System.in中的read()方法。 char ch=System.in.read(); 注意: 必须捕获System.in.read()所抛出的异常; 执行System.in.read()方法将从键盘缓冲区读入一个字节的数据,然而返回的16位的二进制数据,其低8位为键盘的ASCII码,高8位为0; 使用System.in.read()来实现键盘输入时,如果键盘缓冲区中没有数据时,系统将进入阻塞状态。所以可以利用它来实现程序的暂停,用户输入后再继续执行。 示例:键盘输入 输入输出的重定向
25
课堂小结 掌握输入输出流的基本概念。 相关类的基本结构和功能。 熟练掌握文件操作。
Similar presentations