Tuesday, August 18, 2015

JAVA I/O 8.18



==================2015/8/18==========================
压缩
         压缩类属于InputStreamOutputStream继承层次结构的一部分。因为压缩类库是按字节方式而不是字符方式处理的。
压缩类
功能
DeflaterOutputStream
压缩类的基类
ZipOutputStream
(一个DeflaterOutputStream)用于将数据压缩成Zip文件格式
GZIPOutputStream
(一个DeflaterOutputStream)用于将数据压缩成GZip文件格式
InflaterInputStream
解压缩类的基类
ZipInputStream
(一个InflaterInputStream)用于解压缩Zip文件格式的数据
GZIPInputStream
(一个InflaterInputStream)用于解压缩GZip文件格式的数据
CheckedInputStream
GetCheckSum()为任何InputStream产生校验和(不仅是解压缩)
CheckedOutputStream
GetCheckSum()为任何OutputStream产生校验和(不仅是压缩)

1.对单个数据流(而不是一系列互异数据)进行压缩,GZIP是比较合适的选择。它的使用非常直观——直接将输出流封装成GZIPOutputStreamZipOutputStream,并将输入流封装成GZIPInputStreamZipInputStream即可。
BufferedReader in = new BufferedReader(new FileReader(args[0]));
BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("test.gz")));
System.out.println("Writing file");
int c;
while ((c = in.read()) != -1) {
    out.write(c);
}
in.close();
out.close();

WinZip校验功能,该功能主要是用于直接将某个ZIP压缩包解压、释放到用户指定的临时文件夹中,然后再自动在Windows9X的开始菜单中为这些释放后的文件建立对应的快捷方式,这样用户就可以方便的对压缩包中的文件进行安装、运行、调试了。

2.Checksum有两个类型:Adler32(快一些) CRC32(慢一些,当更准确)。
3.对于每一个要加入压缩档案的文件,都必须调用putNextEntry(),并将其传递给一个ZipEntry对象。ZipEntry对象包含了一个功能很广泛的接口,允许你获取和设置Zip文件内该特定项上所有可利用的数据:名字、压缩的和未压缩的文件大小、日期、CRC校验和、额外字段数据、注释、压缩方法以及它是否是一个目录入口等等。
4.解压缩文件有两个方法,a. ZipInputStream提供了一个getNextEntry()方法返回下一个ZipEntry; b.利用ZipFile对象读取文件,该对象有一个entries()方法用来向ZipEntries返回一个Enumeration(枚举)

5.Java档案文件
         Zip格式也被应用于JARJava Archive, Java档案文件)文件格式中。JAR文件在涉及因特网应用的时候非常有用。
         如果不采用JAR文件,Web浏览器在下载构成一个应用的所有文件时必须重复多次请求Web服务器;而且所有这些文件都是未经压缩的。如果将所有这些文件合并到一个JAR文件中,只需向远程服务器发出一次请求即可。同时,由于采用了压缩技术,可以使传输时间更短。另外,处于安全的考虑,JAR文件中的每个条目都可以加上数字化签名。
         SunJDK自带的jar程序可根据我们的选择自动压缩文件。可以用命令行的形式调用它,如下:
jar [options] destination [manifest] inputfile(s)
         其中,options只是一个字母集合,不必输入“-”或其它标识符。











Option
Description
c
Creates a new jar file.
t
Updates an existing jar file.
x
Extracts files from an existing jar file.
t
Lists the contents of a jar file
f
Indicates that the jar file is specified as an argument. You almost always want to use this option.
v
Verbose output. This option tells the jar command to display extra information while it works.
O
Doesn’t compress files when it adds them to the archive. This option isn’t used much.
m
Specifies that a manifest file is provided. It’s listed as the next argument following the jar file.
M
Specifies that a manifest file should not be added to the archive. This option is rarely used.

使用示例如:
创建一个名为myJarFile.jarJAR文件,该文件包含当前目录中的所有类文件,以及自动产生的清单文件:
jar cf myJarFile.jar *.class
添加一个名为myManifestFile.mf的用户自建清单文件:
jar cf myJarFile.jar myManifestFile.mf *.class
产生myJarFile.jar内所有文件的一个目录表:
jar tf myJarFile.jar

Friday, August 14, 2015

Java I/O system 8.14



1.ByteBuffer通过一个被“包装”过的8字节数组产生,然后通过各种不同的基本类型的视图缓冲器显示了出来。当从不同类型的缓冲器读取时,数据显示的方式也不同。

ByteBuffer bb = ByteBuffer.wrap(new byte[]{0,0,0,0,0,0,0,'a'});
bb.rewind();
printnb("Byte Buffer");
while (bb.hasRemaining()) {
    printnb(bb.position()+" -> "+bb.get()+". ");
}

CharBuffer cb = ((ByteBuffer)bb.rewind()).asCharBuffer();
printnb("Char Buffer");
while (cb.hasRemaining()) {
    printnb(cb.position()+" -> "+cb.get()+", ");
}

IntBuffer ib = ((ByteBuffer)bb.rewind()).asIntBuffer();
printnb("Int Buffer");
while (ib.hasRemaining()) {
    printnb(ib.position()+" -> "+ib.get()+", ");
}

下图是将同一字节序列翻译成shortintfloatlongdouble


2.字符存放次序
不同的机器可能会使用不同的字节排序方法来存储数据。“big endian(高位优先)将最重要的字节存放在地址最低的存储器单元。而“little endian”(低位优先)则是将最重要的字节放在地址最高的存储器单元。当存储量大于一个字节时,像intfloat等,就要考虑字节的顺序问题了。

3.用缓冲器操纵数据:
如果想把一个字节数组写到文件中去,那么就应该使用ByteBuffer.wrap()方法把字节数组包装起来,然后用getChannel()方法在FileOutputStream上打开一个通道,接着将来自于ByteBuffer的数据写到FileChannel中。
ByteBuffer是将数据移进移出通道的唯一方式

     4.       内存映射文件
内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件。有了内存映射文件,我们就可以嘉定整个文件都放在内存中,而且可以完全把它当做非常大的数组来访问。这种方法极大地简化了用于修改文件的代码。
用这种方式,很大的文件(可达2GB)也可以很容易地修改。注意底层操作系统的文件映射工具是用来最大化地提高性能。