xStream中的FileConverter,默认实现是把File文件的路径存入xml中,现在重新定义FileConverter,实现把File以十六进制字节码存入xml中。
定义自定义MyFileConverter
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Random; import com.thoughtworks.xstream.converters.extended.FileConverter; public class MyFileConverter extends FileConverter { private String bytesToHexString(byte[] bArray) { StringBuffer sb = new StringBuffer(bArray.length); String sTemp; for (int i = 0; i < bArray.length; i++) { sTemp = Integer.toHexString(0xFF & bArray[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } @Override public boolean canConvert(Class clazz) { return clazz.equals(File.class); } @Override public Object fromString(String text) { String fileName = text.substring(text.indexOf('|') + 1, text.length()); Random rm = new Random(); long rmNum = rm.nextLong(); File file = new File(rmNum + fileName); FileOutputStream fos = null; try { fos = new FileOutputStream(file); text = text.substring(0, text.indexOf('|')); fos.write(hexStringToByte(text)); } catch (NumberFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); return file; } catch (IOException e) { e.printStackTrace(); } } return null; } private byte[] getBytesFromFile(File file) throws IOException { InputStream is = new FileInputStream(file); long length = file.length(); if (length > Integer.MAX_VALUE) { return null; } byte[] bytes = new byte[(int) length]; int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { offset += numRead; } if (offset < bytes.length) { throw new IOException("Could not completely read file " + file.getName()); } is.close(); return bytes; } /** * 把16进制字符串转换成字节数组 * * @param hex * @return */ private byte[] hexStringToByte(String hex) { int len = (hex.length() / 2); byte[] result = new byte[len]; char[] achar = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1])); } return result; } private byte toByte(char c) { byte b = (byte) "0123456789ABCDEF".indexOf(c); return b; } public String toString(Object obj) { File file = (File) obj; try { return bytesToHexString(getBytesFromFile(file)) + "|" + file.getName(); } catch (IOException e) { e.printStackTrace(); } return ((File) obj).getPath(); } }
测试实体类:
import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class Entity implements Serializable{ private int id; private String name; private File image; public int getId() { return id; } public void setId(int id) { this.id = id; } public File getImage() { return image; } public void setImage(File image) { this.image = image; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString(){ return "id:"+id+",name:"+name+",image:"+image.getAbsolutePath(); } }
主函数:
public static void main(String[] args) throws IOException { Entity enty = new Entity(); enty.setId(1); enty.setName("helloWord"); enty.setImage(new File ("1.jpg")); XStream xs = new XStream(); try { FileOutputStream fs = new FileOutputStream( "test.xml"); xs.registerConverter(new MyFileConverter()); xs.toXML(enty,fs); } catch (FileNotFoundException e1) { e1.printStackTrace(); } Object obj = xs.fromXML(new File("test.xml")); System.out.println(obj); }