各位好!!我又来了!!今天遇见了一个小问题!!
IO流里的对象读取总是出错!各种报错!!神烦啊!!百思不得其解啊!然后就上网百度!找了好久终于让我找到了!下面就让我来说一说!
当你用IO流里的对象流写入的时候,ObjectOutputStream会在文件中的开头和结尾进行一个标识AC/DC,ObjectInputStream会严格的根据开头和结尾来进行读取,当读取不到的时候就会进行报错!!
ObjectOutputStream无法将上一次的对象的结尾的DC消除,所以千万不要用FileOutPutStream(“文件地址”,true)来添加;
当想要向文件中再次添加对象的时候,必须先进行读取文件中的对象并添加在集合中完毕后并关闭资源,然后遍历集合进行添加对象完毕并关闭资源!-----》先读取后添加!
代码中的注意点有一点是橘色的,这个很重要!当进行close的时候结尾(DC)也会随之而添加上!
我这个人比较倾向于实战!可以直接将我的代码复制到各位的eclipse中或其他的什么!代码中有详细的解释和一些被我注释掉的代码!那些也是正确可以运行的!各位也可以进行比较一下哪种方法好!
如果有错误的话,请指正!!!
1 import java.io.EOFException; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.ObjectInputStream; 7 import java.io.ObjectOutputStream; 8 import java.io.Serializable; 9 import java.util.ArrayList; 10 //想要序列化对象必须接口Serializable,否则不能被序列化 11 class Car implements Serializable{ 12 13 /** 14 * 给对象添加一个唯一的ID,便于以后增删成员变量! 15 */ 16 private static final long serialVersionUID = 1L; 17 String brand; 18 transient String owner;//添加transient 防止此成员变量被泄露! 19 public Car(String brand,String owner){ 20 this.brand = brand; 21 this.owner = owner; 22 } 23 24 } 25 26 public class ObjectOutAndIn { 27 28 /** 29 * @param args 30 */ 31 public static void main(String[] args) { 32 // TODO Auto-generated method stub 33 /** 34 * ********写入方法********** 35 */ 36 /*(1)*///writerIn(); 37 /** 38 * ********读取方法********** 39 */ 40 /*(2)*///readerOut(); 41 /** 42 * ****读取/写入多个对象的方法**** 43 * 建议将步骤一和二注释掉! 44 */ 45 /*(3)*/writerInAndreaderOut(); 46 } 47 48 public static void writerInAndreaderOut(){ 49 /** 50 * 当想写入多个对象时,有两种方法! 51 * 方法一:(1)创建一个集合将对象添加进该集合,然后将集合的对象写入文件中; 52 * (2)等到用的时候直接读取集合对象,从集合中获取对象 53 * 方法二:(1)创建一个集合将对象添加进该集合,然后遍历集合对象 54 * (2)用同一个对象写入流来写入对象 55 * 对象写入注意:(1)当写入对象的时候,对象写入流会在开头和结尾添加AC/DC 56 * (2)必须用同一个对象写入流写入,因为在对象写入流close的时候会添加DC 57 * ,再次写入另外一些对象的时候DC也不会消失,所以当读取的时候就会出现错误! 58 * (3)以上是我自己的见解,如果出错的话请留言各位!! 59 */ 60 61 //创建一个集合对象 62 ArrayList<Car> arr = new ArrayList<Car>(); 63 arr.add(new Car("兰博基尼", "刘能")); 64 arr.add(new Car("劳斯莱斯", "赵四")); 65 66 /** 67 * 方式一: 68 */ 69 /** 70 * 写入集合对象 71 */ 72 /*try { 73 //创建一个写入通道 74 FileOutputStream out = new FileOutputStream("C:\Users\wang\Desktop\ArrayList.txt"); 75 try { 76 //创建一个对象写入通达! 77 ObjectOutputStream objOut = new ObjectOutputStream(out); 78 //开始写入集合对象 79 objOut.writeObject(arr); 80 //关闭写入资源 81 objOut.close(); 82 } catch (IOException e) { 83 // TODO Auto-generated catch block 84 e.printStackTrace(); 85 } 86 } catch (FileNotFoundException e) { 87 // TODO Auto-generated catch block 88 e.printStackTrace(); 89 }*/ 90 /** 91 * 读取集合对象 92 */ 93 /*try { 94 //创建一个写入通道 95 FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\ArrayList.txt"); 96 try { 97 //创建一个对象读取通达! 98 ObjectInputStream objIn = new ObjectInputStream(in); 99 try { 100 //读取对象,返回的是一个Object类型的对象(需强转) 101 ArrayList<Car> readArray = (ArrayList<Car>)objIn.readObject(); 102 //遍历读取到的readAraay集合! 103 for(Car c:readArray){ 104 System.out.println(c.brand+c.owner); 105 } 106 //关闭读取资源 107 objIn.close(); 108 } catch (ClassNotFoundException e) { 109 // TODO Auto-generated catch block 110 e.printStackTrace(); 111 } 112 } catch (IOException e) { 113 // TODO Auto-generated catch block 114 e.printStackTrace(); 115 } 116 117 } catch (FileNotFoundException e) { 118 // TODO Auto-generated catch block 119 e.printStackTrace(); 120 }*/ 121 122 /** 123 * 方式二: 124 */ 125 /** 126 * 写入集合对象 127 */ 128 /*try { 129 //创建一个写入通道 130 FileOutputStream out = new FileOutputStream("C:\Users\wang\Desktop\ArrayList.txt"); 131 try { 132 //创建一个对象写入通达! 133 ObjectOutputStream objOut = new ObjectOutputStream(out); 134 //利用for循环来写入Car对象! 135 for(Car c:arr){ 136 objOut.writeObject(c); 137 } 138 //关闭写入资源! 139 objOut.close(); 140 } catch (IOException e) { 141 // TODO Auto-generated catch block 142 e.printStackTrace(); 143 } 144 } catch (FileNotFoundException e) { 145 // TODO Auto-generated catch block 146 e.printStackTrace(); 147 }*/ 148 /** 149 * 读取集合对象 150 */ 151 try { 152 //创建一个写入通道 153 FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\ArrayList.txt"); 154 try { 155 //创建一个对象读取通达! 156 ObjectInputStream objIn = new ObjectInputStream(in); 157 try { 158 try { 159 //while循环读取对象并打印! 160 while(true){ 161 Car c = (Car)objIn.readObject(); 162 System.out.println(c.brand+c.owner); 163 } 164 } catch (ClassNotFoundException e) { 165 // TODO Auto-generated catch block 166 e.printStackTrace(); 167 } 168 } catch (EOFException e) { 169 //当while循环完毕后会爆出---》 java.io.EOFException》代表打印完毕! 170 System.out.println("打印完毕!!"); 171 }finally{ 172 //关闭读取资源 173 objIn.close(); 174 } 175 } catch (IOException e) { 176 // TODO Auto-generated catch block 177 e.printStackTrace(); 178 } 179 180 } catch (FileNotFoundException e) { 181 // TODO Auto-generated catch block 182 e.printStackTrace(); 183 } 184 } 185 186 public static void readerOut(){ 187 try { 188 //创建一个写出通道 189 FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\List.txt"); 190 try { 191 //创建一个写出对象的通道! 192 ObjectInputStream objIn = new ObjectInputStream(in); 193 try { 194 //读取对象,返回的是一个Object类型的对象(需强转) 195 Car car = (Car)objIn.readObject(); 196 //打印一下,看是否是步骤一写入的对象!---->由于owner是被transient修饰的所以显示为null 197 System.out.println(car.brand + car.owner); 198 } catch (ClassNotFoundException e) { 199 // TODO Auto-generated catch block 200 e.printStackTrace(); 201 } 202 } catch (IOException e) { 203 // TODO Auto-generated catch block 204 e.printStackTrace(); 205 } 206 } catch (FileNotFoundException e) { 207 // TODO Auto-generated catch block 208 e.printStackTrace(); 209 } 210 } 211 212 public static void writerIn(){ 213 try { 214 //创建一个写入通道! 215 FileOutputStream out = new FileOutputStream("C:\Users\wang\Desktop\List.txt"); 216 try { 217 //创建一个写入对象的通道! 218 ObjectOutputStream objOut = new ObjectOutputStream(out); 219 //创建一个对象 220 Car car = new Car("奔驰", "张三"); 221 //写入对象 222 objOut.writeObject(car); 223 //关闭写入资源 224 objOut.close(); 225 /** 226 * ********在此时写入完成!******** 227 */ 228 } catch (IOException e) { 229 // TODO Auto-generated catch block 230 e.printStackTrace(); 231 } 232 } catch (FileNotFoundException e) { 233 // TODO Auto-generated catch block 234 e.printStackTrace(); 235 } 236 } 237 238 }
在接下来的代码中可以读取/写入---->覆盖原有对象并添加新对象!
1 public static void writerInOrReaderOut(){ 2 3 ArrayList<Car> arr = new ArrayList<Car>(); 4 try { 5 //创建读取的通道 6 FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\ArrayList.txt"); 7 try { 8 //创建对象读取通道! 9 ObjectInputStream objIn = new ObjectInputStream(in); 10 try { 11 try { 12 //开始读取 13 while(true){ 14 try { 15 Car c = (Car) objIn.readObject(); 16 //向集合中添加对象 17 arr.add(c); 18 } catch (ClassNotFoundException e) { 19 // TODO Auto-generated catch block 20 e.printStackTrace(); 21 } 22 23 } 24 } catch (EOFException e) { 25 // TODO Auto-generated catch block 26 System.out.println("添加完了!"); 27 } 28 }finally{ 29 objIn.close(); 30 } 31 32 } catch (IOException e) { 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } 36 } catch (FileNotFoundException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } 40 try { 41 //创建输出通道! 42 FileOutputStream out = new FileOutputStream("C:\Users\wang\Desktop\ArrayList.txt"); 43 try { 44 //创建对象输出通道! 45 ObjectOutputStream objOut = new ObjectOutputStream(out); 46 //for循环遍历 47 for(Car c:arr){ 48 objOut.writeObject(c); 49 } 50 //在这里添加某个对象 51 objOut.writeObject(new Car("兰博基尼", "纷纷")); 52 //关闭资源 53 objOut.close(); 54 } catch (IOException e) { 55 // TODO Auto-generated catch block 56 e.printStackTrace(); 57 } 58 } catch (FileNotFoundException e) { 59 // TODO Auto-generated catch block 60 e.printStackTrace(); 61 } 62 63 try { 64 //创建读取的通道 65 FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\ArrayList.txt"); 66 try { 67 //创建对象读取通道! 68 ObjectInputStream objIn = new ObjectInputStream(in); 69 try { 70 try { 71 //开始读取 72 while(true){ 73 try { 74 //读取对象! 75 Car c = (Car) objIn.readObject(); 76 //打印对象! 77 System.out.println(c.brand+c.owner); 78 } catch (ClassNotFoundException e) { 79 // TODO Auto-generated catch block 80 e.printStackTrace(); 81 } 82 } 83 } catch (EOFException e) { 84 // TODO Auto-generated catch block 85 System.out.println("打印完了!"); 86 } 87 }finally{ 88 //关闭资源! 89 objIn.close(); 90 } 91 92 } catch (IOException e) { 93 // TODO Auto-generated catch block 94 e.printStackTrace(); 95 } 96 } catch (FileNotFoundException e) { 97 // TODO Auto-generated catch block 98 e.printStackTrace(); 99 } 100 101 102 }