【问题标题】:Gson stream closingGson 流关闭
【发布时间】:2026-02-09 20:35:01
【问题描述】:

当您使用以下内容时,流是否关闭:

gson.toJson(obj, new FileWriter("C:\\fileName.json"));

或者这样做更好:

        try (Reader reader = new FileReader("c:\\test\\staff.json")) {

            // Convert JSON File to Java Object
            Staff staff = gson.fromJson(reader, Staff.class);

            // print staff 
            System.out.println(staff);

        } catch (IOException e) {
            e.printStackTrace();
        }

我知道 try 块会关闭流,但第一个示例是否也关闭了流?

代码取自 Mkyong

【问题讨论】:

    标签: java json stream gson coding-efficiency


    【解决方案1】:

    当您使用以下内容时,流是否关闭:

    gson.toJson(obj, new FileWriter("C:\\fileName.json"));
    

    它没有。您应该使用 try-with-resources 或 try-catch-finally 块来关闭它。


    从 JDK 7 开始,关闭 AutoClosable 的首选方法是使用 try-with-resources(就像在您的第二个 sn-p 中一样):

    try (FileWriter writer = new FileWriter("C:\\fileName.json")) {
        gson.toJson(obj, writer);
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    或者您可以使用 try-catch-finally 块调用 close()

    FileWriter writer = null;
    try {
        writer = new FileWriter("C:\\fileName.json");
        gson.toJson(obj, writer);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (writer != null) {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

    • 感谢您的回复
    【解决方案2】:

    FileWriter 实现了AutoClosable,所以它需要被关闭。不命名变量不会自动关闭。

    【讨论】:

    • 那么最好用第二种方式吗?
    • @gike 是的,这样更好。将防止内存泄漏并防止文件锁定。
    • 感谢您的回复