在读取/写入文件Java时关闭Stream

时间:2016-01-23 12:24:43

标签: java file

我在Java中实现了一个小工具。我有一个excel文档,我需要生成一个.sql文件。我已经创建了一个sql文件模型,我必须为每个excel表读取,然后替换一个值并将其写回另一个.sql文件。问题是我使用了一个用于循环遍历我的工作表的地方,对于我需要读取该sql文件的每个工作表,修改它并将其导出到其他地方。我得到一个" Stream关闭"错误,我不知道如何正确关闭我的缓冲区和/或我的InputStream。你能帮我解决这个问题吗?

这是我的代码: 这将从文件中获取所有内容并将其转换为String

params[:type]

这用于导出文件

public String getString(InputStream is) throws IOException {

    BufferedReader reader = null;
    StringBuilder sb = new StringBuilder();
    String line;

    try {
        reader = new BufferedReader(new InputStreamReader(is));

        while ((line = reader.readLine()) != null) {
            sb.append(line + System.lineSeparator());
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
return sb.toString();
}

这是我的public void exportFile(String text, String path, String name, String extension) { BufferedWriter output = null; try { File sqlFile = new File(path + name + extension); output = new BufferedWriter(new FileWriter(sqlFile)); output.write(text); } catch (IOException e) { e.printStackTrace(); logger.severe("Unable to write to file!\n"); } finally { if (output != null) { try { output.close(); } catch (IOException e) { e.printStackTrace(); logger.severe("Unable to close buffer\n"); } } } } 方法的一部分,它使用上面的代码:

run()

2 个答案:

答案 0 :(得分:1)

问题出在这个方法中:

public String getString(InputStream is) throws IOException {

关闭阅读器并在结尾处流式传输。 (当您关闭阅读器时,其中的流会自动关闭。

编辑:你应该关闭阅读器。 getString(InputStream is) throws IOException总是返回相同的String或?在进入循环之前读取它并且每次都重用String。

String exportText = getString("val_table_create.sql");
for (Sheet sheet : bookSheets) {
    setHeader(table, sheet);        
    String newExportText = exportText.replaceAll(TABLE_NAME, tableName);
  messageDataType);
    exportFile(newExportText, absoluteWorkspacePath + File.separator + outputPath + File.separator, tableName, ".sql");
}

将你的getString方法更改为:

public String getString(String resourceName) throws IOException {

BufferedReader reader = null;
StringBuilder sb = new StringBuilder();
String line;

try {
        InputStream createTableInputStream reader.getResourceAsStream(resourceName);
    reader = new BufferedReader(new InputStreamReader(is));

    while ((line = reader.readLine()) != null) {
        sb.append(line + System.lineSeparator());
    }

} catch (IOException ex) {
    ex.printStackTrace();
}
return sb.toString();
}

并关闭所有流。现在您有一个加载文件的地方。

答案 1 :(得分:0)

第一次调用createTableInputStream方法时,

getString将会关闭,因此,对于下一页循环播放,您将关闭流。

在创建它的方法中关闭流是一种更好的做法。您应该使用run方法关闭流。