29
T8 IO T8 IO 输输 输输 / / 输输 输输

T8 IO 输入 / 输出

  • Upload
    nevina

  • View
    187

  • Download
    0

Embed Size (px)

DESCRIPTION

T8 IO 输入 / 输出. 上讲回顾. 了解异常的定义 了解异常的分类 掌握 try 、 catch 和 finally 语句的用法 掌握 throw 、 throws 子句的用法. 本讲目标. 1 、了解什么是流 2 、 InputStream 类和 OutputStream 类 3 、 FileInputSteam/FileOutputStream 类 4 、 Reader 与 Writer 类 5 、 File 类. I/O 简介. 引言 :Java 程序的输入输出功能是通过流 (stream) 来实现的 . 什么是流 ? - PowerPoint PPT Presentation

Citation preview

Page 1: T8 IO 输入 / 输出

T8 IOT8 IO 输入输入 // 输出输出

Page 2: T8 IO 输入 / 输出

上讲回顾上讲回顾• 了解异常的定义

• 了解异常的分类

• 掌握 try 、 catch 和 finally 语句的用法

• 掌握 throw 、 throws 子句的用法

Page 3: T8 IO 输入 / 输出

本讲目标本讲目标1 、了解什么是流

2 、 InputStream 类和 OutputStream 类

3 、 FileInputSteam/FileOutputStream 类

4 、 Reader 与 Writer 类

5 、 File 类

Page 4: T8 IO 输入 / 输出

I/OI/O 简介简介• 引言 :Java 程序的输入输出功能是通过流 (st

ream) 来实现的 .• 什么是流 ?

– 一组有顺序的、有起点和终点的字节结合。 如文件、网络。

– 注意与文件的区别文件是数据的静态存储方法。流是数据在传

输时的一种形态。

Page 5: T8 IO 输入 / 输出

流的分类流的分类

• 流按照处理数据的单位可以分为两种 :字节流和字符流 .

文件文本文件

二进制文件二进制文件的基本存储单位是字节文本文件的基本存储单位是字符

Page 6: T8 IO 输入 / 输出

字节流和字符流字节流和字符流• 字节流字节流 (byte stream)(byte stream) 为处理字节的输入和输出为处理字节的输入和输出 .. 例如使例如使用字节流读取或书写二进制数据用字节流读取或书写二进制数据 ..

• 字符流字符流 (character stream)(character stream) 为字符输入和输出处理提供了为字符输入和输出处理提供了方便方便 .. 它采用统一编码标准它采用统一编码标准 .. 因而可以国际化因而可以国际化 ,, 在某些在某些场合场合 ,, 字符流比字节流更高效字符流比字节流更高效 ..

• JavaJava 的原始版本不包括字符流的原始版本不包括字符流 .. 所有的输入和输出都所有的输入和输出都是以字节为单位的是以字节为单位的 ..

• 在最底层在最底层 ,, 所有的输入和输出都是字节形式所有的输入和输出都是字节形式 ,, 基于字符基于字符的流只为处理字符提供更有效的方法的流只为处理字符提供更有效的方法 ..

Page 7: T8 IO 输入 / 输出

File File 类类• File 类是 IO 包中唯一能够代表磁盘文件本身的对象。

• File 类定义了一些与平台无关的方法进行文件操作,如建立、删除、查询、重命名等。

• 可以用它来表示某个文件的名字,也可以用它来表示目录里一组文件的名字。

Page 8: T8 IO 输入 / 输出

File File 类类• File 给出的构造函数

– public File(String path)如果 path 是实际存在的路径,则该 File 对象表示的是目录如果 path 是文件名,则该 File 对象表示的是文件

– public File(String path,String name)path 是路径名, name 是文件名

– public File(File dir,String name)dir 是路径名, name 是文件名

Page 9: T8 IO 输入 / 输出

FileFile 类的方法类的方法• 文件名的处理

– String getName( ) ; // 得到一个文件的名称(不包括路径)– String getPath( ) ; // 得到一个文件的路径名– String getAbsolutePath( ) ; // 得到一个文件的绝对路径名– String getParent( ) ; // 得到一个文件的上一级目录名

• 文件属性测试– boolean exists( ) ; // 测试当前 File 对象所指示的文件是否存在– boolean canWrite( ) ; // 测试当前文件是否可写– boolean canRead( ) ; // 测试当前文件是否可读– boolean isFile( ) ; // 测试当前文件是否是文件(不是目录)– boolean isDirectory( ) ; // 测试当前文件是否是目录

Page 10: T8 IO 输入 / 输出

File File 类类

• 普通文件信息和工具– long lastModified( );// 得到文件最近一次修改的时间

– long length( ); // 得到文件的长度,以字节为单位– boolean delete( ); // 删除当前文件

• 目录操作– boolean mkdir( ); // 根据当前对象生成一个由该对象指定的路径

– String list( ); // 列出当前目录下的文件例子: FileTest.java

Page 11: T8 IO 输入 / 输出

FileInputStreamFileInputStream 类类

• 构造函数–FileInputStream(File file)

File f = new File(“test.txt”);

FileInputStream inTow = new FileInputStream(f);

–FileInputStream(String name)FileInputStream inOne =

new FileInputStream(“abcdefghijklmnokq”);

Page 12: T8 IO 输入 / 输出

FileOutputStreamFileOutputStream 类类• 构造函数

– FileOutputStream(File file) – FileOutputStream(File file, boolean append)

创建一个文件输出流对象,并将内容写到指定的 file 对象中,如果 append 为真,则接着文件最后写,否则从头写

– FileOutputStream(String name)– FileOutputStream(String name,boolean appen

d)创建一个文件输出流对象,并将内容写到指定的 name 文件名,

如果 append 文真,则接着文件最后写,否则从头写如果该文件不存在,则创建一个同名的新文件,此时的 name 只

能是文件名,而非目录名该文件此时也不能正被其他程序操作

Page 13: T8 IO 输入 / 输出

I/OI/O 简介简介

• 基本流类:– 输入流

字节输入流 InputStream

字符输入流 Reader

– 输出流字节输出流 OutputStream

字符输出流 Writer

Page 14: T8 IO 输入 / 输出

InputStreamInputStream 类的层次图类的层次图

Page 15: T8 IO 输入 / 输出

InputStreamInputStream• InputStream 是基本的输入流类,是一个抽象类• 它的任务就是代表那些能从各种输入源获取数据的类。– 输入源可为:

byte 数组 String 对象 文件 类似流水线的 " 管道 (pipe)" 。把东西从一头放进

去,让它从另一头出来。 一个 " 流的序列 (A sequence of other streams)" ,

可以将它们组装成一个单独的流。 其它源,比如 Internet 的连接。

Page 16: T8 IO 输入 / 输出

InputStreamInputStream 类类• 它的常用方法有:• 读取一个字节,返回值为所读的字节 int read();

• 读入 b.length 个字节到数组 b 并返回实际读入的字节数 int read(byte[] b)

• 读入流中的数据到数组 b, 保顾虑在从 off 开始的长度为 len 的数组元素中 int read(byte[] b,int off,int len)

• 跳过输入流上的 n 个字节并返回实际跳过的字节数 long skip(long n)

• 返回当前输入流中可读的字节数 int available()

• 流操作完毕后必须关闭 close( );

Page 17: T8 IO 输入 / 输出

InputStreamInputStream 类类• 使用输入流中的标记:

– void mark( int readlimit );记录当前读指针所在位置, readlimit 表示读指

针读出 readlimit 个字节后所标记的指针位置才失效

– void reset( ); 把读指针重新指向用 mark 方法所记录的位置

– boolean markSupported( );当前的流是否支持读指针的记录功能

Page 18: T8 IO 输入 / 输出

OutputStreamOutputStream 类的层次图类的层次图

Page 19: T8 IO 输入 / 输出

OutputStreamOutputStream• OutputStream 是最基本的输出流类• 与 InputStream 对应,它定义了输出流类共同的特性

• 但它的所有方法都是 void 返回类型。• 常用方法有:• 输出数据:

– void write( int b );    // 往流中写一个字节 b– void write( byte b[ ] ); // 往流中写一个字节数组 b– void write( byte b[ ], int off, int len );

把字节数组 b 中从下标 off 开始,长度为 len 的字节写入流中– flush( )

刷空输出流,并输出所有被缓存的字节由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。

– close( )流操作完毕后必须关闭

Page 20: T8 IO 输入 / 输出

流的分类流的分类 --InputStream--InputStream

Page 21: T8 IO 输入 / 输出

流的分类流的分类 --OutputStream--OutputStream

Page 22: T8 IO 输入 / 输出

ReaderReader 与与 WriterWriter 类 类 -- -- 字字符符流流• inputStream 与 outputStream 是用来处理字节的,用来处理字符文本时不太方便。

• 这类流以 16 位的 Unicode 码表示的字符为基本处理单位。

Page 23: T8 IO 输入 / 输出

Reader -- Reader -- 提供的操作提供的操作• public int read() throws IOException;

– 读取一个字符,返回值为读取的字符• public int read(char cbuf[ ]) throws IOException;

– 读取一系列字符到数组 cbuf[] 中,返回值为实际读取的字符的数量• public abstract int read(char cbuf[],int off,int len) throws IOExcept

ion;– 读取 len 个字符,从数组 cbuf[] 的下标 off 处开始存放,返回值为实际

读取的字符数量,该方法必须由子类实现

• public boolean markSupported();– 判断当前流是否支持做标记

• public void mark(int readAheadLimit) throws IOException;– 给当前流作标记,最多支持 readAheadLimit 个字符的回溯。

• public void reset() throws IOException; – 将当前流重置到做标记处

• public abstract void close() throws IOException; 关闭

Page 24: T8 IO 输入 / 输出

Writer – Writer – 提供的操作提供的操作• public void write(int c) throws IOException ;

– 将整型值 c 的低 16 位写入输出流• public void write(String str) throws IOException ;

– 将字符串 str 中的字符写入输出流• public void write(char cbuf[]) throws IOException ;

– 将字符数组 cbuf[] 写入输出流• public abstract void write(char cbuf[],int off,int len) throws IO

Exception ;– 将字符数组 cbuf[] 中的从索引为 off 的位置处开始的 len 个字符写

入输出流• public void write(String str,int off,int len) throws IOException ;

– 将字符串 str 中从索引 off 开始处的 len 个字符写入输出流

• flush( ) 刷空输出流,并输出所有被缓存的字节。• close() 关闭流

例子: FileRead.java

Page 25: T8 IO 输入 / 输出

Reader Reader 和 和 WriterWriter 类系类系– 主要用来读写字符串数据,即文本数据– 二进制文件与文本文件的区别文件最终都是以二进制的形式存储,如果一个文件中的每个字节或每相邻的几个字节的数据都可以表示成某种字符,这样的文件就是文本文件,可见文本文件只是二进制文件的一种,如 mp3 、图像的文件就不能转换成字符,而 txt 文件里面存储的都是字符

通常不直接使用这两个类,而是根据他们所派生出来的子类的对象来创建实例

– FileReader 和 FileWriter 类分别继承自 Reader 类和 Writer 类

Page 26: T8 IO 输入 / 输出

流的分类—流的分类— Reader Reader

Page 27: T8 IO 输入 / 输出

流的分类流的分类 --Writer--Writer

Page 28: T8 IO 输入 / 输出

字节流与字符流的转换字节流与字符流的转换• InputStreamReader 类

– 将字节流转换成字符流– 例 :– New BufferedReader(new inputStreamReader(System.in)))

• OutputStreamReader 类– 将写入的字符编码转换成字节码写入字节流– New BufferedWriter(new inputStreamWriter(System.out)))

Page 29: T8 IO 输入 / 输出

总结总结• 1 、了解什么是流

• 2 、 InputStream 类和 OutputStream 类

• 3 、 FileInputSteam/FileOutputStream 类

• 4 、 Reader 与 Writer 类

• 5 、 File 类