文件压缩 ZipOutputStream类
先举一个压缩单个文件的例子吧:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipOutputStreamDemo1{
public static void main(String[] args) throws IOException{
File file = new File( "d:" + File.separator + "hello.txt" );
File zipFile = new File( "d:" + File.separator + "hello.zip" );
InputStream input = new FileInputStream(file);
ZipOutputStream zipOut = new ZipOutputStream( new FileOutputStream(
zipFile));
zipOut.putNextEntry( new ZipEntry(file.getName()));
// 设置注释
zipOut.setComment( "hello" );
int temp = 0 ;
while ((temp = input.read()) != - 1 ){
zipOut.write(temp);
}
input.close();
zipOut.close();
}
} |
【运行结果】
运行结果之前,我创建了一个hello.txt的文件,原本大小56个字节,但是压缩之后产生hello.zip之后,居然变成了175个字节,有点搞不懂。
不过结果肯定是正确的,我只是提出我的一个疑问而已。
上面的这个例子测试的是压缩单个文件,下面的们来看看如何压缩多个文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/** * 一次性压缩多个文件
* */
public class ZipOutputStreamDemo2{
public static void main(String[] args) throws IOException{
// 要被压缩的文件夹
File file = new File( "d:" + File.separator + "temp" );
File zipFile = new File( "d:" + File.separator + "zipFile.zip" );
InputStream input = null ;
ZipOutputStream zipOut = new ZipOutputStream( new FileOutputStream(
zipFile));
zipOut.setComment( "hello" );
if (file.isDirectory()){
File[] files = file.listFiles();
for ( int i = 0 ; i < files.length; ++i){
input = new FileInputStream(files[i]);
zipOut.putNextEntry( new ZipEntry(file.getName()
+ File.separator + files[i].getName()));
int temp = 0 ;
while ((temp = input.read()) != - 1 ){
zipOut.write(temp);
}
input.close();
}
}
zipOut.close();
}
} |
【运行结果】
先看看要被压缩的文件吧:
接下来看看压缩之后的:
大家自然想到,既然能压缩,自然能解压缩,在谈解压缩之前,我们会用到一个ZipFile类,先给一个这个例子吧。java中的每一个压缩文件都是可以使用ZipFile来进行表示的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import java.io.File;
import java.io.IOException;
import java.util.zip.ZipFile;
/** * ZipFile演示
* */
public class ZipFileDemo{
public static void main(String[] args) throws IOException{
File file = new File( "d:" + File.separator + "hello.zip" );
ZipFile zipFile = new ZipFile(file);
System.out.println( "压缩文件的名称为:" + zipFile.getName());
}
} |
【运行结果】:
压缩文件的名称为:d:\hello.zip
现在我们呢是时候来看看如何加压缩文件了,和之前一样,先让我们来解压单个压缩文件(也就是压缩文件中只有一个文件的情况),我们采用前面的例子产生的压缩文件hello.zip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/** * 解压缩文件(压缩文件中只有一个文件的情况)
* */
public class ZipFileDemo2{
public static void main(String[] args) throws IOException{
File file = new File( "d:" + File.separator + "hello.zip" );
File outFile = new File( "d:" + File.separator + "unZipFile.txt" );
ZipFile zipFile = new ZipFile(file);
ZipEntry entry = zipFile.getEntry( "hello.txt" );
InputStream input = zipFile.getInputStream(entry);
OutputStream output = new FileOutputStream(outFile);
int temp = 0 ;
while ((temp = input.read()) != - 1 ){
output.write(temp);
}
input.close();
output.close();
}
} |
【运行结果】:
解压缩之前:
这个压缩文件还是175字节
解压之后产生:
又回到了56字节,表示郁闷。
现在让我们来解压一个压缩文件中包含多个文件的情况吧
ZipInputStream类
当我们需要解压缩多个文件的时候,ZipEntry就无法使用了,如果想操作更加复杂的压缩文件,我们就必须使用ZipInputStream类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
/** * 解压缩一个压缩文件中包含多个文件的情况
* */
public class ZipFileDemo3{
public static void main(String[] args) throws IOException{
File file = new File( "d:" + File.separator + "zipFile.zip" );
File outFile = null ;
ZipFile zipFile = new ZipFile(file);
ZipInputStream zipInput = new ZipInputStream( new FileInputStream(file));
ZipEntry entry = null ;
InputStream input = null ;
OutputStream output = null ;
while ((entry = zipInput.getNextEntry()) != null ){
System.out.println( "解压缩" + entry.getName() + "文件" );
outFile = new File( "d:" + File.separator + entry.getName());
if (!outFile.getParentFile().exists()){
outFile.getParentFile().mkdir();
}
if (!outFile.exists()){
outFile.createNewFile();
}
input = zipFile.getInputStream(entry);
output = new FileOutputStream(outFile);
int temp = 0 ;
while ((temp = input.read()) != - 1 ){
output.write(temp);
}
input.close();
output.close();
}
}
} |
【运行结果】:
被解压的文件:
解压之后再D盘下会出现一个temp文件夹,里面内容:
PushBackInputStream回退流
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PushbackInputStream;
/** * 回退流操作
* */
public class PushBackInputStreamDemo{
public static void main(String[] args) throws IOException{
String str = "hello,rollenholt" ;
PushbackInputStream push = null ;
ByteArrayInputStream bat = null ;
bat = new ByteArrayInputStream(str.getBytes());
push = new PushbackInputStream(bat);
int temp = 0 ;
while ((temp = push.read()) != - 1 ){
if (temp == ',' ){
push.unread(temp);
temp = push.read();
System.out.print( "(回退" + ( char ) temp + ") " );
} else {
System.out.print(( char ) temp);
}
}
}
} |
【运行结果】:
hello(回退,) rollenholt
1
2
3
4
5
6
7
8
|
/** * 取得本地的默认编码
* */
public class CharSetDemo{
public static void main(String[] args){
System.out.println( "系统默认编码为:" + System.getProperty( "file.encoding" ));
}
} |
【运行结果】:
系统默认编码为:GBK
乱码的产生:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/** * 乱码的产生
* */
public class CharSetDemo2{
public static void main(String[] args) throws IOException{
File file = new File( "d:" + File.separator + "hello.txt" );
OutputStream out = new FileOutputStream(file);
byte [] bytes = "你好" .getBytes( "ISO8859-1" );
out.write(bytes);
out.close();
}
} |
【运行结果】:
??
一般情况下产生乱码,都是由于编码不一致的问题。
转自:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html
相关推荐
以下是对Java IO的详细整理: 首先,Java中的`File`类是操作文件和目录的基础,它提供了许多方法来创建、删除、重命名文件以及检查文件属性。在案例1中,通过`new File("D:\\hello.txt")`创建了一个`File`对象,...
Java中IO系统总结[整理].pdf
Java中的IO流是Java平台核心特性之一,它用于在各种数据源之间传输数据,包括文件、设备、网络连接等。IO流分为输入流(Input Stream)和输出流(Output Stream),按照处理的数据类型又可以分为字节流和字符流。本...
JAVA_IO流整理思维导图.
在这个完整的Java IO整理版中,我们将深入探讨一些基本的IO概念和用法,主要包括文件操作、路径分隔符、文件删除、文件夹创建以及列出目录下的所有文件。 首先,创建新文件是Java IO中最基础的操作之一。在案例1中...
在Java中,IO复用允许一个线程同时处理多个连接的读写事件,从而避免了线程频繁地在睡眠和唤醒状态之间切换,提高了系统性能。 传统的并发编程模型通常与线程绑定,每个连接由一个独立的线程处理。虽然这种方法简单...
javaIO流整理.txt
### Java IO流分析、IO整理与IO优化 #### 一、IO流概念解析 Java中的文件操作主要通过**流**的方式进行。所谓流,是指在Java内存中的一组有序数据序列,它允许开发者以一种线性的方式处理数据,无论是从源(如文件...
Java io系统的设计初衷,就是为了实现“文件、控制台、网络设备”这些io设置的通信。例如,对于一个文件,我们...而到了java 1.1,为了与国际化进行接轨,在java io中添加了许多以字符(Unicode)为单位进行操作的类。
这个"j0601IO_chicken_Java-IO_prettyjtt_"标题可能指的是一个关于Java IO的学习资源,其中"chicken"可能是一个比喻,表示初学者或者新手,"prettyjtt"可能是创建或整理这个学习资料的人的昵称。"javax小菜鸡io"描述...
自己整理了一下javaIO流的相关知识点 用xmind软件做了一下
Java IO流思维导图,主要摘录整理的是java.io.*包下的所有IO对象,其中对应备注里包含各个IO对象的构造方法
Java多线程.drawio
在"Java常用代码整理"这个主题中,我们可以探讨多个Java编程中的关键知识点,包括基础语法、面向对象特性、异常处理、集合框架、IO流、多线程、网络编程以及实用工具类等。 1. **基础语法**:Java的基础语法包括...
Java NIO是Java语言中用于高性能I/O操作的API,理解IO模型是学习Java NIO的基础。本文将从同步和异步的概念开始,然后介绍阻塞和非阻塞的区别,接着介绍阻塞IO和非阻塞IO的区别,最后介绍五种IO模型和两种高性能IO...
Java的IO流体系是Java平台的核心特性之一,用于处理数据的输入和输出。这个体系结构设计得相当丰富和灵活,可以适应多种不同的场景。我们主要从两个方面来理解这个体系:对称性质和处理器模式。 首先,IO流的对称...
Java核心面试知识整理包括了对JVM内存区域、垃圾回收机制、GC算法、JVM类加载机制、Java集合框架以及Java IO/NIO等多个方面的深入讲解。以下是对这些知识点的详细介绍: JVM内存区域:JVM内存区域包括了程序计数器...
下面我们将详细探讨Java中28个常用的工具类,主要涉及`IO`相关的开发工具。 1. **java.lang.Math**:这个类提供了许多基础数学函数,如求平方根、最大值、最小值、随机数生成等。 2. **java.util.Arrays**:用于...
Java IO流是Java编程语言中一个非常重要的概念,它提供了数据传输的能力,使得程序能够读取和写入数据到各种输入/输出设备,如硬盘、内存、网络等。本资源包含的是Java-IO流的基础例题、源码及PPT教学文档,适合初学...