2 huxleye Huxleye 于 2016.03.28 19:57 提问

java 关于将ArrayList存入文件与读取的问题

问题描述:这段代码是我未完成的主文件,本人java初学者,实在无法解决,渴求帮助。
这段程序是为了记录Task这个class并保存在timetracker.data中。程序首先要读取文件中的内容,我根据ObjectInputStream函数,想将文件内的内容的全部作为一个ArrayList整体读取出来,然后再在用户输入1时使用add()直接将新的Task添加到ArrayList中,最后在用户输入5的时候将这个ArrayList作为一个整体保存进去。以此来实现Task这个class的存取。 目前来看我的问题出在TaskList = (ArrayList)ois.readObject();这一行。
编译时会警报 未经检查的类型使用,找到java.lang.Object 需要java.util.ArrayList
我的疑问是 到底能不能通过readObject将文件内的所有内容读出,还是只能读出一个然后我的程序强行将这个Object转化成了ArrayList形式。
如果能,希望可以教我一下我写法的缺陷。
很抱歉浪费大家时间,感激不尽

import java.io.*;
import java.text.*;
import java.util.*;
import java.lang.*;

public class TimeTracker
{

public static void main(String[] args)  throws IOException
{
byte[] option = new byte[100];

ArrayList<Task> TaskList = new ArrayList<Task>();
for(;;){    //nihao

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

ObjectInputStream ois = null;


try{
ois = new ObjectInputStream(new FileInputStream("timetracker.data"));
TaskList = (ArrayList<Task>)ois.readObject();

}  catch (ClassNotFoundException e){
    System.out.println("(None)");
} catch (EOFException e){       // catch EOF
System.out.println("have reached the end of file");
}   

finally{
    if( ois != null )
        {
        ois.close();
        }
int n = TaskList.size();
System.out.println(n);

    }

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

ManuPrint manu = new ManuPrint();
manu.Print();

int numRead = System.in.read(option);
if((char) option[0] == '1'||(char) option[0] == '2'||(char) option[0] == '3'||(char) option[0] == '4'||(char) option[0] == '5'){
if((char) option[0] == '1'){
System.out.println("Enter new task (blank line ends input, no text ends the current task):");
Date date = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat dt = new SimpleDateFormat("HH:mm");
//------------------------------record the last finished task

//------------------------------record the last finished task
// still not sloved multi lines
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
str=br.readLine();  
// multi lines

Task a = new Task((ft.format(date)),(dt.format(date)),"","",str);




TaskList.add(a);




}   // option 1

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
if((char) option[0] == '5'){
FileOutputStream fout = new FileOutputStream("timetracker.data");
ObjectOutputStream out = new ObjectOutputStream(fout);
try{

out.writeObject(TaskList);
out.flush();
} catch(Exception e){
e.printStackTrace();
} finally{
try{
    out.close();
} catch(Exception e){
    e.printStackTrace();
    }
}

System.out.print("******SEEEEEE UUUUU NEEEXT TIMEEE*********");
    System.exit(0);
}   // option 5

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
} // if=1,2,3,4,5
else{
System.out.println("Invalid option!");
continue;
}
} //nihao
} // main
} //class

2个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.28 21:06
已采纳

首先,分析下报错的这行代码,因为你既然使用的是readObject,那么你的文件timetracker.data中必须存的是通过java序列化的一个ArrayList对象,然后writeObject写到这个文件中的。
所以,你的问题可能是这个文件中的东西并不是序列化的ArrayList类型的对象。你需要另写一个类线序列化一个对象向文件中存入标准的对象流,然后再执行你这段代码才行。
我的简单测试案例:先写,再读。

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

public class SerialiTest {
    public static void main(String[] args) {
        SerialiTest serial = new SerialiTest();
        //先序列化对象写入文件
        serial.writeFirst();
        //再反序列化读取对象
        serial.readAfter();
    }

    public void writeFirst() {
        ArrayList<String> list = new ArrayList<String>();
        list.add("hello");
        list.add("world");

        FileOutputStream fout;
        ObjectOutputStream out = null;
        try {
            fout = new FileOutputStream("timetracker.data");
            out = new ObjectOutputStream(fout);
            out.writeObject(list);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public void readAfter() {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("timetracker.data"));
            ArrayList<String> list = (ArrayList<String>) ois.readObject();
            System.out.println(list);
        } catch (ClassNotFoundException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

你换成你使用的ArrayList就可以了。试试看。

wojiushiwo945you
wojiushiwo945you 可以这么理解。怎么都需要先写入再读的。
一年多之前 回复
Huxleye
Huxleye 我是在之后才向其中序列化输入内容的 所以说我应该在readObject的时候先判断其返回值是否为null,如果是null的话就可以跳过第一次的取值,进行到下面的序列化输入内容 请问是这个意思么
一年多之前 回复
Huxleye
Huxleye 我是在之后才向其中序列化输入内容的 所以说我应该在readObject的时候先判断其返回值是否为null,如果是null的话就可以跳过第一次的取值,进行到下面的序列化输入内容 请问是这个意思么
一年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复Huxleye: 那就是根源所在了。对你有帮助就好!祝好!
一年多之前 回复
Huxleye
Huxleye 非常感谢回答 我应该理解到你的意思了 因为我的程序在开始的时候就要调用ObjectInputStream来调取内容,而这个时候我的文件中可能没有存在内容。
一年多之前 回复
bdmh
bdmh   Ds   Rxr 2016.03.28 20:33

流读取,每次只能读取指定大小的字节数,这个数你可以自己定义,比如2048,然后你就while,直到读不到数据为止

Huxleye
Huxleye 不可以用readObject将文件的全部内容作为ArrayList读出么 我在存入数据的时候就是writeObject了那个ArrayList进去
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!