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中只是随便输了几个数字,不行么??有没个具体的可以用的例子看看。。。谢谢了、、、 展开
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中只是随便输了几个数字,不行么??有没个具体的可以用的例子看看。。。谢谢了、、、 展开
2个回答
展开全部
你的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来标识结束。
你要知道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来标识结束。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询