Java把文件打成包tar包!网上试了好几种方法,都不支持中文,求解啊!

彼岸停歇 2011-10-17 11:04:44
两种方法打包完事之后Linux显示均为乱码,windows平台看的同样是乱码,求救啊!!!!!!


第一种方法:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.utils.IOUtils;

/**
* 将多个文件压缩为tar.gz格式
*
*
*/
public class GZIPUtil {

/**
*
* @Title: pack
* @Description: 将一组文件打成tar包
* @param sources
* 要打包的原文件数组
* @param target
* 打包后的文件
* @return File 返回打包后的文件
* @throws
*/
public static File pack(File[] sources, File target) {
FileOutputStream out = null;
try {
out = new FileOutputStream(target);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
TarArchiveOutputStream os = new TarArchiveOutputStream(out);
for (int i = 0; i < sources.length; i++) {
String str = sources[i].toString();
File file = new File(str);
try {
System.out.println("file:" + file);
os.putArchiveEntry(new TarArchiveEntry(file));
FileInputStream temp = new FileInputStream(file);
IOUtils.copy(temp, os);
os.closeArchiveEntry();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}

return target;
}

/**
*
* @Title: compress
* @Description: 将文件用gzip压缩
* @param source
* 需要压缩的文件
* @return File 返回压缩后的文件
* @throws
*/
public static File compress(File source) {
File target = new File(source.getPath() + ".gz");
FileInputStream in = null;
GZIPOutputStream out = null;
try {
in = new FileInputStream(source);
out = new GZIPOutputStream(new FileOutputStream(target));
byte[] array = new byte[1024];
int number = -1;
while ((number = in.read(array, 0, array.length)) != -1) {
out.write(array, 0, number);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
return target;
}

}


第二种方法

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URLEncoder;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;

/**
* TAR工具
*
* @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
* @since 1.0
*/
public abstract class TarUtils {

private static final String BASE_DIR = "";

// 符号"/"用来作为目录标识判断符
private static final String PATH = "/";

private static final int BUFFER = 1024;

private static final String EXT = ".tar";

/**
* 归档
*
* @param srcPath
* @param destPath
* @throws Exception
*/
public static void archive(String srcPath, String destPath) throws Exception {

File srcFile = new File(srcPath);

archive(srcFile, destPath);

}

/**
* 归档
*
* @param srcFile
* 源路径
* @param destPath
* 目标路径
* @throws Exception
*/
public static void archive(File srcFile, File destFile) throws Exception {

TarArchiveOutputStream taos = new TarArchiveOutputStream(new FileOutputStream(destFile));

archive(srcFile, taos, BASE_DIR);

taos.flush();
taos.close();
}

/**
* 归档
*
* @param srcFile
* @throws Exception
*/
public static void archive(File srcFile) throws Exception {
String name = srcFile.getName();
String basePath = srcFile.getParent();
String destPath = basePath + name + EXT;
archive(srcFile, destPath);
}

/**
* 归档文件
*
* @param srcFile
* @param destPath
* @throws Exception
*/
public static void archive(File srcFile, String destPath) throws Exception {
archive(srcFile, new File(destPath));
}

/**
* 归档
*
* @param srcPath
* @throws Exception
*/
public static void archive(String srcPath) throws Exception {
File srcFile = new File(srcPath);

archive(srcFile);
}

/**
* 归档
*
* @param srcFile
* 源路径
* @param taos
* TarArchiveOutputStream
* @param basePath
* 归档包内相对路径
* @throws Exception
*/
private static void archive(File srcFile, TarArchiveOutputStream taos, String basePath) throws Exception {
if (srcFile.isDirectory()) {
archiveDir(srcFile, taos, basePath);
} else {
archiveFile(srcFile, taos, basePath);
}
}

/**
* 目录归档
*
* @param dir
* @param taos
* TarArchiveOutputStream
* @param basePath
* @throws Exception
*/
private static void archiveDir(File dir, TarArchiveOutputStream taos, String basePath) throws Exception {
File[] files = dir.listFiles();

if (files.length < 1) {
System.out.println(basePath + dir.getName() + PATH);
String dirPath = basePath + dir.getName() + PATH;
System.out.println(dirPath);
TarArchiveEntry entry = new TarArchiveEntry(dirPath);

taos.putArchiveEntry(entry);
taos.closeArchiveEntry();
}

for (File file : files) {

// 递归归档
archive(file, taos, basePath + dir.getName() + PATH);

}
}

/**
* 数据归档
*
* @param data
* 待归档数据
* @param path
* 归档数据的当前路径
* @param name
* 归档文件名
* @param taos
* TarArchiveOutputStream
* @throws Exception
*/
private static void archiveFile(File file, TarArchiveOutputStream taos, String dir) throws Exception {

/**
* 归档内文件名定义
*
* <pre>
*
* 如果有多级目录,那么这里就需要给出包含目录的文件名
* 如果用WinRAR打开归档包,中文名将显示为乱码
* </pre>
*/
TarArchiveEntry entry = new TarArchiveEntry(dir + file.getName());

entry.setSize(file.length());

taos.putArchiveEntry(entry);

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
taos.write(data, 0, count);
}

bis.close();

taos.closeArchiveEntry();
}

/**
* 解归档
*
* @param srcFile
* @throws Exception
*/
public static void dearchive(File srcFile) throws Exception {
String basePath = srcFile.getParent();
dearchive(srcFile, basePath);
}

/**
* 解归档
*
* @param srcFile
* @param destFile
* @throws Exception
*/
public static void dearchive(File srcFile, File destFile) throws Exception {

TarArchiveInputStream tais = new TarArchiveInputStream(new FileInputStream(srcFile));
dearchive(destFile, tais);

tais.close();

}

/**
* 解归档
*
* @param srcFile
* @param destPath
* @throws Exception
*/
public static void dearchive(File srcFile, String destPath) throws Exception {
dearchive(srcFile, new File(destPath));

}

/**
* 文件 解归档
*
* @param destFile
* 目标文件
* @param tais
* ZipInputStream
* @throws Exception
*/
private static void dearchive(File destFile, TarArchiveInputStream tais) throws Exception {

TarArchiveEntry entry = null;
while ((entry = tais.getNextTarEntry()) != null) {

// 文件
String dir = destFile.getPath() + File.separator + entry.getName();

File dirFile = new File(dir);

// 文件检查
fileProber(dirFile);

if (entry.isDirectory()) {
dirFile.mkdirs();
} else {
dearchiveFile(dirFile, tais);
}

}
}

/**
* 文件 解归档
*
* @param srcPath
* 源文件路径
*
* @throws Exception
*/
public static void dearchive(String srcPath) throws Exception {
File srcFile = new File(srcPath);

dearchive(srcFile);
}

/**
* 文件 解归档
*
* @param srcPath
* 源文件路径
* @param destPath
* 目标文件路径
* @throws Exception
*/
public static void dearchive(String srcPath, String destPath) throws Exception {

File srcFile = new File(srcPath);
dearchive(srcFile, destPath);
}

/**
* 文件解归档
*
* @param destFile
* 目标文件
* @param tais
* TarArchiveInputStream
* @throws Exception
*/
private static void dearchiveFile(File destFile, TarArchiveInputStream tais) throws Exception {

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

int count;
byte data[] = new byte[BUFFER];
while ((count = tais.read(data, 0, BUFFER)) != -1) {
bos.write(data, 0, count);
}

bos.close();
}

/**
* 文件探针
*
* <pre>
*
* 当父目录不存在时,创建目录!
* </pre>
*
* @param dirFile
*/
private static void fileProber(File dirFile) {

File parentFile = dirFile.getParentFile();
if (!parentFile.exists()) {

// 递归寻找上级目录
fileProber(parentFile);

parentFile.mkdir();
}

}

}

...全文
939 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gezhonglei2007 2012-08-04
  • 打赏
  • 举报
回复
我用的就是apache的ant的TarInputStream、TarOutputStream,也遇到文件名、目录名的中文的问题
gezhonglei2007 2012-08-04
  • 打赏
  • 举报
回复
遇到了同样的问题了。。。
小绵羊 2011-10-17
  • 打赏
  • 举报
回复
java里的zip不支持中文,用apache的ant里面有个zip类支持中文的
彼岸停歇 2011-10-17
  • 打赏
  • 举报
回复
有没有人遇到过同样问题啊!大家帮个忙啊!

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧