我在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()
答案 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
方法关闭流。