Java里的IO流里的 ObjectInputStream 的读取\写入!
各位好!!我又来了!!今天遇见了一个小问题!!
IO流里的对象读取总是出错!各种报错!!神烦啊!!百思不得其解啊!然后就上网百度!找了好久终于让我找到了!下面就让我来说一说!
当你用IO流里的对象流写入的时候,ObjectOutputStream会在文件中的开头和结尾进行一个标识AC/DC,ObjectInputStream会严格的根据开头和结尾来进行读取,当读取不到的时候就会进行报错!!
ObjectOutputStream无法将上一次的对象的结尾的DC消除,所以千万不要用FileOutPutStream(“文件地址”,true)来添加;
当想要向文件中再次添加对象的时候,必须先进行读取文件中的对象并添加在集合中完毕后并关闭资源,然后遍历集合进行添加对象完毕并关闭资源!-----》先读取后添加!
代码中的注意点有一点是橘色的,这个很重要!当进行close的时候结尾(DC)也会随之而添加上!
我这个人比较倾向于实战!可以直接将我的代码复制到各位的eclipse中或其他的什么!代码中有详细的解释和一些被我注释掉的代码!那些也是正确可以运行的!各位也可以进行比较一下哪种方法好!
如果有错误的话,请指正!!!
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
//想要序列化对象必须接口Serializable,否则不能被序列化
class Car implements Serializable{ /**
* 给对象添加一个唯一的ID,便于以后增删成员变量!
*/
private static final long serialVersionUID = 1L;
String brand;
transient String owner;//添加transient 防止此成员变量被泄露!
public Car(String brand,String owner){
this.brand = brand;
this.owner = owner;
} } public class ObjectOutAndIn { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* ********写入方法**********
*/
/*(1)*///writerIn();
/**
* ********读取方法**********
*/
/*(2)*///readerOut();
/**
* ****读取/写入多个对象的方法****
* 建议将步骤一和二注释掉!
*/
/*(3)*/writerInAndreaderOut();
} public static void writerInAndreaderOut(){
/**
* 当想写入多个对象时,有两种方法!
* 方法一:(1)创建一个集合将对象添加进该集合,然后将集合的对象写入文件中;
* (2)等到用的时候直接读取集合对象,从集合中获取对象
* 方法二:(1)创建一个集合将对象添加进该集合,然后遍历集合对象
* (2)用同一个对象写入流来写入对象
* 对象写入注意:(1)当写入对象的时候,对象写入流会在开头和结尾添加AC/DC
* (2)必须用同一个对象写入流写入,因为在对象写入流close的时候会添加DC
* ,再次写入另外一些对象的时候DC也不会消失,所以当读取的时候就会出现错误!
* (3)以上是我自己的见解,如果出错的话请留言各位!!
*/ //创建一个集合对象
ArrayList<Car> arr = new ArrayList<Car>();
arr.add(new Car("兰博基尼", "刘能"));
arr.add(new Car("劳斯莱斯", "赵四")); /**
* 方式一:
*/
/**
* 写入集合对象
*/
/*try {
//创建一个写入通道
FileOutputStream out = new FileOutputStream("C:\\Users\\wang\\Desktop\\ArrayList.txt");
try {
//创建一个对象写入通达!
ObjectOutputStream objOut = new ObjectOutputStream(out);
//开始写入集合对象
objOut.writeObject(arr);
//关闭写入资源
objOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
/**
* 读取集合对象
*/
/*try {
//创建一个写入通道
FileInputStream in = new FileInputStream("C:\\Users\\wang\\Desktop\\ArrayList.txt");
try {
//创建一个对象读取通达!
ObjectInputStream objIn = new ObjectInputStream(in);
try {
//读取对象,返回的是一个Object类型的对象(需强转)
ArrayList<Car> readArray = (ArrayList<Car>)objIn.readObject();
//遍历读取到的readAraay集合!
for(Car c:readArray){
System.out.println(c.brand+c.owner);
}
//关闭读取资源
objIn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/ /**
* 方式二:
*/
/**
* 写入集合对象
*/
/*try {
//创建一个写入通道
FileOutputStream out = new FileOutputStream("C:\\Users\\wang\\Desktop\\ArrayList.txt");
try {
//创建一个对象写入通达!
ObjectOutputStream objOut = new ObjectOutputStream(out);
//利用for循环来写入Car对象!
for(Car c:arr){
objOut.writeObject(c);
}
//关闭写入资源!
objOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
/**
* 读取集合对象
*/
try {
//创建一个写入通道
FileInputStream in = new FileInputStream("C:\\Users\\wang\\Desktop\\ArrayList.txt");
try {
//创建一个对象读取通达!
ObjectInputStream objIn = new ObjectInputStream(in);
try {
try {
//while循环读取对象并打印!
while(true){
Car c = (Car)objIn.readObject();
System.out.println(c.brand+c.owner);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (EOFException e) {
//当while循环完毕后会爆出---》 java.io.EOFException》代表打印完毕!
System.out.println("打印完毕!!");
}finally{
//关闭读取资源
objIn.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public static void readerOut(){
try {
//创建一个写出通道
FileInputStream in = new FileInputStream("C:\\Users\\wang\\Desktop\\List.txt");
try {
//创建一个写出对象的通道!
ObjectInputStream objIn = new ObjectInputStream(in);
try {
//读取对象,返回的是一个Object类型的对象(需强转)
Car car = (Car)objIn.readObject();
//打印一下,看是否是步骤一写入的对象!---->由于owner是被transient修饰的所以显示为null
System.out.println(car.brand + car.owner);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public static void writerIn(){
try {
//创建一个写入通道!
FileOutputStream out = new FileOutputStream("C:\\Users\\wang\\Desktop\\List.txt");
try {
//创建一个写入对象的通道!
ObjectOutputStream objOut = new ObjectOutputStream(out);
//创建一个对象
Car car = new Car("奔驰", "张三");
//写入对象
objOut.writeObject(car);
//关闭写入资源
objOut.close();
/**
* ********在此时写入完成!********
*/
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
在接下来的代码中可以读取/写入---->覆盖原有对象并添加新对象!
public static void writerInOrReaderOut(){
ArrayList<Car> arr = new ArrayList<Car>();
try {
//创建读取的通道
FileInputStream in = new FileInputStream("C:\\Users\\wang\\Desktop\\ArrayList.txt");
try {
//创建对象读取通道!
ObjectInputStream objIn = new ObjectInputStream(in);
try {
try {
//开始读取
while(true){
try {
Car c = (Car) objIn.readObject();
//向集合中添加对象
arr.add(c);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (EOFException e) {
// TODO Auto-generated catch block
System.out.println("添加完了!");
}
}finally{
objIn.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//创建输出通道!
FileOutputStream out = new FileOutputStream("C:\\Users\\wang\\Desktop\\ArrayList.txt");
try {
//创建对象输出通道!
ObjectOutputStream objOut = new ObjectOutputStream(out);
//for循环遍历
for(Car c:arr){
objOut.writeObject(c);
}
//在这里添加某个对象
objOut.writeObject(new Car("兰博基尼", "纷纷"));
//关闭资源
objOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//创建读取的通道
FileInputStream in = new FileInputStream("C:\\Users\\wang\\Desktop\\ArrayList.txt");
try {
//创建对象读取通道!
ObjectInputStream objIn = new ObjectInputStream(in);
try {
try {
//开始读取
while(true){
try {
//读取对象!
Car c = (Car) objIn.readObject();
//打印对象!
System.out.println(c.brand+c.owner);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (EOFException e) {
// TODO Auto-generated catch block
System.out.println("打印完了!");
}
}finally{
//关闭资源!
objIn.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Java里的IO流里的 ObjectInputStream 的读取\写入!的更多相关文章
- Java里的IO流里的FileReader里的BufferedReader读取并在前打印行数!
哈哈!!我又来了!!这个里面没有运用readLine 的方法!!纯手打!! import java.io.BufferedReader; import java.io.FileNotFoundExce ...
- Java里的IO流里的FileInputStream 的读取并在前打印行数!
大家好!!新人求罩! import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException ...
- Java中的IO流(六)
上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...
- Java中的IO流之输出流|乐字节
大家好,乐字节小乐又来了.上一篇给大家带来的是:Java中的IO流之输入流|乐字节,本文将继续讲述IO流之输出流. 一.输出流 1.抽象类:OutputStream 和 Writer Output ...
- Java中的IO流之输入流|乐字节
亲爱的乐字节的小伙伴们,小乐又来分享Java技术文章了.上一篇写到了IO流,这篇文章着重 谈谈输入流,再下次再说输出流. 点击回顾上一篇:乐字节Java之file.IO流基础知识和操作步骤 一. 输入 ...
- java中的IO流
Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...
- Java中的IO流(五)
上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...
- Java中的IO流(四)
上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...
- 第55节:Java当中的IO流-时间api(下)-上
Java当中的IO流(下)-上 日期和时间 日期类:java.util.Date 系统时间: long time = System.currentTimeMillis(); public class ...
随机推荐
- C++跨平台事件机制实现
今天看到有人在讨论C++标准没有提供类似操作系统层次的事件通知机制,如windows的事件内核对象.其实我想说的事,C++11标准里的互斥量及条件变量已经够帮我们实现类似的功能了. 刚编写了一个事件通 ...
- Qt经典出错信息之”Basic XLib functionality test failed!”
解决方法: 此完整出错信息是在./configure阶段Basic XLib functionality test failed!You might need to modify the includ ...
- Html 中select标签的边框与右侧倒三角的去除
首先是边框的去除:可以设置属性border:none;或border:0px; 不过这还是有一个bug,不同浏览器会在选中select标签时,加上一个边框: 之后是右侧倒三角的去除:设置属性 appe ...
- 学会爱上iOS自动布局(Auto Layout) - 剑尖
本文翻译自Yari Dareglia的LEARN TO LOVE AUTO LAYOUT文章先生们,女士们,让我们以正确的心态开始本教程吧:自动布局就是简单!我花了一段时间来掌握自动布局是如何工作的, ...
- bzoj3141: [Hnoi2013]旅行
Description Input 第 一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号 ...
- 实现OC与JS的交互
oc-->js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数.一句js代码或他们 ...
- 性能相差极大的SQL语句
等价的SQL,性能差异极大,数据库里设计了一个字段存储日期时间,但不是datetime类型,用了时间戳(int 11), 下面有2个SQL语句用于查询数据库,一个是把时间戳转成date进行查询,一个是 ...
- BZOJ 1257 余数之和
Description 给出正整数\(n\)和\(k\),计算\(j(n, k)=k\;mod\;1\;+\;k\;mod\;2\;+\;k\;mod\;3\;+\;-\;+\;k\;mod\;n\) ...
- [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】
题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...
- 优秀的开发者 vs. 差的开发者
优秀的开发者是一个艺术家,一个享受创作过程的工匠.差的开发者只将自己当作负责产生代码的码农. 优秀的开发者了解客户的问题.差的开发者只了解手头的技术问题.优秀的开发者会不断努力去理解"为什么 ...