package day09;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.Serializable;
public class IOUtils {
// 把byte數(shù)組轉(zhuǎn)成十六進(jìn)制的字符串
public static String hex(byte[] ary){
if(ary==null||ary.length==0){
return "";
}
StringBuilder buf = new StringBuilder();
for(byte b:ary){
int i = b & 0xff;//去除高24位的1
if(i<=0xf){//0xf=15,小于或等于15的數(shù)轉(zhuǎn)為16進(jìn)制只有一位數(shù)
buf.append("0");//如果是一位數(shù)就補(bǔ)一個(gè)0
}
buf.append(Integer.toHexString(i)).append(" ");
}
return buf.toString();
}
//把一個(gè)文件讀取出來(lái)保存到一個(gè)byte[]中
public static byte[] reaAll(String file) throws IOException{
RandomAccessFile raf = new RandomAccessFile(file, "r");
byte[] buf = new byte[(int)raf.length()];
raf.read(buf);
raf.close();
return buf;
}
//以十六進(jìn)制方式讀取一個(gè)文件轉(zhuǎn)換成字符串
public static String readAsHex(String file) throws IOException{
return hex(reaAll(file));
}
//自己管理一個(gè)緩沖區(qū)復(fù)制文件,速度快
public static void cp(String file1,String file2) throws IOException{
InputStream in = new FileInputStream(file1);
OutputStream out = new FileOutputStream(file2);
byte[] buf = new byte[1024*500];
int c;
while((c=in.read(buf))!=-1){
out.write(buf,0,c);
}
in.close();
out.close();
}
//用系統(tǒng)提供的緩沖區(qū)復(fù)制文件,速度比較快
public static void cp1(String file1,String file2) throws IOException{
InputStream in = new BufferedInputStream(new FileInputStream(file1));
OutputStream out = new BufferedOutputStream(new FileOutputStream(file2));
int b;
while((b=in.read())!=-1){
System.out.print(b);
out.write(b);
}
in.close();
out.close();
}
//不使用緩沖區(qū)一個(gè)byte一個(gè)byte的復(fù)制文件,速度最慢
public static void cp2(String file1,String file2) throws IOException{
InputStream in = new FileInputStream(file1);
OutputStream out = new FileOutputStream(file2);
int b;
while((b=in.read())!=-1){
System.out.print(b);
out.write(b);
}
in.close();
out.close();
}
/*把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化。
java.io.ObjectOutputStream代表對(duì)象輸出流,它的writeObject(Object obj)方法
可對(duì)參數(shù)指定的obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫(xiě)到一個(gè)目標(biāo)輸出流中。
*/
public static byte[] serialize(Serializable obj) throws IOException{
ByteArrayOutputStream buf = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(buf);
out.writeObject(obj);
out.close();
return buf.toByteArray();
}
/*把字節(jié)序列恢復(fù)為Java對(duì)象的過(guò)程稱為對(duì)象的反序列化。
* java.io.ObjectInputStream代表對(duì)象輸入流,它的readObject()方法
* 從一個(gè)源輸入流中讀取字節(jié)序列,再把它們反序列化為一個(gè)對(duì)象,并將其返回。
*/
public static Serializable unserialize(byte[] ary) throws IOException, ClassNotFoundException{
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(ary));
Serializable obj = (Serializable)in.readObject();
in.close();
return obj;
}
//深層復(fù)制對(duì)象
public static Serializable deepCopy(Serializable obj){
try {
return unserialize(serialize(obj));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
|