230 likes | 645 Views
Java 流(下). GZip 格式文件的压缩 / 解压(了解) Jar 格式文件的压缩 / 解压(了解) NIO 概述 Buffer 的用法 Channel Charset 文件锁. 在 java 中对文件进行 gzip 格式压缩(示例 10-10 ). 和 gzip 格式压缩相关的类: java.util.zip.GZIPOutputStream. 在 java 中对 gzip 文件解压缩(示例 10-11 ). 和解压 gzip 格式文件相关的类 Java.util.zip.GZIPInputStream.
E N D
Java流(下) • GZip格式文件的压缩/解压(了解) • Jar格式文件的压缩/解压(了解) • NIO概述 • Buffer的用法 • Channel • Charset • 文件锁
在java中对文件进行gzip格式压缩(示例10-10) • 和gzip格式压缩相关的类: • java.util.zip.GZIPOutputStream
在java中对gzip文件解压缩(示例10-11) • 和解压gzip格式文件相关的类 • Java.util.zip.GZIPInputStream
在java中对文件进行jar格式的压缩/解压缩 • 和jar压缩相关的类 • java.util.jar.JarOutputStream • java.util.jar.JarEntry • java.util.jar.Attributes/java.util.jar.Attributes.Name • 和jar解压相关的类 • java.util.jar.JarInputStream • java.util.jar.JarEntry • java.util.jar.JarFile • java.util.jar.Attribute/java.util.jar.Attribute.Name
NIO • 和“流”中对数据处理方式不同,在NIO中通过“块”读取方式来处理数据 • 通过NIO,可以让 Java 程序员实现高速 I/O 而无需编写自定义的本机代码
用BufferedReader 读文本文件 3-1 • 引入相关的类 • import java.io.FileReader; • import java.io.BufferedReader; • import java.io.IOException; • 构造一个BufferedReader对象 • FileReader fr=new FileReader("mytest.txt"); • BufferedReader br=new BufferedReader(fr);
用BufferedReader 读文本文件 3-2 • 利用BufferedReader的方法读取文本文件的数据 br.readLine(); //读取一行数据,返回字符串 • 关闭相关的流对象 br.close(); fr.close();;
用BufferedReader 读文本文件 3-3 /**创建一个FileReader对象.*/ FileReader fr=new FileReader("mytest.txt"); /**创建一个BufferedReader 对象.*/ BufferedReader br=new BufferedReader(fr); /**读取一行数据.*/ String line=br.readLine(); while(line!=null){ System.out.println(line); line=br.readLine(); } /**流的关闭.*/ br.close(); fr.close(); 创建一个 FileReader对象 创建一个 BufferedReader对象 演示:示例 4
用BufferedWriter 写文本文件 3-1 • 引入相关的类 • import java.io.FileWriter ; • import java.io.BufferedWriter ; • import java.io.IOException; • 构造一个BufferedWriter对象 FileWriter fw=new FileWriter("mytest.txt"); BufferedWriter bw=new BufferedWriter(fw);
用BufferedWriter 写文本文件 3-2 • 利用BufferedWriter的方法写文本文件 • bw.write (“hello”); • 相关流对象的清空和关闭 • bw.flush(); • fw.close();
用BufferedWriter 写文本文件 3-3 /**创建一个FileWriter 对象*/ FileWriter fw=new FileWriter("mytest.txt"); /**创建一个BufferedWriter 对象*/ BufferedWriter bw=new BufferedWriter(fw); bw.write("大家好!"); bw.write("我正在学习BufferedWriter。"); bw.newLine(); bw.write("请多多指教!"); bw.newLine(); bw.write("email: study@jb-aptech.com.cn"); bw.flush(); fw.close(); 创建一个 FileWriter对象 创建一个 BufferedWriter对象 演示:示例 5
Buffer类 • Buffer类表示的是一个容器,它可以看成是一个数组 • 有八种常用的缓冲区类: • ByteBuffer • CharBuffer • ShortBuffer • IntBuffer • LongBuffer • FloatBuffer • DoubleBuffer • MappedByteBuffer只是一种特殊的 ByteBuffer。它将文件所在区域直接映射到内存
capacity/position/limit • 在Buffer中,有三个重要的概念:容量(capacity)、界限(limit)和位置(position): • 容量(capacity):缓冲区的 容量(capacity) 表示可以储存在缓冲区中的最大数据容量。缓冲区的容量不可能为负值,在创建后也不能改变; • 界限(limit):第一个不应该被读出或者写入的缓冲区位置索引; • 位置(position):用于指明下一个可以被读出的或者写入的缓冲区位置索引。在从通道读取时,position 变量跟踪已经写了多少数据。更准确地说,它指定了下一个字节将放到数组的哪一个元素中。 • 0 <= position <= limit <= capacity
Buffer中常用方法 • int capacity():返回缓冲区的capacity大小; • Buffer clear():"清空"缓冲区:它将limit设置成和capacity一样,而将position设置成0。注意这个方法并不会将缓冲区中的数据清除掉; • Buffer flip():它将界限(limit)设置成当前的位置值(position),然后将位置值(position)回复到0,并返回重新设定limit和position后的缓冲区; • boolean hasRemaining():判断当前位置(position)和界限(limit)之间是否还有元素可供处理; • int limit():返回缓冲区的界限(limit); • Buffer limit(int newLt):重新设置界限(limit)的值,并返回一个具有新的limit的缓冲区对象;
Buffer常用方法(con.) • Buffer mark():设置缓冲区的书签(mark),它只能在0和位置(position)之间做书签(mark),mark值和前面的limit、position、capacity的值的大小关系是:0 <= mark <= position <= limit <= capacity; • int position():返回缓冲区中的当前位置(position); • Buffer position(int newPs):设置缓冲区的新位置,并返回一个具有新的位置的缓冲区对象; • int remaining():返回当前位置和界限(limit)之间的元素个数; • Buffer reset():将位置回复到使用mark()方法设置的书签处; • Buffer rewind():将位置(position)设置成0,取消设置的书签。
Buffer例子(示例10-12/13) CharBuffer buff = CharBuffer.allocate(9); //1 buff.put('a'); //2 buff.put('b'); //3 buff.put('c'); //4 buff.flip(); //5 System.out.println(buff.get()); //6 buff.clear(); //7
Buffer例子 capacity capacity position position //1 //2 a a a a a a a a a a b a a a a a a a limit limit capacity capacity position position a b c a a a a a a a b c a a a a a a //4 //5 limit limit capacity capacity position position a b c a a a a a a a b c a a a a a a //7 //6 limit limit
Channel (示例10-14) • 可以通过Channel读取或者写入对象 • 和流类似,但Channel是双向的,而流是单向的 • 在JDK1.4中对java.io包中的很多的类都进行了改写,其中的很多类都加入了获得对应的通道的功能,如FileInputStream/FileOutputStream的getChannel()
字符集(示例10-15) • Java中编码采用Unicode方式,而很多操作系统并不使用Unicode,那么在从系统中读取数据,在Java中进行处理的时候,可能会出现乱码等问题 • Java中,通过字符集的编码器和解码器(Character-set encoders and decoders),使得我们可以直接访问操作系统内置的字符集。
Charset • 和字符集相关的包: • java.nio.charset:用于处理字符集的类 • java.nio.charset.spi:用于提供字符集处理的服务的类:CharsetProvider • 通过给Charset的forName()方法传递一个相应字符集的名字,就可以获得一个Charset对象: • Charset cs = Charset.forName("ISO-8859-1"); • Charset cs1 = Charset.forName("GBK");
文件锁 • 现代的操作系统都提供了文件锁定功能 • 可以通过FileChannel的lock()/tryLock()方法来获得文件锁FileLock对象,从而锁定文件 • 记得处理完文件后通过FileLock的release()方法释放文件锁
小结 • java.io包中的内容 • Java基本I/O流 • 字节流/字符流 • 节点流(低级流)/处理流(高级流) • 利用流进行文件的压缩/解压缩 • NIO中常用的类
总结 • File 类用于访问文件系统 • 流是指一连串流动的字符,是以先进先出方式发送信息的通道 • 流可以分为输入输出流,也可以分为字节流和字符流 • 运用FileInputStream和FileOutputStream可以读写文本文件 • 运用BufferedReader和BufferedWriter也可以读写文本文件,且性能较高 • 运用DataInputStream和DataOutputStream可以读写二进制文件