java中关于ObjectInputStream

importjava.io.*;importjava.util.ArrayList;publicclasstest123{staticString[]num;public... import java.io.*;
import java.util.ArrayList;

public class test123 {
static String[] num;
public static void main(String args[]){
try{
FileInputStream fs=new FileInputStream("C:\\King.txt");
ObjectInputStream ois = new ObjectInputStream(fs);//运行时这里提示错误 ArrayList ar=new ArrayList();
while(fs.read()!=-1){
try{
ar.add(ois.readInt());
}catch(EOFException e){}
num=(String[])ar.toArray();

}
ois.close();

FileOutputStream os=new FileOutputStream("C:\\Output.txt");
ObjectOutputStream oos = new ObjectOutputStream(os);
for(int i = 0;i <num.length;i++)
oos.writeUTF(num[i] + " ");
oos.close();

}catch(FileNotFoundException e){System.out.println("FileNotFound"+e.toString());}
catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
}
}
}

编译的时候没错误运行的时候就出错了,是什么原因?是因为那个King.txt文件的末尾缺少了什么结尾标记吗??我那个King.txt中只是随便输了几个数字,不行么??有没个具体的可以用的例子看看。。。谢谢了、、、
展开
 我来答
书荒莫慌
2011-01-05 · TA获得超过2972个赞
知道小有建树答主
回答量:700
采纳率:0%
帮助的人:535万
展开全部
你的king.txt是自己手写的吧?这是不对的,因为ObjectInputStream读取的时候会先读取一个头,这个头我也不知道是什么,但是如果文件时用ObjectOutputStream写的话,会自动填充那个头,这样的话就能用ObjectInputStream读取了,所以你可以先用ObjectOutputStream写King.txt,再执行上面的代码试试吧。

你要知道ObjectInputStream和ObjectOutputStream是来反序列化和序列化的,他们读写的而文件应该是你很难看懂的东东,因为直接写的对象数据了,类似乱码。

你可以先改成这样import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;

public class test123 {
static String[] num;
static ArrayList<String> ar = new ArrayList<String>();

public static void main(String args[]) {
ar.add("111");
ar.add("bbb");
try {

//FileInputStream fs = new FileInputStream("D:\\King.txt");
//ObjectInputStream ois = new ObjectInputStream(fs);
/*while (true) {
try {
ar.add(ois.readUTF());
} catch (EOFException e) {
ois.close();
break;
}
}*/
FileOutputStream os = new FileOutputStream("C:\\King.txt");
ObjectOutputStream oos = new ObjectOutputStream(os);
Iterator<String> it = ar.iterator();
while (it.hasNext())
oos.writeUTF(it.next());
oos.close();
} catch (FileNotFoundException e) {
System.out.println("FileNotFound" + e.toString());
} catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
}
}

}

这个执行一遍后,写入King.txt文件的东西就能被ObjectInputStream读取了。
然后再:
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;

public class test123 {
static String[] num;
static ArrayList<String> ar = new ArrayList<String>();

public static void main(String args[]) {
try {

FileInputStream fs = new FileInputStream("C:\\King.txt");
ObjectInputStream ois = new ObjectInputStream(fs);
while (true) {
try {
ar.add(ois.readUTF());
} catch (EOFException e) {
ois.close();
break;
}
}
FileOutputStream os = new FileOutputStream("C:\\Output.txt");
ObjectOutputStream oos = new ObjectOutputStream(os);
Iterator<String> it = ar.iterator();
while (it.hasNext())
oos.writeUTF(it.next());
oos.close();
} catch (FileNotFoundException e) {
System.out.println("FileNotFound" + e.toString());
} catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
}
}

}
其实主程序也这么弄是要帮你改一个问题:
因为需要特定的头,那么你千万别while(fs.read()!=-1)这么弄了,这只是一个个的读,要知道头可能是几个字节,而且文件里面的都是对象,你这么弄,全部都会搞坏了的。所以解决方法有两个,一个是while(true)并用异常来退出,因为到了结尾自动抛出异常的,需要处理的数据放到异常里面处理。第二个方法是你再用ObjectOutputStream写入文件的时候可以系一个特定的Object来标识结束。
J2meSlave
2011-01-05
知道答主
回答量:17
采纳率:0%
帮助的人:5.9万
展开全部
你读取的方式是 utf 编码 ,请检查King.txt 是否是 相同编码。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式