在Test2.java中加入红色代码
第一部分是防止重复插入数据,第二部分是插入结束标志
File file = new File("QQ1.txt");
if(file.exists()){
file.delete();
}
fos = new FileOutputStream(file, true);
...................
...............
oos.writeObject(qq2);
oos.writeObject(null);
oos.flush();
第一部分是防止重复插入数据,第二部分是插入结束标志
File file = new File("QQ1.txt");
if(file.exists()){
file.delete();
}
fos = new FileOutputStream(file, true);
...................
...............
oos.writeObject(qq2);
oos.writeObject(null);
oos.flush();
解决方案 »
- 如何取得ftp上图片的大小信息
- 关于textarea显示的问题
- return
- 两段程序 输出时结果不一样 一个101 0,一个101 100 不知道区别在哪?
- 【STRUTS 线程共享冲突】actionform中的数据似被共享了!救命啊~~~~~~~~
- 通过jdbc-odbc访问SqlServer使用prepareStatement时,xxxx like %?%……出现问题,谁知道是怎么回事?如何解决?
- 编译时报错。。。。
- 各位在做Java时有没有用到继承
- 如果我有两个JAVA文件,其中一个需要调用另一里面的定义CLASS,应该怎么写呢???
- 微信JSSDK录音
- HashMap内存释放问题,大家来看看~
- 求助,关于java打开串口错误的问题
是因为没有插入结束标志造成的
oos.writeObject(qq1);
oos.writeObject(qq2);
oos.flush(); 把oos.flush();改成oos.reset();看看能不能解决问题。
估计你再次把对象写入文件的时候,用的是同一个对象(只是把对象里的成员信息修改)。这样的话程序是不会把对象修改后的版本写入文件的。
执行一次 test2.java 后,再执行 test.java 出现 java.io.EOFException
执行多次 test2.java 后,再执行 test.java 出现 java.io.StreamCorruptedException4楼的方法试都不用试,肯定错
因为打印的只是奇数行数据
你这样写,加上
if(file.exists()){
file.delete();
}
下一次写得时候就会把上一次写入的内容删掉,这样的话就不能追加了。去掉
if(file.exists()){
file.delete();
}
每次读的时候只能读到第一次写得。
有没有更好的方法。
调用代码在 main 方法中
package com.qq.server;import java.io.File;
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.util.ArrayList;
import java.util.List;public class Test { /**
* @param args
*/
public static void main(String[] args) {
Test test = new Test();
QQ qq = new QQ(1, "231", "fds", "fds", "sadf", 3213, "fdsaf", "fdsafsd");
System.out.println("新增的QQ :" + qq + "\n"); test.saveDataToFile("qq.txt", qq); System.out.println("保存后的数据:");
List<QQ> list = test.getDataFromFile("qq.txt");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
} /**
* 写数据
*
* @param filePath
* @param newQQ
*/
public void saveDataToFile(String filePath, QQ newQQ) {
List<QQ> qqs = getDataFromFile(filePath);
FileOutputStream fos = null;
ObjectOutputStream oos = null; qqs.add(newQQ);
try {
File file = new File(filePath);
if (file.exists()) {
file.delete();
}
fos = new FileOutputStream(file, false);
oos = new ObjectOutputStream(fos);
for (int i = 0; i < qqs.size(); i++) {
oos.writeObject(qqs.get(i));
}
oos.writeObject(null);
oos.flush();
oos.reset();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /**
* 读数据
*
* @param filePath
* @return
*/
public List<QQ> getDataFromFile(String filePath) {
List<QQ> qqs = new ArrayList<QQ>();
FileInputStream fis = null;
ObjectInputStream ois = null; try {
File file = new File(filePath);
if (!file.exists()) {
file.createNewFile();
// 第一次执行时,因为没有数据,所以强行加入一个结束符号
FileOutputStream fos = new FileOutputStream(file, true);
fos = new FileOutputStream(file, true);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(null);
oos.flush();
oos.close();
}
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
QQ qq = null;
while ((qq = (QQ) ois.readObject()) != null) {
qqs.add(qq);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return qqs;
}
}
具体可以参见楼上,要不要写入null看你读对象的方法怎么写了,不写的话度的时候就会抛java.io.EOFException异常,捕捉一下就可以了