1 / 23

Java 流(下)

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.

rafe
Download Presentation

Java 流(下)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java流(下) • GZip格式文件的压缩/解压(了解) • Jar格式文件的压缩/解压(了解) • NIO概述 • Buffer的用法 • Channel • Charset • 文件锁

  2. 在java中对文件进行gzip格式压缩(示例10-10) • 和gzip格式压缩相关的类: • java.util.zip.GZIPOutputStream

  3. 在java中对gzip文件解压缩(示例10-11) • 和解压gzip格式文件相关的类 • Java.util.zip.GZIPInputStream

  4. 在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

  5. NIO • 和“流”中对数据处理方式不同,在NIO中通过“块”读取方式来处理数据 • 通过NIO,可以让 Java 程序员实现高速 I/O 而无需编写自定义的本机代码

  6. 用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);

  7. 用BufferedReader 读文本文件 3-2 • 利用BufferedReader的方法读取文本文件的数据 br.readLine(); //读取一行数据,返回字符串 • 关闭相关的流对象 br.close(); fr.close();;

  8. 用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

  9. 用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);

  10. 用BufferedWriter 写文本文件 3-2 • 利用BufferedWriter的方法写文本文件 • bw.write (“hello”); • 相关流对象的清空和关闭 • bw.flush(); • fw.close();

  11. 用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

  12. Buffer类 • Buffer类表示的是一个容器,它可以看成是一个数组 • 有八种常用的缓冲区类: • ByteBuffer • CharBuffer • ShortBuffer • IntBuffer • LongBuffer • FloatBuffer • DoubleBuffer • MappedByteBuffer只是一种特殊的 ByteBuffer。它将文件所在区域直接映射到内存

  13. capacity/position/limit • 在Buffer中,有三个重要的概念:容量(capacity)、界限(limit)和位置(position): • 容量(capacity):缓冲区的 容量(capacity) 表示可以储存在缓冲区中的最大数据容量。缓冲区的容量不可能为负值,在创建后也不能改变; • 界限(limit):第一个不应该被读出或者写入的缓冲区位置索引; • 位置(position):用于指明下一个可以被读出的或者写入的缓冲区位置索引。在从通道读取时,position 变量跟踪已经写了多少数据。更准确地说,它指定了下一个字节将放到数组的哪一个元素中。 • 0 <= position <= limit <= capacity

  14. 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的缓冲区对象;

  15. 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,取消设置的书签。

  16. 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

  17. 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

  18. Channel (示例10-14) • 可以通过Channel读取或者写入对象 • 和流类似,但Channel是双向的,而流是单向的 • 在JDK1.4中对java.io包中的很多的类都进行了改写,其中的很多类都加入了获得对应的通道的功能,如FileInputStream/FileOutputStream的getChannel()

  19. 字符集(示例10-15) • Java中编码采用Unicode方式,而很多操作系统并不使用Unicode,那么在从系统中读取数据,在Java中进行处理的时候,可能会出现乱码等问题 • Java中,通过字符集的编码器和解码器(Character-set encoders and decoders),使得我们可以直接访问操作系统内置的字符集。

  20. Charset • 和字符集相关的包: • java.nio.charset:用于处理字符集的类 • java.nio.charset.spi:用于提供字符集处理的服务的类:CharsetProvider • 通过给Charset的forName()方法传递一个相应字符集的名字,就可以获得一个Charset对象: • Charset cs = Charset.forName("ISO-8859-1"); • Charset cs1 = Charset.forName("GBK");

  21. 文件锁 • 现代的操作系统都提供了文件锁定功能 • 可以通过FileChannel的lock()/tryLock()方法来获得文件锁FileLock对象,从而锁定文件 • 记得处理完文件后通过FileLock的release()方法释放文件锁

  22. 小结 • java.io包中的内容 • Java基本I/O流 • 字节流/字符流 • 节点流(低级流)/处理流(高级流) • 利用流进行文件的压缩/解压缩 • NIO中常用的类

  23. 总结 • File 类用于访问文件系统 • 流是指一连串流动的字符,是以先进先出方式发送信息的通道 • 流可以分为输入输出流,也可以分为字节流和字符流 • 运用FileInputStream和FileOutputStream可以读写文本文件 • 运用BufferedReader和BufferedWriter也可以读写文本文件,且性能较高 • 运用DataInputStream和DataOutputStream可以读写二进制文件

More Related