第4讲JAVA IO流_第1页
第4讲JAVA IO流_第2页
第4讲JAVA IO流_第3页
第4讲JAVA IO流_第4页
第4讲JAVA IO流_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

1、Java IO流,2、File类,3、字节流,1、IO流概念及分类,4、字符流,5、随机访问流,6、标准流 7、对象序列化,第七章 流,1、IO流概述及分类,大部分程序都需要输入/输出处理,比如从键盘读取数据、向屏幕中输出数据、从文件中读或者向文件中写数据、在一个网络连接上进行读写操作等。 在Java中,对数据的输出输入操作以流的方式进行,J2SDK提供了各种各样的流用以获取不同种类的数据。,1、IO流概述及分类,分类: 按照数据的输入输出方式分为: 输入流(Input Stream)和输出流(Output Stream),输入流(Input Stream),输出流(Output Stream

2、),按照处理数据的单位不同分为字节流和字符流。,1、IO流概述及分类,(1)Java把处理二进制数据的流称为字节流,字节流每次处理一个字节的数据;以Stream结尾,说明是一字节流。 (2)把处理某种格式的特定数据称为字符流,字符流每次处理一个字符的数据。以Reader Writer结尾,说明是一字符流。,按照流的功能不同分为节点流和过滤流。,过滤流,1、IO流概述及分类,J2SDK所提供的所有流类型位于java.io内都分别继承自以下四种抽象流类型。,1、IO流概述及分类,2、File类,在Java中,专门提供了File类来获取和处理磁盘上文件和目录的相关信息。File类是java.io包中

3、唯一处理磁盘文件和目录的类,它定义的对文件和目录操作的方法都是与平台无关的,通过使用File类提供的各种方法能够创建、删除文件和目录,获取磁盘上指定文件和目录的相关信息。,File类的构造方法:,注意:调用构造函数只能创建一个File对象,而不是在文件系统中创建了一个文件,TestFile1.java,File file1=new File(Hello.java); File file2=new File(/); File file3=new File(file2,Hello.java); File file4=new File(/,Hello.java);,例如:,再如:,如何创建一个文件或

4、目录,1、调用File对象的createNewFile() 2、调用FileOutputStream(),创建一个文件:,创建一个目录: 1、mkdir(); 创建父目录已经存在的目录 2、mkdirs();创建多层目录,String separator = File.separator; String fileName = myfile.txt; String directory =mydir1+separator+mydir2; File f = new File(directory,fileName);,File类的其它方法:,见课本表7-2 例子:7-1 FileDemo.java,3

5、、字节流,字节流类是专门处理以字节为传输单位的IO流类。我们知道计算机中的数据处理基本上都是以字节为单位进行处理,这类数据保存的文件也称为“二进制文件”,如果要读写这些二进制文件,就需要使用Java中的字节流对象。 InputStream和OutputStream分别是输入字节流与输出字节流的抽象父类。,InputStream抽象类及其派生子类,InputStream类的主要方法,OutputStream抽象类及其派生子类,OutputStream类的主要方法,FileInputStream类 和 FileOutputStream类,FileInputStream 和FileOutputStr

6、eam 称为文件流,是两个最常用字节流,用于对磁盘文 件的读写操作。一旦创建了文件流对象,系统就会创建与指定文件对象链接的字节流, 然后就可以利用提供的方法如read()、write()等方法对文件进行操作。,FileInputStream类的主要构造方法,FileInputStream类,注意: 如果File类对象所对应的文件不存在,将抛出FileNotFoundException异常。,TestFileInputStream.java,FileInputStream类,FileOutputStream类的构造方法,FileOutputStream类,注意:如果File对象所对应的文件不存在

7、,则会创建一个指定的文件。,TestFileOutPutStream.java,FileOutputStream类,java.io包中提供了FilterInputStream类和FilterOutputStream类分别对其他输入/输出流进行特殊处理,它们在读/写数据的同时可以对数据进行特殊处理。FilterInputStream类和FilterOutputStream类都是抽象类,因此它们均不能实例化对象。 FilterInputStream类有3个子类,它们分别是BufferedInputStream、DataInputStream和PushbackInputStream; FilterO

8、utputStream类也有3个子类,分别是BufferedOutputStream、DataOutputStream和PrintStream。,过滤流(处理流),BufferedInputStream和BufferedOutputStream类称为缓冲字节流,它引入了针对内存缓冲区的操作,从而提高了读写数据的效率。 注意: 过滤流不直接与底层的数据“打交道” ,必须先 指定节点流对象处理底层的数据,然后把节点流对象作为过滤流对象的实参使用。,BufferedInputStream和BufferedOutputStream,BufferedInputStreamDemo.java,Buffer

9、edInputStream和BufferedOutputStream,注意:,1、BufferedInputStream BufferedInputStream的数据成员buf是一个字节数组,默认为2048个字节,当读取数据来源时,BufferedInputStream会尽量将buf填满。当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源做读取。当buf不足是, BufferedInputStream才会在实现给定的InputStream对象的read方法。 2、 BufferedOutputStream BufferedOutputStream的成员buf也是一个字

10、节数组,默认为512字节,当使用write()方法写入数据时,实际上会先将数据写至buf中,当buf已满时才会实现给定的OutputStream对象的writer方法,将buf数据写至目的地。,java.io包中提供了ByteArrayInputStream类和ByteArrayOutputStream类,将内存中 byte类型的数组当作流输入来源、输出目的地。ByteArrayInputStream可以从指定的字节数组中读取数据;ByteArrayOutputStream中提供了缓冲区可以存放数据(缓冲区大小可以在构造方法中设定,缺省为32字节),可以用write()方法向其中写入数据,然后

11、用toByteArray()方法将缓冲区中的有效字节写到字节数组中去。,ByteArrayInputStream和ByteArrayOutputStream,java.io 包中含有两个接口DataInput 和DataOutput,这两个接口设计了一种较为高级的 数据输入输出方式:除了可处理字节和字节数组外,还可以处理int、float、boolean 等基本 数据类型,这些数据在文件中的表示方式和它们在内存中的一样,无须转换,它们相应地提 供了很多处理基本数据类型的方法, 如:DataInput 提供了read()、readInt()、readByte(),, DataOutput 提供了

12、write()、writeChar()、writeFloat(),。,DataInputStream和DataOutputStream,DataInputStream和DataOutputStream,数据流类DataInputStream和DataOutputStream分别实现了DataInput和DataOutput接口,在提供了字节流的读写手段的同时,还可以实现对文件中的不同数据类型的读写。,例:TestDataStream.java,PrintStream:其作用是将Java语言中的不同类型的数据以自动转换为字符形式输出到相应的输出流中去,属于输出字节流。 PrintStream的输

13、出操作不会抛出异常,通过checkError 方法设置测试 的内部标志来检测异常。 PrintStream提供了重载的print和println方法用于多种数据类型的输出。 PrintStream有自动flush功能。,PrintStream,例:TestPrintStream.java,管道流,管道用来把一个程序、线程和代码块的输出连接到另一个程序、线程和代码块的输入。java.io中提供了类PipedInputStream和PipedOutputStream作为管道的输入/输出流。 管道输入流作为一个通信管道的接收端,管道输出流则作为发送端。管道流必须是输入输出流并用,即在使用管道前,两者

14、必须进行连接。,管道输入/输出流可以用两种方式进行连接: 1)在构造方法中进行连接 PipedInputStream(PipedOutputStream pos); PipedOutputStream(PipedInputStream pis); 2)通过各自的connect()方法连接 在类PipedInputStream中, connect(PipedOutputStream pos); 在类PipedOutputStream中, connect(PipedInputStream pis);,管道流,例:TestPipe.java,语言包java.lang中的System类管理标准输入/输

15、出流和错误流。 System.in,从InputStream中继承而来,用于从标准输入设备中获取输入数据(通常是键盘)。 System.out,从PrintStream中继承而来,把输出送到缺省的显示设备(通常是显示器)。 System.err,也是从PrintStream中继承而来,把错误信息送到缺省的显示设备(通常是显示器)。 每当main方法被执行时,就自动生成上述三个对象。,2、标准流,TestStanderdIn.java,TestStanderdOut.java,InputStream 和OutputStream 1、FileInputStream 、FileOutputStrea

16、m 2、 ByteArrayInputStream、ByteArrayOutputStream 3、PipedInputStream、PipeOutputStream 4、BufferedInputStream、BufferedOutputStream 5、DataInputStream、DataOutputStream 6、PrintStream 7、System.in、System.out,内容回顾,对象流和序列化,对象序列化的目标是将对象保存到磁盘上,或者允许在网络中直接传输对象,对象序列化机制允许把内存中Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上,通过

17、网络将这种二进制流传输到另一个网络节点。,序列化:将一个Java对象写入IO流中。 反序列化:从IO流中恢复该Java对象。,如果需将某个对象可以支持序列化机制,必须让它的类是可序列化的,为了让类是可序列化的,该类必须实现如下两个接口之一: Serializable Externalizable Serializable只是一个标记接口,实现该接口无须实现任何方法,它只表明该类的实例是可序列化的。,对象流和序列化,使用Serializable接口序列化一个对象。 (1)创建一个ObjectOutputStream,这个输出流是一个处理流,所以必须建立在其它节点流的基础之上。 ObjectOut

18、putStream oos = new ObjectOutputStream(new FileOutputStream(“object.txt”); (2)调用ObjectInputStream对象的writeObject方法输出可序列化对象。 Person per = new Person(“张三”,21); oos.write(per);,对象流和序列化,反序列化的步骤: (1)创建一个ObjectInputStream : ObjectInputStream ois = new ObjectInputStream(new FileInputStream(“object.txt”); (2

19、)调用ObjectInputStream对象的readObject方法读取流中的对象,该方法返回一个Object类型的Java对象,需要将该对象转换成其真实的类型。 Person p = (Person)ois.readObject();,对象流和序列化,public class Student implements Serializable int id; String name; int age; String department; public Student(int id, String name, int age, String department) this.id=id; th

20、=name; this.age=age; this.department =department; ,对象流和序列化,public class Objectser public static void main(String args) Student stu=new Student(981036, “Li Ming”, 16, “software”); try FileOutputStream fo = new FileOutputStream(“data.txt”); ObjectOutputStream so = new ObjectOutputStream(fo); so

21、.writeObject(stu); so.close(); catch(Exception e) System.out.println(e) ; ,对象流:例子(对象的存储),public class ObjectRecov public static void main(String args) Student stu; try FileInputStream fi = new FileInputStream(“data.ser”); ObjectInputStream si = new ObjectInputStream(fi); stu = (Student)si.readObject

22、(); System.out.println(“ID: ”+stu.id+“name:”+ +“age:”+stu.age+“dept.:”+stu.department); si.close(); catch(Exception e) System.out.println(e); ,对象流:例子(对象的存储),如果不希望某属性值序列化可在该属性前面加上transient关键字,Java序列化时无须理会该属性值。,自定义序列化,Java还提供了另外一种自定义序列化机制,通过这种序列化机制,程序员可以完全控制序列化机制。,需要这种特殊处理的类应该提供下列方法:,1、private

23、 void writeObject(ObjectOutputStream out) throws IOException; 2、private void readObject(ObjectInputStream in) throws ClassNotFoundException,IOException;,TestCustom.java,3、字符流,从JDK1.1开始, java.io包中加入了专门用于字符流处理的类,它们是以Reader和Writer为基础派生的一系列类。 同类InputStream和OutputStream一样,Reader和Writer也是抽象类,只提供了一系列用于字符流处

24、理的接口。它们的方法与类InputStream和OutputStream类似,只不过其中的参数换成字符或字符数组。,void close() int read() int read(char cbuf) int read(char cbuf, int off, int len),Reader,Writer,void close() void flush() void write(int c) void write(char cbuf) void write(char cbuf, int off, int len) void write(String str) void write(String

25、 str, int off, int len),TestFileReader.java和TestFileWriter.java,BufferedReader和BufferedWriter,同样的,为了提高字符流处理的效率,java.io中也提供了缓冲流BufferedReader和BufferedWriter。其构造方法与BufferedInputStream和BufferedOutputStream相类似。另外,除了read()和write()方法外,它还提供了整行字符处理方法: public String readLine(): BufferedReader的方法,从输入流中读取一行字符,

26、行结束标志为n、r或两者一起。 public void newLine(): BufferedWriter的方法,向输出流中写入一个行结束标志,它不是简单的换行符n或r,而是系统定义的行隔离标志(line separator)。,例:TestBufferedChar.java,InputStreamReader和OutputStreamWriter,InputStreamReader和OutputStreamWriter是用来把字节流转换为字符流。 InputStreamReader(InputStream in); /缺省规范 InputStreamReader(InputStream in, String enc); /指定规范enc OutputStreamWriter(OutputStream out); /缺省规范 OutputStreamWriter(OutputStream out, String enc); /指定规范enc,class FileToUnico

温馨提示

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

评论

0/150

提交评论