1、在补零的语句中byte数组buf[i]不能直接与整形 0xf比较大小,这样会导致强转让数据出错。
2、在补零的语句中没有判断buf[i]需要大于零
正确的代码如下:
if((buf[i]&0xff)>0 && (buf[i]&0xff)<=0xf){
System.out.print("0");
}
3、使用缓冲字节流复制确实是最快的方式,但对于小文件10M以下的文件体现不出优势,对于百兆文件正确使用,时间可以控制到50ms内。复制文件最快的做法是将批量读取到的字节数组使用缓冲写入到文件,在机器性能范围内字节数组越大越快。在循环写入的过程中不需要使用flush,缓冲输入流在关闭的时候会将所有缓冲区的数据全部写入文件,使用flush刷新缓冲就失去了缓冲的意义。最后关闭IO流和文件流应该在finally中关闭,否则IO异常时执行不到close语句,IO流仍然没有关闭。
经过测试,8M多的文件把flush()放在While循环外面,速度提升很明显。而单字节带缓冲的字节流方法速度比批量带缓冲的字节流方法慢很多。
4、对象序列化就是将Object转换成byte序列,反之叫对象的反序列化。对象必须实现序列化接口(Serializable),才能进行序列化,否则将出现异常。而transient关键字修饰的变量,该元素不会进行JVM默认的序列化,但是可以自己完成这个元素的序列化。
*///序列化
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
s.defaultWriteObject();//把jvm能默认序列化的元素进行序列化操作
s.writeInt(要序列化的元素);//自己完成序列化
}//反序列化
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
this.(要序列化的元素)=s.readInt();
}
5、一个类实现了序列化接口,那么其子类都可以进行序列化,对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,那么其父类的构造函数会被调用,当父类没实现Serializable接口,子类继承父类并实现Serializable接口,子类序列化时,父类的部分是没有被序列化的,那么反序列化的时候就没办法找到父类的部分,这时候怎么办呢,就调用父类构造器初始化父类部分。