尝试使用资源如何调用刷新方法[重复]

Posted

技术标签:

【中文标题】尝试使用资源如何调用刷新方法[重复]【英文标题】:Try with resource how to call flush method [duplicate] 【发布时间】:2016-12-20 13:38:29 【问题描述】:

以下代码用于将 HotelReportModel 数据写入 csv 文件。我打算用 try-with-resources 语句替换 try 但我应该如何处理 filewriteter.flush?在 finally 块内。

       FileWriter fileWriter = null;
        try 
        fileWriter = new FileWriter(tempCSVFilePath);
        fileWriter.append(hotelReportModel.getHeader());
        fileWriter.append(NEW_LINE_SEPARATOR);

        for(HotelReportModel imageStat:hotelReportModel.getContent())
            fileWriter.append(imageStat.getMarketerName());
            fileWriter.append(COMMA_DELIMITER);
            fileWriter.append(imageStat.getChainCode());
            fileWriter.append(COMMA_DELIMITER);
            fileWriter.append(imageStat.getPropertyId());
            fileWriter.append(COMMA_DELIMITER);
            fileWriter.append(imageStat.getContentProvider());
            fileWriter.append(COMMA_DELIMITER);
            fileWriter.append(String.valueOf(imageStat.getPropertyImageCount()));
            fileWriter.append(NEW_LINE_SEPARATOR);
        
        LOGGER.info("CSV file was created successfully !!!");   
     catch (Exception e) 
        LOGGER.error("Error in CsvFileWriter !!!",e);
     finally 
        try 
            if(fileWriter != null) 
                fileWriter.flush();
                fileWriter.close();
            
         catch (IOException e) 
            LOGGER.error("Error while flushing/closing fileWriter !!!",e);
        
    

下面用资源试试对吗?

         try(FileWriter fileWriter = = new FileWriter(tempCSVFilePath) ) 

        fileWriter.append(hotelReportModel.getHeader());
        fileWriter.append(NEW_LINE_SEPARATOR);

        for(HotelReportModel imageStat:hotelReportModel.getContent())
            fileWriter.append(imageStat.getMarketerName());
            fileWriter.append(COMMA_DELIMITER);
            fileWriter.append(imageStat.getChainCode());
            fileWriter.append(COMMA_DELIMITER);
            fileWriter.append(imageStat.getPropertyId());
            fileWriter.append(COMMA_DELIMITER);
            fileWriter.append(imageStat.getContentProvider());
            fileWriter.append(COMMA_DELIMITER);
            fileWriter.append(String.valueOf(imageStat.getPropertyImageCount()));
            fileWriter.append(NEW_LINE_SEPARATOR);
        
        LOGGER.info("CSV file was created successfully !!!");   
     catch (Exception e) 
        LOGGER.error("Error in CsvFileWriter !!!",e);
     
    

【问题讨论】:

close 无论如何都会调用flush,所以你不需要。 乔恩你的意思是说我可以删除完整的 finally 块吗? 如果你使用 try-with-resources,是的。 【参考方案1】:

您无需担心这一点,因为您正在调用close(来自javadoc):

因为在try-with-resource语句中声明了BufferedReader,所以无论try语句正常完成还是突然完成都会关闭。

(他们的示例使用了BufferedReader,但这并不重要,因为BufferedReaderFileWriter 都实现了AutoCloseable)。

所以简单地使用try with resources 将关闭和刷新fileWriter

【讨论】:

以上是关于尝试使用资源如何调用刷新方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

调用 recreate() 方法时 TextInputLayout 提示不会刷新

如何在尝试使用资源时调用方法[关闭]

如何使用 Timer 类调用方法,做某事,重置计时器,重复?

Vue 资源拦截器刷新 JWT 令牌

如何在资源请求上重新生成刷新令牌和访问令牌?

刷新时如何防止重复条目?