290 likes | 410 Views
T8 IO 输入 / 输出. 上讲回顾. 了解异常的定义 了解异常的分类 æŽŒæ¡ try 〠catch å’Œ finally è¯å¥çš„用法 æŽŒæ¡ throw 〠throws åå¥çš„用法. æœ¬è®²ç›®æ ‡. 1 ã€äº†è§£ä»€ä¹ˆæ˜¯æµ 2 〠InputStream 类和 OutputStream ç±» 3 〠FileInputSteam/FileOutputStream ç±» 4 〠Reader 与 Writer ç±» 5 〠File ç±». I/O 简介. 引言 :Java 程åºçš„è¾“å…¥è¾“å‡ºåŠŸèƒ½æ˜¯é€šè¿‡æµ (stream) æ¥å®žçŽ°çš„ . ä»€ä¹ˆæ˜¯æµ ?
E N D
上讲回顾 • 了解异常的定义 • 了解异常的分类 • 掌握 try、catch 和 finally 语句的用法 • 掌握throw、throws子句的用法
本讲目标 1、了解什么是流 2、InputStream类和OutputStream类 3、FileInputSteam/FileOutputStream类 4、Reader与Writer类 5、File类
I/O简介 • 引言:Java程序的输入输出功能是通过流(stream)来实现的. • 什么是流? • 一组有顺序的、有起点和终点的字节结合。 • 如文件、网络。 • 注意与文件的区别 • 文件是数据的静态存储方法。流是数据在传输时的一种形态。
流的分类 • 流按照处理数据的单位可以分为两种:字节流和字符流. 文本文件 二进制文件 文件 二进制文件的基本存储单位是字节 文本文件的基本存储单位是字符
字节流和字符流 • 字节流(byte stream)为处理字节的输入和输出.例如使用字节流读取或书写二进制数据. • 字符流(character stream)为字符输入和输出处理提供了方便.它采用统一编码标准.因而可以国际化,在某些场合,字符流比字节流更高效. • Java的原始版本不包括字符流.所有的输入和输出都是以字节为单位的. • 在最底层,所有的输入和输出都是字节形式,基于字符的流只为处理字符提供更有效的方法.
File 类 • File类是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是文件名
File类的方法 • 文件名的处理 • String getName( ); //得到一个文件的名称(不包括路径) • String getPath( ); //得到一个文件的路径名 • String getAbsolutePath( );//得到一个文件的绝对路径名 • String getParent( ); //得到一个文件的上一级目录名 • 文件属性测试 • boolean exists( ); //测试当前File对象所指示的文件是否存在 • boolean canWrite( );//测试当前文件是否可写 • boolean canRead( );//测试当前文件是否可读 • boolean isFile( ); //测试当前文件是否是文件(不是目录) • boolean isDirectory( ); //测试当前文件是否是目录
File 类 • 普通文件信息和工具 • long lastModified( );//得到文件最近一次修改的时间 • long length( ); //得到文件的长度,以字节为单位 • boolean delete( ); //删除当前文件 • 目录操作 • boolean mkdir( ); //根据当前对象生成一个由该对象指定的路径 • String list( ); //列出当前目录下的文件 例子:FileTest.java
FileInputStream类 • 构造函数 • FileInputStream(Filefile) • File f = new File(“test.txt”); • FileInputStream inTow = new FileInputStream(f); • FileInputStream(Stringname) • FileInputStream inOne = • new FileInputStream(“abcdefghijklmnokq”);
FileOutputStream类 • 构造函数 • FileOutputStream(Filefile) • FileOutputStream(File file, booleanappend) • 创建一个文件输出流对象,并将内容写到指定的file对象中,如果append为真,则接着文件最后写,否则从头写 • FileOutputStream(Stringname) • FileOutputStream(Stringname,boolean append) • 创建一个文件输出流对象,并将内容写到指定的name文件名,如果append文真,则接着文件最后写,否则从头写 • 如果该文件不存在,则创建一个同名的新文件,此时的name只能是文件名,而非目录名 • 该文件此时也不能正被其他程序操作
I/O简介 • 基本流类: • 输入流 • 字节输入流 InputStream • 字符输入流Reader • 输出流 • 字节输出流 OutputStream • 字符输出流Writer
InputStream • InputStream 是基本的输入流类,是一个抽象类 • 它的任务就是代表那些能从各种输入源获取数据的类。 • 输入源可为: • byte数组 • String对象 • 文件 • 类似流水线的"管道(pipe)"。把东西从一头放进去,让它从另一头出来。 • 一个"流的序列(A sequence of other streams)",可以将它们组装成一个单独的流。 • 其它源,比如Internet的连接。
InputStream类 • 它的常用方法有: • 读取一个字节,返回值为所读的字节 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( );
InputStream类 • 使用输入流中的标记: • void mark( int readlimit ); • 记录当前读指针所在位置,readlimit表示读指针读出readlimit个字节后所标记的指针位置才失效 • void reset( ); • 把读指针重新指向用mark方法所记录的位置 • boolean markSupported( ); • 当前的流是否支持读指针的记录功能
OutputStream • 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( ) • 流操作完毕后必须关闭
Reader与Writer类 -- 字符流 • inputStream与outputStream是用来处理字节的,用来处理字符文本时不太方便。 • 这类流以16位的Unicode码表示的字符为基本处理单位。
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 IOException; • 读取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;关闭
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 IOException; • 将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流 • public void write(String str,int off,int len) throws IOException; • 将字符串str 中从索引off开始处的len个字符写入输出流 • flush( )刷空输出流,并输出所有被缓存的字节。 • close()关闭流 例子:FileRead.java
Reader 和 Writer类系 • 主要用来读写字符串数据,即文本数据 • 二进制文件与文本文件的区别 文件最终都是以二进制的形式存储,如果一个文件中的每个字节或每相邻的几个字节的数据都可以表示成某种字符,这样的文件就是文本文件,可见文本文件只是二进制文件的一种,如mp3、图像的文件就不能转换成字符,而txt文件里面存储的都是字符 通常不直接使用这两个类,而是根据他们所派生出来的子类的对象来创建实例 • FileReader和FileWriter类分别继承自Reader类和Writer类
字节流与字符流的转换 • InputStreamReader类 • 将字节流转换成字符流 • 例: • New BufferedReader(new inputStreamReader(System.in))) • OutputStreamReader类 • 将写入的字符编码转换成字节码写入字节流 • New BufferedWriter(new inputStreamWriter(System.out)))
总结 • 1、了解什么是流 • 2、InputStream类和OutputStream类 • 3、FileInputSteam/FileOutputStream类 • 4、Reader与Writer类 • 5、File类