java I/O解析 及java.util.zip压缩

1.Java I/O框架采用装饰器模式,可按照读写方式分为字节流和字符流,二者根据数据源的不同都封装了不同的类(ByteArray、String、File、Pipe等),FilterInputStream、FilterOutputStream是用来提供装饰器类接口以控制特定输入流和输出流的两个类。字节流和字符流之间可以通过InputStreamReader和OutPutStreamWriter相互转换。

2.常用案例

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

/*
 * 以字符形式缓冲输入一个文件
 */
public class BufferedInputFile {
	static int count = 0;

	//缓冲读取一个指定文件
	public static String read(String fileName){
		StringBuffer sb = new StringBuffer();
		try {
			BufferedReader in = new BufferedReader(new FileReader(new File(fileName)));
			String s;
			while((s = in.readLine()) != null){
				count  = count + 1;
				sb.append(s + "\n");
			}
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		System.out.print(read("E:/J2EE/新建文件夹/1.txt"));
		System.out.println("" + count);
	}
}
import java.io.IOException;
import java.io.StringReader;

public class MemoryInput {

	public static void main(String[] args) {
		StringReader in = new StringReader(BufferedInputFile.read("E:/J2EE/新建文件夹/2.txt"));
		int c;
		try {
			while((c = in.read() ) != -1){
				System.out.println((char)c);
			}
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.EOFException;

public class FormattedMemoryInput {

	public static void main(String[] args) {
		DataInputStream in = new DataInputStream(new ByteArrayInputStream(BufferedInputFile.read("E:/J2EE/新建文件夹/2.txt").getBytes()));
		try{
			while(true){
				System.out.println((char)in.readByte());
			}
		}catch(EOFException e){
			System.out.println("流结束");
			e.printStackTrace();
		}catch(Exception e){
			e.printStackTrace();
		}

	}

}
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;

/*
 *输出内容到文件中
 */
public class BasicFileOutput {
	public static void main(String[] args) throws IOException {
		BufferedReader in  = new BufferedReader(
				new StringReader(
						BufferedInputFile.read("E:/J2EE/新建文件夹/2.txt")));

		FileWriter out = new FileWriter("E:/J2EE/新建文件夹/2_copy.txt");
		String s;
		while((s = in.readLine()) != null){
			out.write(s + "\r\n");			//在每行结尾添加一个回车换行
		}
		in.close();
		out.close();
	}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
 *使用DataInputStream写入数据
 *使用DataOutputStream恢复数据
 */
public class StoreAndRecoverData {

	public static void main(String[] args) throws IOException {
		DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("E:/J2EE/新建文件夹/3.txt")));
		out.writeChars("cc");				//将字符串按字符顺序写入
		out.writeUTF("以UTF形式写入");			//使用utf-8编码写入
		out.writeDouble(3.141659);
		out.writeBoolean(true);
		out.writeInt(1212);
		out.close();

		DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("E:/J2EE/新建文件夹/3.txt")));
		System.out.println(in.readChar());
		in.skipBytes(2);
		System.out.println(in.readUTF());
		System.out.println(in.readBoolean());
		System.out.println(in.readInt());
	}

}

3.压缩

java.util.zip包中封装了读写压缩格式数据的类,他们大都从java.io包中的相关类继承而来

CheckSum:表示数据校验和的接口,这个包提供了两种校验类型:Adler32、CRC32

CheckedOutputStream(OutputStream out, Checksum cksum) 可以创建一个使用制定校验和的OutputStream

CheckedInputStream(InputStream in, Checksum cksum)
可以创建一个使用制定校验和的InputStream

压缩类:ZipOutputStream : 将数据压缩成zip格式  GZipOutputStream 将数据压缩成gzip格式

解压缩类:ZipInputStram:用于解压缩Zip格式的数据   GZIPInputStram:解压缩GZIP文件格式的数据

例1:使用gzip进行简单压缩

/*
 *使用GZIP进行简单压缩
 */
public class GZIPcompress {

	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new FileReader("E:/J2EE/新建文件夹/2.txt"));

		BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("E:/J2EE/新建文件夹/2.gz")));

		int c;
		while((c = in.read()) != -1)
			out.write(c);
		in.close();
		out.close();

		//GZIPInputStream是字节流,要想使用readLine必须通过InputStreamReader转换
		BufferedReader gin = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream("E:/J2EE/新建文件夹/2.gz"))));
		String s;
		while((s = gin.readLine() ) != null){
			System.out.println(s);
		}
	}

}

例2:

/*
 *使用Zip进行多文件压缩
 */
public class ZipCompress {

	public static void main(String[] args) throws IOException {
		FileOutputStream fos = new FileOutputStream("E:/J2EE/新建文件夹/1_2_3.zip");
		CheckedOutputStream cos = new CheckedOutputStream(fos, new Adler32());
		ZipOutputStream zos = new ZipOutputStream(cos);
		BufferedOutputStream out = new BufferedOutputStream(zos);

		zos.setComment("1.txt 2.txt 3.txt的压缩文件");
		String [] fileNames = {"E:/J2EE/新建文件夹/1.txt", "E:/J2EE/新建文件夹/2.txt", "E:/J2EE/新建文件夹/3.txt"};
		for(String name : fileNames){
			BufferedReader in = new BufferedReader(new FileReader(name));

			zos.putNextEntry(new ZipEntry(name));

			int c;
			while((c = in.read()) != -1){
				out.write(c);
			}
			in.close();
			out.flush(); 			//每次循环都应当清空缓冲区(写一次文件),否则会导致所有内容都写到最后一个文件内
		}
		out.close();
	}

}
时间: 2024-10-13 20:36:54

java I/O解析 及java.util.zip压缩的相关文章

java.util.zip压缩打包文件总结二: ZIP解压技术

一.简述 解压技术和压缩技术正好相反,解压技术要用到的类:由ZipInputStream通过read方法对数据解压,同时需要通过CheckedInputStream设置冗余校验码,如: CheckedInputStream cis = new CheckedInputStream(new FileInputStream( srcFile), new CRC32()); ZipInputStream zis = new ZipInputStream(cis); 需要注意的是,在构建解压文件时,需要

Java.util.zip 压缩与解压缩工具类

Java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类. 还包括使用 DEFLATE 压缩算法(用于 ZIP 和 GZIP 文件格式)对数据进行压缩和解压缩的类. 依赖 Jdk 编写该工具类,不依赖任何第三方 jar,随用随取,实现功能大体如下: 1.目录级别递归压缩与解压缩 zip: 2.单文件压缩和解压缩 zip : import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipIn

java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹

一.简述 zip用于压缩和解压文件.使用到的类有:ZipEntry  ZipOutputStream 二.具体实现代码 package com.joyplus.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.

Java ZIP压缩文件使用总结

做Java Web开发,有时候遇到将多个文件或者文件夹压缩成一个.zip文件,供前端下载.Java的JDK中提供一个java.util.zip的接口,供大家使用.如下图: 图上就是Java 的JDK提供的接口,但是压缩文件或者文件夹的时候,怎么使用上面的接口呢?下面我给出几个相关的接口,这些接口是下面压缩文件或者文件夹过程中使用到的. java.util.zip.ZipEntry; java.util.zip.ZipOutputStream; 下面的压缩过程主要是通过这两个接口压缩文件或者文件夹

java集合框架之java HashMap代码解析

 java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/article/java-hashmap-java-collection.html 签名(signature) public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Se

java.util.zip.ZipException: error in opening zip file

今天项目升级,出现了很奇葩的问题.在本地和测试环境测试好好的,将项目打包成war(每次都这样打包)然后上传到阿里云服务器,启动tomcat一直报如下错误: java.util.zip.ZipException: error in opening zip file at java.util.zip.ZipFile.open(Native Method) at java.util.zip.ZipFile.<init>(ZipFile.java:220) at java.util.zip.ZipFi

java.util.zip.ZipOutputStream压缩无乱码(原创)

package io; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.zip.Adler32; import java.u

启动TOMCAT报错 java.util.zip.ZipException: invalid LOC header (bad signature)

报错信息大致如下所示: at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303) at org.apache.catalina.startup.Bootstrap.main(Bootstr

[java ] java.util.zip.ZipException: error in opening zip file

严重: Failed to processes JAR found at URL [jar:file:/D:/tools/apache-tomcat-7.0.64_2/webapps/bbs/WEB-INF/lib/org.restlet.ext.servlet-2.3.0.jar!/] for static resources to be included in context with name [jar:file:/D:/tools/apache-tomcat-7.0.64_2/webap