【问题标题】:Java read a file into an arraylist of objects and return that arraylistJava 将文件读入对象数组列表并返回该数组列表
【发布时间】:2017-05-13 17:21:24
【问题描述】:

我需要编写一个具有两个静态方法的类: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);
    }    
} 

【问题讨论】:

  • writeFile 方法中打印异常可能是个好主意。

标签: java serialization arraylist


【解决方案1】:

你的测试应该是:

bookList = writereadFile.readFile(booklist, filetoDo);

顺便说一句,你真的应该将你的 readFile 方法重构为简单的:

public static ArrayList<Object> readFile(File file)

您不能像那样修改参数 reference,因为 Java 始终是 pass-by-value 调用语义。 (您可以修改函数内部的list 参数contents,但这不是您正在做的。)

【讨论】:

  • 谢谢,这个有效,我误会pass and return
  • @PhiTruong 如果有机会,请务必将其标记为已接受的答案...谢谢伙计! :)
  • 对不起,我是新手 :)
【解决方案2】:

如果您使用的是 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;
}

【讨论】:

  • 对于文本文件来说这很好,但 OP 正在处理对象和序列化
【解决方案3】:

我自己在玩这个话题,所以你可以在下面找到一些可能对你有帮助的代码 sn-ps。 示例非常简短,所以我希望你不要只在代码中使用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();
}

希望有帮助; )

【讨论】:

  • 你能更详细地了解absolutePath()吗?
  • 好吧...它只是返回文件的绝对路径,而不是使用相对路径。再说一次,您可能会摆脱它,因为它可能不会改变您的使用情况。我只是将它粘贴在那里以确保代码编译:)
猜你喜欢
  • 2021-04-06
  • 2016-01-13
  • 2022-09-26
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2012-02-07
相关资源
最近更新 更多