42
LOGO 第 3 第 第第 Java 第第第第第第 第第

第 3 章 流与 Java 中的文件操作

Embed Size (px)

DESCRIPTION

第 3 章 流与 Java 中的文件操作. 孙焘. 10. 7. 9. 8. 6. 4. 5. 2. 1. 3. 对象流. 管道流. 输入输出流的基类. Java 中的 Unicode. 输入输出流. 随即存取文件. FILE I/O. 流的分类. 输入输出方法. 文件的其他操作. 重点:. 3.1 输入输出方法. 什么是数据流 ?. 文件 , 字符串 存储区. 文件. 文件. 终点. 起点. 程序. 程序. 网络端点. 终端. 数据流. 网络端点. 数据流是指所有的数据通信通道 - PowerPoint PPT Presentation

Citation preview

Page 1: 第 3 章 流与 Java 中的文件操作

LOGO

第 3 章 流与 Java 中的文件操作

孙焘

Page 2: 第 3 章 流与 Java 中的文件操作

重点:

输入输出方法1

输入输出流的基类2

FILE I/O3

输入输出流4

随即存取文件5

文件的其他操作6

Java 中的 Unicode7

管道流8

对象流9

流的分类10

Page 3: 第 3 章 流与 Java 中的文件操作

3.1 输入输出方法

文件

程序

终端

文件程序

网络端点数据流

起点 终点

网络端点

文件 , 字符串存储区

什么是数据流 ?

数据流是指所有的数据通信通道 在 java 中有关流的操作使用 java.io.* 出于安全的考虑 , 小应用不能实现文件 I/O 流

Page 4: 第 3 章 流与 Java 中的文件操作

3.1 输入输出方法

System 类管理标准输入输出流和错误流 System.out:把输出送到缺省的显示 ( 通常是显示器 )System.in从标准输入获取输入 ( 通常是键盘 ) System.err把错误信息送到缺省的显示每当 main 方法被执行时 , 就自动生成上述三个

对象

Page 5: 第 3 章 流与 Java 中的文件操作

3.1 输入输出方法为什么输入的是字符 , 输出是乱码 ?原因 :System.out.println(bArray) 输出的是数组的地

址而不是字符改进 : 将字符数组变换成字符串原来是 :System.out.println(bArray);现在为 :String s=new String(bArray,0); System.out.println(s);System.in 是属于 BufferedInputStream 类型System.out 是属于 PrintStream 类型System.err 也是属于 PrintStream 类型

Page 6: 第 3 章 流与 Java 中的文件操作

3.2 输入输出流的基类

Java 中每一种流的基本功能依赖于基本类InputStream 和 OutputStream

它们是抽象类 , 不能直接使用属于 InputStream 类的方法有 :read(): 从流中读入数据skip(): 跳过流中若干字节数available(): 返回流中可用字节数mark(): 在流中标记一个位置reset(): 返回标记过得位置markSupport(): 是否支持标记和复位操作close(): 关闭流

Page 7: 第 3 章 流与 Java 中的文件操作

3.2 输入输出流的基类

方法 read() 提供了三种从流中读数据的方法 .int read(): 读一个整数int read(byte b[]): 读多个字节到数组中int read(byte,int off,int len);属于 OutputStream 类的方法有 :write(int b): 将一个整数输出到流中write(byte b[]): 将数组中的数据输出到流中write(byte b[], int off,int len): 将数组 b

中从 off 指定的位置开始 len 长度的数据输出到流中

Page 8: 第 3 章 流与 Java 中的文件操作

3.2 输入输出流的基类

flush(): 将缓冲区中的数据强制送出close(): 关闭流 .PrintStream 类println() 不属于 OutputStream 类 , 它是

PrintStream 类的子类 , 能提供复杂的输出PrintStream 类的方法有 :write, flush, checkError,print,

println,close.其中 println 可以输出多种形式的数据 . 例如 : println(String s), println(char c) 等

Page 9: 第 3 章 流与 Java 中的文件操作

3.3 File I/O

文件对象的建立File fp=new File(“tempfile.txt”);对文件操作要定义文件流FileInputStream 类用来打开一个输入文件FileOutputStream 类用来打开一个输出文件

输出文件 输入文件

Page 10: 第 3 章 流与 Java 中的文件操作

3.3 File I/O

文件流的建立FileInputStream in=new FileInputStream(fp);FileOutputStream out=new FileOutputStream(fp);例 : 文件拷贝 ( 注意要捕获文件异常 )输入流的参数是用于输入的文件名输出流的参数是用于输出的文件名

file1.txt file2.txt输入流 输出流

Page 11: 第 3 章 流与 Java 中的文件操作

3.3 File I/O

增加缓冲区流 , 减少访问硬盘的次数 , 提高效率

文件

文件流 缓冲区流

file1.txt file2.txt输入流 输出流

输入缓冲区 输出缓冲区

Page 12: 第 3 章 流与 Java 中的文件操作

3.3 File I/O

缓冲区流 :BufferedInputStream 和

BufferedOutputStream将它们与文件流相接FileInputStream in=new FileInputStream(“file1.txt”);BufferedInputStream bin= new BufferedInputStream(in,256) int len; byte bArray[]=new byte[256];len=bin.read(bArray);len 中得到是长度 , bArray 中得到的是数据

Page 13: 第 3 章 流与 Java 中的文件操作

3.3 File I/O

只有缓冲区满时 , 才会将数据送到输出流 .Java 在输出数据流中 , 当对方尚未将数据取走

时 , 程序就会被阻塞 .有时要人为地将尚未填满的缓冲区中的数据送

出 , 使用 flush() 方法 .

文件

Page 14: 第 3 章 流与 Java 中的文件操作

3.4 数据输入输出流什么时候需要数据输入输出流 ?文件流和缓冲区流的处理对象是字节或字节数组,

利用数据输入输出流可以实现对文件的不同数据类型的读写 .

DataInputStream 、 DataOutputStream一种较为高级的数据输入输出方式 , 除了字节和字

节数组 , 还可以处理 int,float,boolean 等类型 .还可以用 readLine 方法读取一行信息可使用的方法 : write,writeBoolean…,read,readByte… 等

Page 15: 第 3 章 流与 Java 中的文件操作

3.4 数据输入输出流数据流的建立FileOutputStream fos= new FileOutputStream(”file2.txt"));DataInputStream dis= new DataInputStream(fos)

数据输出流可以是一个已经建立好的输入数据流对象 , 例如网络的连结 , 文件等 .

Page 16: 第 3 章 流与 Java 中的文件操作

3.4 数据输入输出流 DateLine(InputStream in)( 计算字符和行数 ) { DataInputStream data=new DataInputStream(in); String currentLine; int lineCount=0; int charCount=0; while((currentLine=dataIn.readLine())!=null) { ++lineCount; charCount+=currentLine.length(); } return (charCount/(float)lineCount); }

Page 17: 第 3 章 流与 Java 中的文件操作

文件目录zip 文件

3.5 随机存取文件类 RandomAccessFile zip 文件需要用随机方法处理文件目录给出个文件的入口 , 可以随机读取 .创建一个随机文件new RandomAccessFile(“file1.txt”, “r”);new RandomAccessFile(“file2.txt”, “rw”);随机文件可以同时完成读和写操作 .

Page 18: 第 3 章 流与 Java 中的文件操作

pos

3.5 随机存取文件支持随机文件操作的方法 :readXXX() 或 writeXXX()skipBytes(); 将指针乡下移动若干字节seek(): 将指针调到所需位置getFilePointer(): 返回指针当前位置length(): 返回文件长度利用 seek(long pos) 方法查找随机文件中的信息例 : 把若干个 32 位的整数写到一个名为

“ temp.dat” 的文件中 , 然后利用 seek 方法 , 以相反的顺序再读取这些数据

Page 19: 第 3 章 流与 Java 中的文件操作

3.6 文件的其它操作

使用文件类获取文件的路径信息设 f 是一个文件对象File f=new File(“data”,temp.dat”);

f.getName(): 返回文件名 temp.dat

f.getParent(): 返回文件所在目录名 data

f.getPath(): 返回文件路径 data\temp.dat

f.getAbsolutePath(): 返回绝对路 c:\

myprog\data\temp.dat

Page 20: 第 3 章 流与 Java 中的文件操作

3.6 文件的其它操作 例 : 获取当前目录下所有文件名和文件的尺寸 : import java.io.*; public class file_size { public static void main(String args[]) { File files=new File(“.”); String file_list[]=files.list(); for(int i=0;i<file_list.length;i++) { File current_file=new File(file_list[i]); System.out.println(file_list[i]+ current_file.length()); } }

Page 21: 第 3 章 流与 Java 中的文件操作

在 java 中用 unicode 表示字符和字符串DatainputStream 的 readLine 方法 , 以字节

形式读入 , 以 unicode 形式输出

DataInputStream 不适合输入是 unicode 的形式

处理字符用 InputStreamReader 类和BufferedReader 类 (jdk1.1)

byte Unicode

16bit8 bit

+ 00000000

3.7 java 中的 unicode

Page 22: 第 3 章 流与 Java 中的文件操作

3.7 java 中的 unicodeimport java.io;( 从键盘上读一个字符串 )public class CharInput{ public static void main(String args[]) {String s; throws IOException InputStreamReader ir; BufferedReader in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); String s=in.readLine(); int i=Integer.parseInt(s); i=i*2; System.out.println(“the result is” +i); }}

可以将字符串转换成整数加

以运算123

Page 23: 第 3 章 流与 Java 中的文件操作

3.7 java 中的 unicode

问题 :如果字符流不是来自本地 , 有可能编码不一样 , 直

接读取会读出不正确字符

处理方法 :ir=new InputStreamReader(is,”8859_1”);采用的是 iso8859_1 编码方式 , 在不同平台之间

正确转换字符 .

Page 24: 第 3 章 流与 Java 中的文件操作

24

3.7 java 中的 unicode

import java.io.*;class filetounicode{ public static void main(String args[]) { try{ FileInputStream fis=new FileInputStream("toyamei.txt"); InputStreamReader dis=new InputStreamReader(fis); BufferedReader reader=new String s; BufferedReader(dis); while((s=reader.readLine())!=null) { System.out.println("read: "+s);} dis.close(); }catch(IOException e) { } }}

Page 25: 第 3 章 流与 Java 中的文件操作

3.8 使用管道流

PipedInputStream 和 PipedOutputStream创建管道流 :PipedInputStream pis=new PipedInputStream();PipedOutputStream pos=new

PipedOutputStream(pis);或 :PipedOutputStream pos=new

PipedOutputStream();PipedInputStream pis=new

PipedInputStream(pos);

输出流 输入流

Page 26: 第 3 章 流与 Java 中的文件操作

3.8 使用管道流 管道流一定是输入输出并用 例 : 将数据从输出管道进 , 从输入管道出 import java.io.*;

class pipedstream { public static void main(String args[]) throws IOException { byte aByteData1=123, aByteData2=111; PipedInputStream pis= new PipedInputStream(); PipedOutputStream pos= new PipedOutputStream(pis); System.out.println("PipedInputStream");

Page 27: 第 3 章 流与 Java 中的文件操作

try{ pos.write(aByteData); pos.write(aByteData2); System.out.println((byte)pis.read()); System.out.println((byte)pis.read());} finally { pis.close(); pos.close();}

3.8 使用管道流

Page 28: 第 3 章 流与 Java 中的文件操作

3.9 对象流

在 java.io包中什么是对象的持续性 ?能够纪录自己的状态一边将来再生的能力 ,叫

对象的持续性什么是串行化 ?对象通过写出描述自己状态的的数值来记录自

己的过程叫串行化 .什么是对象流 ?能够输入输出对象的流 .两者什么关系 ?将串行化的对象通过对象输入输出流写入文件

或传送到其它地方 .

Page 29: 第 3 章 流与 Java 中的文件操作

3.9 对象流一个相关的例子 : 从一个源读入一个简单的对象import java.net;import java.iopublic class GetString{ public String getStringFromUrl(URL inURL) { InputStream in; try { in =inURL.openStream(); }catch(IOException ioe) {System.out.printlin(“URL error;”+ioe); return null; } return getString(in); } 通过 url 得到一个字符串

Page 30: 第 3 章 流与 Java 中的文件操作

3.9 对象流public String getStringFromSocket(Socket

inSocket){ inputStream in; try{ in=inSocket.getInputStreamSream(); }catch(IOEception ioe) { System.out.println(“Socket

error:”+ioe);   return null; } return getString(in);} 通过 socket 得到一个字符串

Page 31: 第 3 章 流与 Java 中的文件操作

3.9 对象流public String getString(inputStream inStream){ String readString = new String(); DataInputStream in =new DataInputSream(inStream); char inChar; try{ while(true) { inChar=in.readByte(); readString=readString+inChar; } }catch(EOFException eof) { System.out.println(readString);} }catch(IOException ioe) { { System.out.println(“error:”+ieo);} return readString; }

Page 32: 第 3 章 流与 Java 中的文件操作

3.9 对象流 下面的对象能读吗 ? Class testObject { int x; int y; float angle; String name; public testObject(int x,int y,float angle, String name); { this.x=x;this.y;this.angle;this.name=name;} } 这仍然是一个简单的对象

Page 33: 第 3 章 流与 Java 中的文件操作

3.9 对象流对象流是怎样工作的 ?

允许可串行化的对象在流中传输1. 只有实现 serializable 接口的类才能被串行化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; this.name=name;

this.age=age; this.department =departmernt; }}

Page 34: 第 3 章 流与 Java 中的文件操作

3.9 对象流2. 构造对象的输入输出流 ( 将对象保存到文件

中 , 或者通过网络传送到其他地方 )相应的类 :ObjectInput对象的输出 : ObjectOutputStream相应的方法 :writeObject()对象的输入 :ObjectInputStream相应的方法 :readObject()注 :jdk1.1 以上版本支持对象流操作

Page 35: 第 3 章 流与 Java 中的文件操作

3.9 对象流对象流举例 : 将 Student 类的一个实例写到文件中import java.io.FileOutputStream;import java.io.ObjectOutputStream;public class Objectser{public static void main(String args[]) Student stu=new Student(981036,“Li Ming”,16,“CSD”);{try {FileOutputStream fo=new FileOutputStream(“date.ser”); ObjectOutputStream so=new ObjectOutputStream(fo); os.writeObject(stu);so.close(); }catch(Exception e) {;} }

Page 36: 第 3 章 流与 Java 中的文件操作

3.9 对象流import java.io.FileInputStream;import java.io.ObjectInputStream;public class ObjectRecov{ public static void main(String args[]) { Student stu; try {FileInputStream fi=new FileInputStream(“date.ser”); ObjectInputStream si=new ObjectInputStream(fi); stu=(Student)si.readObject();si.close(); }catch(Exception e) {System.out.println(e);} System.out.println(“ID: ”+stu.id+“name:”+ stu.name+“age:”+age+“dept.:”+stu.department); }}

Page 37: 第 3 章 流与 Java 中的文件操作

3.10 流的分类InputStream 和 OutputStream 是所有输入输出流

的祖先 , 它们是一个抽象类 .System.in 和 System.out 是它们的子类

InputStream

FileInputStream

PipedIntputStream

FilterInputStream

ByteArrayInputStream

DataInputStream

BufferedInputStream

LineNumberInputStream

SequencedInputStream

StringBufferInputStream

PushbackInputStream

Page 38: 第 3 章 流与 Java 中的文件操作

3.10 流的分类InputStream 和 OutputStream 是所有输入输出流

的祖先 , 它们是一个抽象类 .System.in 和 System.out 是它们的子类

InputStream

FileInputStream

PipedIntputStream

FilterInputStream

ByteArrayInputStream

DataInputStream

BufferedInputStream

LineNumberInputStream

SequencedInputStream

StringBufferInputStream

PushbackInputStream

Page 39: 第 3 章 流与 Java 中的文件操作

3.10 流的分类

InputStream 中的基本方法包括 : read, available, mark, skip, reset,

markSuppposed, closeOutputStream 中的基本方法包括 : write, flush, close

OutputStream

FileOutputStream

PipeOutputStream

FilterOutputStream

ByteArrayOutputStream

DataOutputStream

BufferedOutputStream

PrintStream

Page 40: 第 3 章 流与 Java 中的文件操作

3.11 小结

在 Java 中有数据传输的地方都用到 I/O 流 ( 通常是文件 , 网络 ,内存和标准输入输出等 )InputStream 和 OutputStream 是所有 I/O 流的

祖先 ( 只有 RandomAccessFile 类是一个例外 ),read 和write 是它们最基本的方法 , 读写单位是字节 .

在众多的流对象中 ,并不是每一种都单独使用 , 其中过滤流的子类在数据送出去之前做必要的处理 .

文件 文件输入流 缓冲输入流 行号输入流 数据输入流 目的

Page 41: 第 3 章 流与 Java 中的文件操作

3.11 小结File, File(Input/Output)Stream,

RandomAccessFile 是处理本地文件的类Data(Input/Output)Stream 是一个过滤流

的子类 ,借此可以读写各种基本数据 , 在文件和网络中经常使用 . 如 : readByte, writeBoolean 等 .

Buffered(Input/Output)Stream 的作用是在数据送到目的之前先缓存 ,达到一定数量时再送到目的 , 已减少阻塞次数 .

Piped(Input/Output)Stream 适合与一个处理的输出作为另一个处理的输入的情况

Page 42: 第 3 章 流与 Java 中的文件操作

LOGO