程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> exception-java 關於將ArrayList存入文件與讀取的問題

exception-java 關於將ArrayList存入文件與讀取的問題

編輯:編程解疑
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

最佳回答:


首先,分析下報錯的這行代碼,因為你既然使用的是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就可以了。試試看。

Huxleye
Huxleye
wojiushiwo945you
Huxleye
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved