• 1. 第八章 java的输入输出8.1 流概念 8.2 Java用于输入输出流的类 8.3 数据池流的使用 8.4 处理流的使用 8.5 文件随机读取 8.6 对象的串行化1
  • 2. 8.1 流概念Java使用流的机制实现输入输出。 流:是一个数据序列。有两种流: 1. 输入流 2. 输出流 第八章 java的输入输出2
  • 3. 8.1 流概念1. 输入流 通过打开一个到数据源(文件、内存或网络端口上的数据)的输入流,程序可以从数据源上顺序读取数据。 第八章 java的输入输出3
  • 4. 8.1 流概念1. 输入流 读数据的逻辑为: open a stream while more information read information close the stream 第八章 java的输入输出4
  • 5. 8.1 流概念2. 输出流 通过打开一个到目标的输出流,程序可以向外部目标顺序写数据。  第八章 java的输入输出5
  • 6. 8.1 流概念2. 输出流 写数据的逻辑为: open a stream while more information write information close the stream   第八章 java的输入输出6
  • 7. 8.2 Java用于输入输出流的类按所读写的数据类型分两类: 字符流类(Character Streams) 字符流类用于向字符流读写16位二进制字符。  字节流类(Byte Streams) 字节流类用于向字节流读写8位二进制的字节。一般地,字节流类主要用于读写诸如图象或声音等的二进制数据。   第八章 java的输入输出7
  • 8. 8.2 Java用于输入输出流的类java.io中的基本流类: 说明:它们是抽象类,不能直接创建对象。 第八章 java的输入输出8
  • 9. 8.2 Java用于输入输出流的类1. InputStream 方法 The three basic read methods: int read() int read( byte[] buffer) int read( byte[] buffer, int offset, int length) The other methods: void close() int available() skip( long n) 第八章 java的输入输出9
  • 10. 8.2 Java用于输入输出流的类2. OutputStream 方法 The three basic write methods: void write( int c) void write( byte[] buffer) void write( byte[] buffer, int offset, int length) The other methods: void close() void flush() 第八章 java的输入输出10
  • 11. 8.2 Java用于输入输出流的类3. Reader Methods The three basic read methods: int read() int read( char[] cbuf) int read( char[] cbuf, int offset, int length) The other methods: void close() boolean ready() skip( long n) 第八章 java的输入输出11
  • 12. 8.2 Java用于输入输出流的类4. Writer 方法 The three basic write methods: void write( int c) void write( char[] cbuf) void write( char[] cbuf, int offset, int length) void write( String string) void write( String string, int offset, int length) The other methods: void close() void flush() 第八章 java的输入输出12
  • 13. 8.2 Java用于输入输出流的类5. InputStream Class的继承关系: 第八章 java的输入输出13
  • 14. 8.2 Java用于输入输出流的类6. OutputStream Class的继承关系: 第八章 java的输入输出14
  • 15. 8.2 Java用于输入输出流的类7. Reader Class的继承关系: 第八章 java的输入输出15
  • 16. 8.2 Java用于输入输出流的类8. Writer Class的继承关系: 第八章 java的输入输出16
  • 17. 8.3 数据流的使用 对输入/输出流类按用途分: 数据的发起与接收流 :用于向诸如字符串、文件、管道等专用的数据池读写数据。不同的数据池由不同的类实现。 处理流:处理流类在进行读写时要执行某种处理,如缓冲、编码等 第八章 java的输入输出17
  • 18. 8.3 数据流的使用 第八章 java的输入输出18
  • 19. 8.3 数据流的使用 1.如何使用文件流: 例题:将一个文件的内容拷贝到另一个文件。 见:copy.java第八章 java的输入输出19
  • 20. 介绍 File 类第八章 java的输入输出File类用来访问本地文件系统中的文件和目录。 1. 创建File类 myFile = new File(" myfile. txt"); File myDir = new File(" MyDocs"); myFile = new File( myDir, "myfile. txt"); 20
  • 21. 介绍 File 类第八章 java的输入输出2. File类中的方法 File names: String getName() String getPath() String getAbsolutePath() String getParent() boolean renameTo( File newName) File tests: boolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory()21
  • 22. 介绍 File 类第八章 java的输入输出2. File类中的方法 General file information and utilities: long length() boolean delete() Directory utilities: boolean mkdir() String[] list() 见例题:File.txt 22
  • 23. 8.3 数据流的使用 2.如何使用管道流: 信息管道是本身是虚拟的,但为线程或程序提供了通过流进行通信的功能。 第八章 java的输入输出进程1进程223
  • 24. 8.3 数据流的使用 使用管道的好处:第八章 java的输入输出24
  • 25. 8.3 数据流的使用 2.如何使用管道流: 例题: 一个线程将一个字符串传递给另一个线程。 见:PipedIOApp.java 第八章 java的输入输出25
  • 26. 8.4 处理流的使用 Processing Streams第八章 java的输入输出26
  • 27. 8.4 处理流的使用 Processing Streams第八章 java的输入输出1. Buffered Streams 见例题:TestBufferedStreams.java27
  • 28. 8.4 处理流的使用 Processing Streams第八章 java的输入输出2. 对标准输出输出的操作。 System. out :an object of PrintStream类 System. in:object of InputStream类 System. err:PrintStream 例题:从标准输入设备中读数据。 见:KeyboardInput.java 28
  • 29. 8.4 处理流的使用 Processing Streams第八章 java的输入输出2. 对标准输出输出的操作。 重导向标准IO 在System类中允许我们重新定向标准输入、输出以及错误IO流。此时要用到下述简单的静态方法调用: setIn(InputStream) setOut(PrintStream) setErr(PrintStream) 见例题:Redirecting.java29
  • 30. 8.4 处理流的使用 Processing Streams第八章 java的输入输出3. SequenceInputStream 流。 例题:将两个文件输入流合并成一个输入流。 见:SequenceIOApp.java30
  • 31. 8.4 处理流的使用 Processing Streams第八章 java的输入输出4. DataInputStream and DataOutputStream 提供了允许从流读写任意对象与基本数据类型功能的方法。 见例题DataIOTest.java31
  • 32. 8.5 文件随机读取 Random Access Files第八章 java的输入输出1. 创建随机文件: myRAFile = new RandomAccessFile( String name, String mode); myRAFile = new RandomAccessFile( File file, String mode); 例如: new RandomAccessFile("farrago.txt", "r"); new RandomAccessFile("farrago.txt", "rw"); 32
  • 33. 8.5 文件随机读取 Random Access Files第八章 java的输入输出2. 常用方法: getFilePointer() seek( long pos) length() skipBytes(int n) 见例题:RandomIOApp.java 33
  • 34. 8.6 对象串行化 对象串行化也称为对象的序列化。对象串行化使得一个程序可以把一个完整的对象写到一个字节流里面;其逆过程则是从一个字节流里面读出一个事先存储在里面的完整的对象,称为对象的并行化。Java串行处理功能真正强大之处在于一个Java程序可以很容易地将一个Java对象和一个二进制流之间相互转换。 对象串行化机制能自动弥补不同操作系统之间的差异;可以将对象的状态持久化保存;可以实现分布式对象;以及用于对象的“深复制”。34
  • 35. 8.6 对象串行化Java对象串行化不仅保存了对象的全部信息,而且能追踪对象内所包含的所有引用,并保存那些对象;以此递归,形成一个对象网。递归串行化引用的对象时,Java对象串行化算法还自动维护串行化的对象引用表,防止发送同一引用对象的多个副本。 串行化通常可以自动完成,串行化时对象的所有数据成员都可串行化除了声明为static的成员。对于不需要串行化的数据成员还可以通过transient关键字将其强行屏蔽。35
  • 36. 8.6 对象串行化 在Java中,实现了java.io.Serializable接口的类对象可以串行化,不需要在类中增加任何代码。然而并不是每个类都可串行化的。 java.io包有两个串行化对象的流类。ObjectOutputStream负责将对象写入字节流,ObjectInputStream从字节流读出对象。对象文件内存中临时存储磁盘中持久存储储写出读入串行化并行化ObjectOutputStreamFileOnputStreamObjectIutputStreamFileInputStream36
  • 37. 8.6.1 串行化概念与目的概念 ★ObjectInputStream(节点流) ★ObjectOutputStream(节点流) 目的 ★Java 远程方法调用(Remote Method Invocation ,RMI) ★对象永久化37
  • 38. 8.6.2 对象串行化的方法1.把对象写到对象输出流 public final void writeObject(Object obj) throws IOException 2.从对象输入流读取对象 public final Object readObject() throws IOException,ClassNotFoundException38
  • 39. 8.6.3 构造可串行化对象的类1.Serializable接口完整定义 package java.io; public interface Serializable{ } 2.定义可串行化类 public class MySerializableClass implements Serializable{ … }39
  • 40. 8.6.4 定制串行化1. 部分定制串行化 在串行化类定义并实现writeObject()和readObject()方法。 2. 完全定制串行化 实现Externalizable接口,完整定义: package java.io; import java.io.ObjectOutput; import java.io.ObjectInput; public interface Externalizable extends java.io.Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; }40
  • 41. 8.6.4 定制串行化实现完全定制化的类要遵守以下规则: ★实现java.io.Externalizable 接口 ★实现 writeExternal()和readExternal() ★如果串行化中使用了外部定义的数据格式,则writeExternal()和readExternal()方法都必须完全依照该格式。 ★必须定义一个具有public 访问权限的不带参数的构造方法41
  • 42. 8.6.5 串行化小结1. 对敏感信息的保护 private/ transient 2. 串行化的注意事项 ★transient关键词的使用 ★串行化对象存储或传输中的安全42
  • 43. 综合例题见例题IODemo.java第八章 java的输入输出作业: 第八章作业43