您的位置:首页 > 编程语言 > Java开发

Java序列化和反序列化超强工具类(包含tif图片与其他格式互转)

2017-04-24 10:21 639 查看
import java.awt.image.RenderedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import javax.media.jai.InterpolationNearest;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;

import org.apache.log4j.Logger;

import com.sun.media.jai.codec.ByteArraySeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.JPEGEncodeParam;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.TIFFDirectory;

/**
* @author
*
*/
public class IdepUtil {
private static Logger logger = Logger.getLogger(IdepUtil.class);
static final int BUFFER = 2048;
public IdepUtil(){}
public static String serializer(Object ob) throws Exception{//图片序列化
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(ob);
String serStr = byteArrayOutputStream.toString("ISO-8859-1");
serStr = java.net.URLEncoder.encode(serStr, "UTF-8");

objectOutputStream.close();
byteArrayOutputStream.close();
return serStr;
}

public static Object unSerializer(String xml) throws Exception{//反序列化
String redStr = java.net.URLDecoder.decode(xml, "UTF-8");
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(redStr.getBytes("ISO-8859-1"));
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
Object ob = objectInputStream.readObject();
objectInputStream.close();
byteArrayInputStream.close();
return ob;
}

@SuppressWarnings("unchecked")
public static Map<String,String> zipSerializer(String zipPath) throws Exception{//压缩文件序列化
File file = new File(zipPath);
ZipFile zip = new ZipFile(file);
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>)zip.entries();
Map<String,String> map = new HashMap<String,String>();
while(entries.hasMoreElements()){
ZipEntry entry = entries.nextElement();
String entryName = entry.getName();
//将名称统一化
String newStr = entryName.replaceAll("^(0+)", "");
String regEx="[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(newStr);
String finName = m.replaceAll("").trim()+".tif";

InputStream inputStream = zip.getInputStream(entry);

ByteArrayOutputStream out=new ByteArrayOutputStream();
byte[] buffer=new byte[1024*4];
int n=0;
while ( (n=inputStream.read(buffer)) !=-1) {
out.write(buffer,0,n);
}
//	        byte[] b = out.toByteArray();
byte[] b = tifToJpg(out.toByteArray());//可以换tiffToPng这个方法

//			String s = IdepUtil.serializer(b);
String s = byte2hex(b);

map.put(finName, s);
out.close();
inputStream.close();
//			System.out.println(s);
}
return map;
}

/** tif格式压缩转换为jpg格式压缩
* @param zipPath
* @return
* @throws Exception
*/
public static byte[] zipTifToJpg(String zipPath) throws Exception{
File file = new File(zipPath);
ZipFile zip = new ZipFile(file);
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>)zip.entries();
List<byte[]> list = new ArrayList<byte[]>();
while(entries.hasMoreElements()){
ZipEntry entry = entries.nextElement();
String entryName = entry.getName();
System.out.println("entryName===="+entryName);//本地测试时添加,记得删除
InputStream inputStream = zip.getInputStream(entry);

ByteArrayOutputStream out=new ByteArrayOutputStream();
byte[] buffer=new byte[1024*4];
int n=0;
while ( (n=inputStream.read(buffer)) !=-1) {
out.write(buffer,0,n);
}
//	        byte[] b = out.toByteArray();
out.flush();
byte[] b = tiffToPng(out.toByteArray());
list.add(b);
out.close();
inputStream.close();
//			System.out.println(s);
}

return toZip(list);
}
/**
* 打zip包
* @param fileName
* @param FilePath
* @return
* @throws IOException
*/
public static byte[] toZip(List<byte[]> list) throws IOException {
logger.info("开始将tif压缩成zip");
ByteArrayOutputStream out=new ByteArrayOutputStream();
ZipOutputStream zo = new ZipOutputStream(out);
byte[] b = null;
if(list!=null&&list.size()>0){
for(int i=0; i<list.size(); i++){
zo.putNextEntry(new ZipEntry(i+""));
zo.write(list.get(i));
zo.flush();
}
zo.close();
b = out.toByteArray();
}
out.close();
logger.info("结束将tif压缩成zip");
return b;
}
/**
* tiff2png
* @param b
* @return
* @throws IOException
*/
public static byte[] tiffToPng(byte[] imgData) throws Exception {
byte[] rev = null;

int TAG_COMPRESSION = 259;
int TAG_JPEG_INTERCHANGE_FORMAT = 513;
int COMP_JPEG_OLD = 6;

SeekableStream stream = new ByteArraySeekableStream(imgData);
TIFFDirectory tdir = new TIFFDirectory(stream, 0);
int compression = tdir.getField(TAG_COMPRESSION).getAsInt(0);

// Decoder name
String decoder2use = "tiff";
boolean needResize = false;
if (COMP_JPEG_OLD == compression) {
stream.seek(tdir.getField(TAG_JPEG_INTERCHANGE_FORMAT).getAsLong(0));
decoder2use = "jpeg";
needResize = true;
}

// Decode image
ImageDecoder dec = ImageCodec.createImageDecoder(decoder2use, stream, null);
RenderedImage img = dec.decodeAsRenderedImage();

if (needResize) {
ParameterBlock params = new ParameterBlock();
params.addSource(img);
params.add(0.35F); // x scale factor
params.add(0.35F); // y scale factor
params.add(0.0F); // x translate
params.add(0.0F); // y translate
params.add(new InterpolationNearest());
img = JAI.create("scale", params, null);
}

ByteArrayOutputStream fileOut=new ByteArrayOutputStream();
ImageEncoder pngEncoder = ImageCodec.createImageEncoder("png", fileOut, null);
pngEncoder.encode(img);
stream.close();
rev = fileOut.toByteArray();
fileOut.close();
return rev;
}

public static byte[] tifToJpg(byte[] b) throws IOException{
SeekableStream stream = new ByteArraySeekableStream(b);
PlanarImage in = JAI.create("stream", stream);
//	       OutputStream os = null;
//	       os = new FileOutputStream(output);
ByteArrayOutputStream os = new ByteArrayOutputStream();
JPEGEncodeParam param = new JPEGEncodeParam();
byte[] ret = null;
ImageEncoder enc = ImageCodec.createImageEncoder("JPEG", os, param);
try {
enc.encode(in);
os.flush();
ret = os.toByteArray();
os.close();
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
return ret;
}

private static String byte2hex(byte[] b){  // 二进制转字符串
StringBuffer sb = new StringBuffer();
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = Integer.toHexString(b
& 0XFF);
if (stmp.length() == 1){
sb.append("0" + stmp);
}else{
sb.append(stmp);
}
}
return sb.toString();
}

/**
*
* @param bzip
* @param outputDirectory
* @return
* @throws Exception
*/
private static int unzip(byte[] bzip, String outputDirectory) throws Exception {
ByteArrayInputStream s = new ByteArrayInputStream(bzip);
ZipInputStream inputStream = new ZipInputStream(s);
BufferedInputStream Bin=new BufferedInputStream(inputStream);//新加
int i=0;
ZipEntry zipEntry = null;
FileOutputStream outputStream = null;
try {
while ((zipEntry = inputStream.getNextEntry()) != null) {
if (zipEntry.isDirectory()) {
String name = zipEntry.getName();
name = name.substring(0, name.length() - 1);
File file = new File(outputDirectory + File.separator
+ name);
file.mkdir();
} else {
File file = new File(outputDirectory + File.separator
+ i+".jpg");
file.createNewFile();
outputStream = new FileOutputStream(file);
BufferedOutputStream Bout=new BufferedOutputStream(outputStream);
int b;
while ((b = Bin.read()) != -1) {
Bout.write(b);
}
outputStream.flush();
Bout.flush();
Bout.close();
outputStream.close();
}
i++;
}
} catch (IOException ex) {
} finally {
//outputStream.flush();
Bin.close();
inputStream.close();
s.close();
}
return i;
}
/**
* 字符串转二进制
*/
private  byte[] hex2byte(String str) { // 字符串转二进制
if (str == null)  return null;
str = str.trim();
int len = str.length();
if (len == 0 || len % 2 == 1)
return null;
byte[] b = new byte[len / 2];
try {
for (int i = 0; i < str.length(); i += 2) {
b[i / 2] = (byte) Integer.decode("0X" + str.substring(i, i + 2)).intValue();
}
return b;
} catch (Exception e) {
return null;
}
}
/**
* 格式化时间
* @param strDate
* @return
* @throws ParseException
*/
public static java.lang.String format2Date(Date date) throws ParseException {
java.lang.String d = null;
try {
d =new SimpleDateFormat("yyyyMMdd").format(date);
} catch (Exception e) {
try {
d = new SimpleDateFormat("yyyyMM").format(date);
} catch (Exception e1) {
d = new SimpleDateFormat("yyyy").format(date);
}
}
return d;
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: