收藏 分享(赏)

java编程——第6讲 输入输出流.ppt

上传人:weiwoduzun 文档编号:4377887 上传时间:2018-12-26 格式:PPT 页数:64 大小:1.90MB
下载 相关 举报
java编程——第6讲  输入输出流.ppt_第1页
第1页 / 共64页
java编程——第6讲  输入输出流.ppt_第2页
第2页 / 共64页
java编程——第6讲  输入输出流.ppt_第3页
第3页 / 共64页
java编程——第6讲  输入输出流.ppt_第4页
第4页 / 共64页
java编程——第6讲  输入输出流.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

1、第6讲 输入/输出流,文件、流和输入输出技术,2,主要内容,6.1 I/O流概述 什么是流 6.2 I/O流类 I/O流的层次: 字符流、 字节流、 标准输入/输出流 6.3 过滤流与流的串接 6.4 文件流类与文件操作 6.5 对象串行化,文件、流和输入输出技术,3,6.1 I/O 流概述,输入/输出处理是程序设计中非常重要的一部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。 Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。 Jdk 提供了包java.io,其中包括一系列的类来实现输入/输出处理。进行I/O操作时可能会产生I

2、/O例外,属于非运行时例外,应该在程序中处理。如:FileNotFoundException, EOFException, IOException,什么是流,文件、流和输入输出技术,4,“流”是数据从一种设备流向另一种设备的过程,流实际上是一个数据序列。,文件、流和输入输出技术,5,什么是流,采用流的机制可以使数据有序地输入和输出。 输入流与输出流。,文件、流和输入输出技术,6,6.2 I/O流类,Java有各种各样的执行I/O的流,在java.io包中定义了这些流编写程序时,java.io包必须被执行输入输出的程序导入。 输入输出流可以从以下几个方面进行分类: 从流的方向划分:输入流和输出流

3、; 从流的分工划分:节点流和处理流; 从流的内容划分:面向字符的流和面向字节的流。,文件、流和输入输出技术,7,1 字节流,字节流类是从抽象类 InputStream和OutputStream派生出来的一系列类。这两个类均为抽象类,也就是说它们不能被实例化,必须生成子类之后才能实现一定的功能。 这类流以字节(byte)为基本处理单位。 1. InputStream InputStream类直接继承Object类。 主要方法如下:,文件、流和输入输出技术,8,从流中读取数据: int read( ); /读取一个字节,返回值为所读的字节 int read( byte b ); /读取多个字节,放

4、置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量 int read( byte b , int off, int len ); /读取len个字节,放置到以下标off开始字节数组b中,返回值为实际读取的字节的数量 int available( ); /返回值为流中尚未读取的字节的数量 long skip( long n ); /读指针跳过n个字节不读,返回值为实际跳过的字节数量,文件、流和输入输出技术,9,关闭流: close( ); /流操作完毕后必须关闭 使用输入流中的标记: void mark( int readlimit ); /记录当前读指针所在位置,re

5、adlimit表示读指针读出readlimit个字节后所标记的指针位置才失效 void reset( ); /把读指针重新指向用mark方法所记录的位置 boolean markSupported( ); /当前的流是否支持读指针的记录功能,文件、流和输入输出技术,10,2. OutputStream,输出数据: void write( int b ); /往流中写一个字节b void write( byte b ); /往流中写一个字节数组b void write( byte b , int off, int len ); /把字节数组b中从下标off开始,长度为len的字节写入流中flus

6、h( ) /刷空输出流,并输出所有被缓存的字节 由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。 关闭流: close( ); /流操作完毕后必须关闭,在java.io包中定义了很多这二个基本类具体实现输入输出功能的子类,表8.1为部分常用字节输入流类和字节输出流子类的功能。,表8.1 部分常用字节输入流类和输出流类的功能,文件、流和输入输出技术,以FileInputStream与FileOutputStream为例,12,文件、流和输入输出技术,文件、流和输入输出技术,13,2 字符流,Java中的字符使用的是Unicode编码,每个字符占有两个字节,即16bit。字符流是以

7、16位的Unicode码表示的字符为基本处理单位,进行文本数据的读写,可以实现Java程序中的内部格式和文本文件、显示输出、键盘输入等外部格式之间的转换。 Reader和Writer是java.io包中所有字符流的抽象基类。提供了输出字符的API及其部分实现。 1.Reader Reader类是处理所有字符流输入类的父类。 主要有以下方法:,文件、流和输入输出技术,14,读取字符 public int read() throws IOException; /*读取一个字符,返回值为读取的字符*/ public int read(char cbuf) throws IOException; /*

8、读取一系列字符到数组cbuf中,返回值为实际读取的字符的数量*/ public abstract int read(char cbuf,int off,int len) throws IOException; /*读取len个字符,从数组cbuf的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现*/,文件、流和输入输出技术,15,标记流 public boolean markSupported(); /*判断当前流是否支持做标记*/public void mark(int readAheadLimit) throws IOException; /*给当前流作标记,最多支持

9、readAheadLimit个字符的回溯。*/ public void reset() throws IOException; /*将当前流重置到做标记处*/ 关闭流 public abstract void close() throws IOException;,文件、流和输入输出技术,16,2.Writer,向输出流写入字符 public void write(int c) throws IOException; /将整型值c的低16位写入输出流 public void write(char cbuf) throws IOException; /将字符数组cbuf写入输出流 public

10、abstract void write(char cbuf,int off,int len) throws IOException; /*将字符数组cbuf中的从索引为off的位置处开始的len个字符写入输出流*/ public void write(String str) throws IOException;/将字符串str中的字符写入输出流 public void write(String str,int off,int len) throws IOException;/*将字符串str 中从索引off开始处的len个字符写入输出流*/,文件、流和输入输出技术,17,flush( ) 刷

11、空输出流,并输出所有被缓存的字节。 关闭流 public abstract void close() throws IOException;,由于Reader和Writer是抽象类,因此,在java.io包中定义了许多这二个处理字符流基本类具体实现输入输出功能的子类,表8.2为部分常用字符输入流类和字符输出流子类的功能。,表8.2 部分常用字符输入流类和输出流类的功能,文件、流和输入输出技术,19,3. Reader与Writer的子类,从Reader(直接子类6个)和Writer(直接子类7个)派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。 FileReader

12、、FileWriter InputStreamReader、OutputStreamWriter CharArrayReader、CharArrayWriter PipedReader、PipedWriter FilterReader、FilterWriter BufferedReader、BufferedWriter StringReader、StringWriter PrintWriter,以FileReader与FileWriter为例,20,文件、流和输入输出技术,文件、流和输入输出技术,21,标准输入/输出,在Java应用程序开始执行时(也就是当main方法被执行时),Java就会自

13、动创建3个与设备关联的流对象:System.in、System.out和System.err。 System.in对象(标准输入流对象)是InputStream类型的,是连接程序与标准输入设备(通常是键盘)的一个输入流对象,当执行System.in.read()操作时,从键盘得到的信息通过System.in流到了程序中。 System.out对象(标准输出流对象)是PrintStream类型的,是连接程序和标准输出设备(通常是显示器)的一个输出流对象,当执行System.out.println()语句时,信息流从程序通过System.out流到了屏幕上。,标准输入/输出,文件、流和输入输出技术

14、,22,文件、流和输入输出技术,23,文件的操作步骤,对于文件的操作也就是实现对文件的读写,而不管是文本文件还是二进制文件都可采用相同的步骤: 1.把一个合适的流连接到文件; 2.使用循环读或写数据; 3.关闭流。,文件、流和输入输出技术,24,File类,File类主要用于获取磁盘中文件或目录的信息。File类的对象并不打开文件,也不提供任何文件处理功能。然而,java.io包中的其它类经常使用File对象来指定所要操作的文件或目录。File类的实例表示主机文件系统中的文件名或路径名。 File类提供4个构造函数。 public File(String name) /*指定与File对象关联

15、的文件或目录的名称,name可以包含路径信息及文件或目录名*/ public File(String pathToName,String name) /*使用参数pathToName(绝对路径或相对路径)来定位参数name所指定的文件夹或目录*/ public File(File directory,String name) /*使用现有的File对象directory(绝对路径或相对路径)来定位参数name所指定的文件夹或目录*/ public File(URI uri) /* 使用给定的统一资源定位符URI对象来定位文件*/,文件、流和输入输出技术,25,通过调用File类提供的各种方法(

16、见表8.1),能够创建、删除文件、重命名文件、判断文件的读写权限及是否存在,设置和查询文件的最近修改时间等 。 注意:File类不能访问文件的内容,即不能从文件中读取数据或往文件里写数据,它只能对文件本身的属性进行操作。 示例:FileTest.java,File类示例,文件、流和输入输出技术,26,获得文件或目录的属性,较常用的方法:,文件、流和输入输出技术,文件、流和输入输出技术,28,RandomAccessFile,类RandomAccessFile则允许对文件内容同时完成读和写操作,它直接继承object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件

17、操作的方法: readXXX()或writeXXX(): 如ReadInt(), ReadLine(), WriteChar(), WriteDouble()等。,随机存取的实现机理,随机存取文件的行为类似存储在文件系统中的一个大型字节数组。存在指向该隐含数组的光标或索引,称为文件指针。 输入操作从文件指针指向处开始读取字节,并随着对字节的读取而前移此文件指针。 如果随机存取文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。 该文件指针可以通过 getFilePointer 方法读

18、取,并通过 seek或skipBytes方法设置随机位置.,文件、流和输入输出技术,29,它有二个构造方法: (1)RandomAccessFile ( String filename, String mode ) (2)RandomAccessFile ( File file, String mode ),随机存取文件流,文件、流和输入输出技术,RandomAccessFile类的主要方法,【例8-4】,1 /* 随机流 */ 2 import java.io.*; 3 class Example8_4 4 5 public static void main(String args) 6 7

19、 try 8. RandomAccessFile f=new RandomAccessFile(“a.txt“,“rw“); 9. f.writeBytes(“Zhang si ming“); 10. f.close(); 11. 12. catch(IOException e) 13. System.out.println(e); 14. 15. 16. ,文件、流和输入输出技术,程序运行需要注意:,执行和分析上面的程序,需要注意的是以下几个方面的问题: 建立随机读写文件的模式 如何灵活的利用seek和skip实现灵活的定位 随机读写尚不能支持对文件的直接插入操作,仅仅实现了修改操作,因此需

20、要避免因为写入了比需要修改的信息多的字节,而导致后续的内容受到破坏。 注意读写中的异常处理 程序没有考虑字符集的问题,对于实验用的文本文件,其原始格式都是按照一个字符占一个字节,一个汉字占2个字节进行分析的,在运行时读者需要注意,如果有汉字的话,可能是乱码,此问题请参考有关国际化编程中的有关解释。,文件、流和输入输出技术,本地可执行文件,在Java语言中,使用java.lang包中的 Runtime类可以运行本地机的可执行文 件。每个Java 应用程序都有一个 Runtime 类实例对象,使应用程序能够与其运行的环境相连接。但应用程序不能创建自己的 Runtime 类实例对象,而要通过该类的静

21、态方法getRuntime()创建Runtime 类对象。,文件、流和输入输出技术,Runtime 类对象有几个常用方法:,(1)exit(int status) (2)gc() (3)getRuntime() (4)exec(String command),文件、流和输入输出技术,【例8-7】,1. public class Example8_7 2. public static void main(String args) 3. 4. try 5. Runtime rt=Runtime.getRuntime(); 6. rt.exec(“c:/windows/system32/calc.e

22、xe“); 7. 8. catch(Exception e) System.out.println(e); 9. 10. ,文件、流和输入输出技术,37,文件、流和输入输出技术,ByteArrayInputStream与ByteArrayOutputStream类,示例:ByteArrayTest.java,示例: ByteArrayTest.java,38,39,文件、流和输入输出技术,PipedInputStream与PipedOutputStream类,一个PipedInputStream对象必须和一个PipedOutputStream对象进行连接而产生一个通信管道。 一个线程的Pipe

23、dInputStream对象能够从另外一个线程的PipedOutputStream对象中读取数据 示例:PipeStreamTest.java,40,文件、流和输入输出技术,41,文件、流和输入输出技术,42,文件、流和输入输出技术,JDK还提供了PipedWriter和PipedReader用于字符文本的管道通信,文件、流和输入输出技术,43,过滤流与流的串接,过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。 类FilterInputStream和FilterOutpu

24、tStream分别作为所有过滤输入流和输出流的父类。 作用:给朴素的Input/OutputStream加上一些修饰某些有用的格式,文件、流和输入输出技术,44,过滤流类层次结构,文件、流和输入输出技术,45,要使用过滤流,首先必须把它串接到某个输入/输出流上,以达到数据转换的目的。通常在构造方法的参数中指定所要连接的流: FilterInputStream(InputStream in); FilterOutputStream(OutputStream out);,文件、流和输入输出技术,46,文件流、缓冲流与数据流的串接,BufferedInput/OutputStream 自动利用内存缓

25、冲,不必每次存取外设 还可在其外面再加包装new DataInputStream(new BufferedInputStream(new FileInputStream(“File1.dat”) ) );,47,文件、流和输入输出技术,48,文件、流和输入输出技术,49,文件、流和输入输出技术,文件、流和输入输出技术,50,DataInput/OutputStream 对于基本数据类型进行有格式的读写 注意:此处为存储格式,DataOutputStream 与DataInputStream配套使用才有意义 实现了DataInput接口 readUTF/Int/Float/Char/Boolea

26、n/Long/Double() readLine()读入的重要方法 实现了DataOutput接口 writeUTF/Int/Float/Char/Boolean/Long/Double(),示例:DataStreamTest.java,文件、流和输入输出技术,51,52,文件、流和输入输出技术,文件、流和输入输出技术,53,对象串行化(Serialization),对象流 能够输入输出对象的流称为对象流。可以将对象串行化后通过对象输入输出流写入文件或传送到其它地方。在java中,允许可串行化的对象通过对象流进行传输。 类ObjectOutputStream和ObjectInputStream

27、分别继承了接口ObjectOutput和ObjectInput,将数据流功能扩展到可以读写对象 。,文件、流和输入输出技术,54,串行化举例 要实现一个对象的串行化,可用两个步骤完成:第一步创建可串行化对象;第二步构造对象的输入输出流。 1. 定义一个可串行化对象 在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。 例如,定义一个实现Serialiable接口的类Student:,文件、流和输入输出技术,55,public class Student implements Serializableint

28、id; / 学号String name; / 姓名String department; / 系别public Student(int id,String name,int age,String department)this.id = id;this.name = name;this.department = department;,文件、流和输入输出技术,56,2. 构造对象的输入/输出流 使用ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。 Student stu=new Student(030102,“Liu Ming“, “JSJ“

29、); FileOutputStream fo=new FileOutputStream(“data.ser“); / 保存对象的状态 ObjectOutputStream so=new ObjectOutputStream(fo);tryso.writeObject(stu);so.close();catch(IOException e )System.out.println(e);,文件、流和输入输出技术,57,FileInputStream fi=new FileInputStream(“data.ser“);ObjectInputStream si=new ObjectInputStre

30、am(fi); / 恢复对象的状态trystu=(Student)si.readObject();si.close();catch(IOException e )System.out.println(e);,58,文件、流和输入输出技术,59,文件、流和输入输出技术,60,文件、流和输入输出技术,61,文件、流和输入输出技术,62,文件、流和输入输出技术,基于文本的输入/输出,1. 利用Scanner类实现键盘输入。 首先,创建Scanner的一个对象,扫描数据来自键盘输入。 Scanner sc=new Scanner(System.in); 其次,通过调用扫描对象的方法实现输入。 int

31、num=sc.nextInt(); 最后,调用对象的close()方法关闭输入。 sc.close();,/ 程序2-6:利用Scanner类实现键盘输入 import java.util.Scanner; public class ScannerDemo public static void main(String args) Scanner sc=new Scanner(System.in);System.out.println(“请输入一个整数,敲回车结束“);int num=sc.nextInt();System.out.println(“你输入了一个:“+num);System.ou

32、t.println(“请输入一个字符串,敲回车结束“);String s=sc.nextLine();System.out.println(“你输入了字符串:“+s);sc.close(); ,2.利用Console类实现键盘输入 利用Console对象可访问与当前 Java 虚拟机关联的基于字符的控制台设备,主要提供了基于控制台的格式化读取及密码读取功能,/程序2-7:利用Console类实现键盘输入 import java.io.Console; public class ConsoleDemo public static void main(String args) Console cons =System.console();String account=cons.readLine(“请输入账号“);char pwd=cons.readPassword(“请输入密码“); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > Java

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报