《Java编程思想第四版》笔记---18章(7) I/O 文件锁定,文件压缩

来源:互联网 发布:考试宝典怎么样知乎 编辑:程序博客网 时间:2024/06/08 02:45

文件锁定

在同一个JVM中,共享资源的文件可以通过线程同步来确保访问的安全性,但是在不同的JVM或者Java线程和操作系统本地线程共同竞争一个共享的文件资源时,就必须通过对文件的锁定机制来确保,例子如下:

  1. import java.nio.channels.*;
  2. import java.util.concurrent.*;
  3. import java.io.*;
  4. public class FileLocking{
  5. public static void main(String[] args)throws Exception{
  6. FileOutputStream fos = new FileOutputStream(“file.txt”);
  7. //试图对文件通道的文件锁定
  8. FileLock fl = fos.getChannel().tryLock();
  9. //文件锁定成功
  10. if(fl != null){
  11. System.out.println(“Locked File”);
  12. TimeUnit.MILLISECONDS.sleep(100);
  13. //释放文件锁
  14. fl.release();
  15. System.out.println(“Released Lock”);
  16. }
  17. foc.close();
  18. }
  19. }

输出结果:

Locked File

Released Lock

文件通道的tryLock()方法试图获取对此通道的文件给定区域的锁定,是个非阻塞方法,无论是否已成功获得请求区域的锁定,调用总是立即返回。如果由于另一个程序保持这一个重叠锁而无法锁定,则此方法返回null.

文件锁定方法:

(1).FileLock tryLock():

试图获取对此通道文件的独占锁定。

(2).FileLock tryLock(long position, long size, Boolean shared):

视图获取对此通道文件给定区域的锁定。

(3).FileLock lock():

获取此通道的文件的独占锁定。

(4).FileLock lock(long position, long size, Boolean shared):

获取此通道的文件的给定区域锁定。

文件锁定方法是共享锁还是排斥锁取决于底层操作系统,可以使用FileLock.isShared()方法判断使用的是何种类型的文件锁。


文件压缩/解压缩

Java I/O类库中提供了一些关于压缩和加压的类,由于压缩和解压缩算法是针对字节数据进行操作的,因此javaI/O中关于压缩和加压素的类是继承自InputStream和OutputStream字节流体系。

Java压缩和解压的相关类在java.util.zip包下,具体的类如下:

(1).CheckedInputStream:

需要维护所读取数据校验和的输入流,校验和可用于验证输入数据的完整性。

(2).CheckedOutputStream:

需要维护所写入数据校验和的输出流。

(3).Deflater:

使用流行的”ZLIB”压缩程序库为通用压缩提供支持。

(4).Inflater:

使用流行的”ZLIB”压缩程序库为通用解压缩提供支持。

(5).DeflaterInputStream:

为压缩“deflate“格式压缩数据实现输入流过滤器。

(6).DeflaterOutputStream:

为压缩 “deflate“格式压缩数据实现输出流过滤器,它还用作其他类型的压缩过滤器(如GZIPOutputStream)的基础。

(7).InflaterInputStream:

为解压缩”deflate”压缩格式的数据实现输入流过滤器,它还用作其他解压缩过滤器(如GZIPInputStream)的基础。

(8).InfaterOutputStream:

为解压缩“deflate”压缩格式存储数据实现输出流过滤器。

(9).ZipOutputStream:

为以”zip”文件格式写入文件实现输出流过滤器,包括对已压缩和未压缩条目的支持。

(10).ZipInputStream:

为读取以”zip”文件格式的文件实现输入流过滤器,包括对已压缩和未压缩条目的支持。

(11).GZIPOutputStram:

为使用“GZIP“文件格式写入压缩数据实现输出流过滤器。

(12).GZIPInputStram:

为读取“GZIP“文件格式的压缩数据实现输入流过滤器。

Java I/O压缩和解压缩操作小例子如下:

  1. import java.util.zip.*;
  2. import java.io.*;
  3. public class GZIPCompress{
  4. public static void main(String[] args)throws IOException{
  5. BufferedReader in = new BufferedReader(new FileReader(“test.dat”));
  6. BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(
  7. new FileOutputStream(“test.gz”)));
  8. int c;
  9. //写GZIP格式压缩文件
  10. while((c = in.read()) != -1){
  11. out.write(c);
  12. }
  13. in.close();
  14. out.close();
  15. BufferedReader in2 = new BufferedReader(new InputStreamReader(
  16. new GZIPInputStream(new FileInputStream(“test.gz”))));
  17. String s;
  18. //读取GZIP格式压缩文件
  19. while((s = in2.readLine()) != null){
  20. System.out.println(s);
  21. }
  22. in2.close();
  23. }
  24. }

使用java中压缩相关类时,只需对输入流使用GZIPInputStream或ZipInputStream包装,对输出流使用GZIPOutputStream或ZipOutputStream包装即可,其他的操作和普通的java I.O操作相同。

4.使用zip多文件压缩:

zip格式的压缩文件是最常用的压缩方式,使用zip多文件压缩时,可以将多个文件压缩在一个压缩包中,同时还可以从一个包含多个文件的压缩包中读取所有的压缩文件。使用zip进行多文件压缩时,一般要使用CheckSum类计算校验和,校验和的计算有两种算法:

(1).Adler32:速度比较快。

(2).CRC32:速度比较慢,但是更精确。

使用zip多文件压缩的例子如下:

  1. import java.util.zip.*;
  2. import java.io.*;
  3. import java.util.*;
  4. public class ZipCompress{
  5. public static void main(String[] args)throws Exception{
  6. FileOutputStream f = new FileOutputStream(“test.zip”);
  7. //使用Adler32算法为文件输入流产生输出校验和文件
  8. CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
  9. ZipOutputStream zos = new ZipOutputStream(csum);
  10. BufferedOutputStream out = new BufferedOutputStream(zos);
  11. //设置zip文件注释
  12. zos.setComment(“A test of java zipping”);
  13. //向zip压缩文件写入多个文件
  14. for(String arg : args){
  15. System.out.println(“Writing file:” + arg);
  16. BufferedReader in = new BufferedReader(new FileReader(arg));
  17. //写入一个zip文件条目,并将流定位到条目数据的开始处
  18. zos.putNextEntry(new ZipEntry(arg));
  19. int c;
  20. //写入zip文件内容
  21. while((c = in.read()) != -1){
  22. out.write(c);
  23. }
  24. in.close();
  25. out.flush();
  26. }
  27. out.close();
  28. //文件关闭后获取校验和
  29. System.out.println(“Checksum:” + csum.getChecksum().getValue());
  30. FileInputStream fi = new FileInputStream(“test.zip”);
  31. //使用Adler32算法为输入文件流产生输入校验和文件流
  32. CheckedInputStream csumi = new CheckedInputStream(fi, new Adler32());
  33. ZipInputStream in2 = new ZipInputStream(csumi);
  34. BufferedInputStream bis = new BufferedInputStream(in2);
  35. ZipEntry ze;
  36. //读取zip文件条目
  37. While((ze = in2.getNextEntry()) != null){
  38. System.out.println(“Reading file:” + ze);
  39. int x;
  40. //读取zip文件条目内容
  41. while((x = bis.read()) != -1){
  42. System.out.println(x);
  43. }
  44. }
  45. if(args.length == 1){
  46. System.out.println(“Checksum:” + csumi.getChecksum().getValue());
  47. }
  48. bis.close();
  49. //另一种读取zip文件的方法
  50. ZipFile zf = new ZipFile(“test.zip”);
  51. //获取zip文件的条目
  52. Enumeration e = zf.entries();
  53. while(e.hasMoreElements()){
  54. ZipEntry ze2 = (ZipEntry)e.nextElement();
  55. System.out.println(“Reading File:” + ze2);
  56. }
  57. }
  58. }
0 0
原创粉丝点击