《Java编程思想第四版》笔记---18章(7) I/O 文件锁定,文件压缩
来源:互联网 发布:考试宝典怎么样知乎 编辑:程序博客网 时间:2024/06/08 02:45
文件锁定
在同一个JVM中,共享资源的文件可以通过线程同步来确保访问的安全性,但是在不同的JVM或者Java线程和操作系统本地线程共同竞争一个共享的文件资源时,就必须通过对文件的锁定机制来确保,例子如下:
输出结果:
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压缩和解压缩操作小例子如下:
使用java中压缩相关类时,只需对输入流使用GZIPInputStream或ZipInputStream包装,对输出流使用GZIPOutputStream或ZipOutputStream包装即可,其他的操作和普通的java I.O操作相同。
4.使用zip多文件压缩:
zip格式的压缩文件是最常用的压缩方式,使用zip多文件压缩时,可以将多个文件压缩在一个压缩包中,同时还可以从一个包含多个文件的压缩包中读取所有的压缩文件。使用zip进行多文件压缩时,一般要使用CheckSum类计算校验和,校验和的计算有两种算法:
(1).Adler32:速度比较快。
(2).CRC32:速度比较慢,但是更精确。
使用zip多文件压缩的例子如下:
import java.util.zip.*;
import java.io.*;
import java.util.*;
public class ZipCompress{
public static void main(String[] args)throws Exception{
FileOutputStream f = new FileOutputStream(“test.zip”);
//使用Adler32算法为文件输入流产生输出校验和文件
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
ZipOutputStream zos = new ZipOutputStream(csum);
BufferedOutputStream out = new BufferedOutputStream(zos);
//设置zip文件注释
zos.setComment(“A test of java zipping”);
//向zip压缩文件写入多个文件
for(String arg : args){
System.out.println(“Writing file:” + arg);
BufferedReader in = new BufferedReader(new FileReader(arg));
//写入一个zip文件条目,并将流定位到条目数据的开始处
zos.putNextEntry(new ZipEntry(arg));
int c;
//写入zip文件内容
while((c = in.read()) != -1){
out.write(c);
}
in.close();
out.flush();
}
out.close();
//文件关闭后获取校验和
System.out.println(“Checksum:” + csum.getChecksum().getValue());
FileInputStream fi = new FileInputStream(“test.zip”);
//使用Adler32算法为输入文件流产生输入校验和文件流
CheckedInputStream csumi = new CheckedInputStream(fi, new Adler32());
ZipInputStream in2 = new ZipInputStream(csumi);
BufferedInputStream bis = new BufferedInputStream(in2);
ZipEntry ze;
//读取zip文件条目
While((ze = in2.getNextEntry()) != null){
System.out.println(“Reading file:” + ze);
int x;
//读取zip文件条目内容
while((x = bis.read()) != -1){
System.out.println(x);
}
}
if(args.length == 1){
System.out.println(“Checksum:” + csumi.getChecksum().getValue());
}
bis.close();
//另一种读取zip文件的方法
ZipFile zf = new ZipFile(“test.zip”);
//获取zip文件的条目
Enumeration e = zf.entries();
while(e.hasMoreElements()){
ZipEntry ze2 = (ZipEntry)e.nextElement();
System.out.println(“Reading File:” + ze2);
}
}
}
- 《Java编程思想第四版》笔记---18章(7) I/O 文件锁定,文件压缩
- 《Java编程思想第四版》笔记---18章(1) I/O 流基本概念
- 《Java编程思想第四版》笔记---18章(2) I/O 非流式部分
- 《Java编程思想第四版》笔记---18章(3) I/O 流式部分--字符流字节流
- 《Java编程思想第四版》笔记---18章(4) I/O 流式部分--管道流与对象流
- java编程思想读书笔记 第十八章 java I/O系统(第四篇 新I/O)
- Java I/O 学习笔记(8) 文件压缩
- java I/O系统(8)-文件压缩
- 《Java编程思想》第18章 Java I/O系统
- java编程思想-第18章-java I/O系统
- java编程思想笔记(第四版*第8章)
- 文件编程和I/O笔记
- I/O操作之文件锁定
- 文件I/O编程
- 文件I/O编程
- 文件I/O编程
- 文件I/O编程
- java编程笔记15 文件锁定操作
- jquery datatables api (转)
- jquery datatables api (转)
- 一些JAVA面试知识点
- Java查找算法之二分法查找
- Android学习之shape属性
- 《Java编程思想第四版》笔记---18章(7) I/O 文件锁定,文件压缩
- 数据结构练习题 约瑟夫环—用循环链表实现
- html js 定制进度条 (二)
- 2.4.2节练习
- 《GeekBand》C++设计模式02
- 修改host,上github
- U-Boot Environment Variables
- HDU 1757 矩阵快速幂模版
- Linux分区