簡體   English   中英

Java將文件讀入對象的數組列表並返回該數組列表

[英]Java read a file into an arraylist of objects and return that arraylist

我需要編寫一個具有兩個靜態方法的類: writeFilereadFile 但是,在我執行readFile() ,它什么也不返回。

class writereadFile {
    public static void writeFile(ArrayList<Object> list, File file){
        try {
            try (FileOutputStream fos = new FileOutputStream(file);ObjectOutputStream oos = new ObjectOutputStream(fos)) {
                oos.writeObject(list);
                oos.close();
            }
        }catch(IOException e){e.getMessage();}
    }

    public static ArrayList<Object> readFile(ArrayList<Object>list, File file){
        try {
            try (FileInputStream fis = new FileInputStream(file);ObjectInputStream ois = new ObjectInputStream(fis)) {
                Object o = ois.readObject();
                list = (ArrayList<Object>) o;
                ois.close();
            }
        }catch(IOException | ClassNotFoundException e){e.getMessage();}  
        System.out.println(list);
        return list;
    } 
}

編輯:這是我的類進行測試。 如果您只需要注釋自定義對象,則我的對象是自定義對象的數組列表。

class main {
    public static void main(String[] args) {
        Date date = new Date();
        Book b1 = new Book("abc", "Phi", true, date, null);
        Book b2 = new Book("cba", "Someone", true, date, null);
        Books booklist = new Books();
        booklist.add(b1);
        booklist.add(b2);

        File filetoDo = new File("book.txt");

        //write arraylist into file
        writereadFile.writeFile(booklist, filetoDo);

        //clear the arraylist
        booklist.clear();

        //read book from file
        writereadFile.readFile(booklist, filetoDo);
        System.out.println(booklist);
    }    
} 

您的測試應為:

bookList = writereadFile.readFile(booklist, filetoDo);

順便說一句,您應該真正將readFile方法重構為簡單的:

public static ArrayList<Object> readFile(File file)

您不能像這樣修改參數引用 ,因為Java始終是按值傳遞調用語義。 (您可以在函數內部修改list參數的內容 ,但這不是您要執行的操作。)

如果您使用的是Java 8,請嘗試使用Streams:

public static readFile(String filePath) {
    List<Object> list = new ArrayList<>();

    try (Stream<String> stream = Files.lines(Paths.get(filePath))) {
        stream.forEach(list::add);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return list;
}

我自己獨自處理這個主題,因此在下面可以找到一些可能對您有所幫助的代碼段。 示例非常簡短,所以希望您不要在代碼中使用e.printStackTrace() :)

public class ExternalIO {

private ExternalIO() {
}

public static ObjectOutputStream objectOutputStream(String basePath, String pathToFile) throws IOException {
    FileOutputStream fileOutputStream = new FileOutputStream(createFileIfDoesNotExist(absolutePath(basePath, pathToFile)));
    return new ObjectOutputStream(fileOutputStream);
}

public static ObjectInputStream objectInputStream(String basePath, String pathToFile) throws IOException {
    FileInputStream fileInputStream = new FileInputStream(absolutePath(basePath, pathToFile));
    return new ObjectInputStream(fileInputStream);
}

private static File createFileIfDoesNotExist(String absolutePath) throws IOException {
    File file = new File(absolutePath);
    if (file.exists()) {
        return file;
    }

    file.getParentFile().mkdirs();
    file.createNewFile();
    return file;
}

private static String absolutePath(String basePath, String pathToFile) {
    return Paths.get(basePath, pathToFile).toAbsolutePath().toString();
}

}

輸出用法:

List<ItemType> input = null; //create your input list here
try (ObjectOutputStream objectOutputStream = ExternalIO.objectOutputStream(CONFIG, FILENAME)) {
    objectOutputStream.writeObject(input);
} catch (Exception e) {
    e.printStackTrace();
}

輸入用法:

try (ObjectInputStream objectInputStream = ExternalIO.objectInputStream(CONFIG, FILENAME)) {
    return (List<ItemType>) objectInputStream.readObject();
} catch (Exception e) {
    e.printStackTrace();
}

希望有幫助;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM