Groovy File.append(String) 是否自动关闭流?
Does Groovy File.append(String) closes stream automatically?
如果我有以下写入文件的逻辑,完成于Groovy
def file = new File(FILE_PATH + FILE_NAME)
file.append("hello again!")
(append(String s)方法)是否在异常或其他情况下自动关闭流?
查看 groovy 来源后,是的。
详情:
// ResourceGroovyMethods.java line 870
/**
* Append the text at the end of the File without writing a BOM.
*
* @param file a File
* @param text the text to append at the end of the File
* @throws IOException if an IOException occurs.
* @since 1.0
*/
public static void append(File file, Object text) throws IOException {
append(file, text, false);
}
// ResourceGroovyMethods.java line 882
/**
* Append the text at the end of the File. If the default
* charset is "UTF-16BE" or "UTF-16LE" (or an equivalent alias) and
* <code>writeBom</code> is <code>true</code>, the requisite byte order
* mark is written to the file before the text.
*
* @param file a File
* @param text the text to append at the end of the File
* @param writeBom whether to write a BOM
* @throws IOException if an IOException occurs.
* @since 2.5.0
*/
public static void append(File file, Object text, boolean writeBom) throws IOException {
append(file, text, Charset.defaultCharset().name(), writeBom);
}
// ResourceGroovyMethods.java line 1027
/**
* Append the text at the end of the File, using a specified encoding. If
* the given charset is "UTF-16BE" or "UTF-16LE" (or an equivalent alias),
* <code>writeBom</code> is <code>true</code>, and the file doesn't already
* exist, the requisite byte order mark is written to the file before the
* text is appended.
*
* @param file a File
* @param text the text to append at the end of the File
* @param charset the charset used
* @param writeBom whether to write a BOM
* @throws IOException if an IOException occurs.
* @since 2.5.0
*/
public static void append(File file, Object text, String charset, boolean writeBom) throws IOException {
Writer writer = null;
try {
boolean shouldWriteBom = writeBom && !file.exists();
FileOutputStream out = new FileOutputStream(file, true);
if (shouldWriteBom) {
IOGroovyMethods.writeUTF16BomIfRequired(out, charset);
}
writer = new OutputStreamWriter(out, charset);
InvokerHelper.write(writer, text);
writer.flush();
Writer temp = writer;
writer = null;
temp.close();
} finally {
closeWithWarning(writer);
}
}
// DefaultGroovyMethodsSupport.java line 119
/**
* Close the Closeable. Logging a warning if any problems occur.
*
* @param closeable the thing to close
*/
public static void closeWithWarning(Closeable closeable) {
tryClose(closeable, true); // ignore result
}
// DefaultGroovyMethodsSupport.java line 128
/**
* Attempts to close the closeable returning rather than throwing
* any Exception that may occur.
*
* @param closeable the thing to close
* @param logWarning if true will log a warning if an exception occurs
* @return throwable Exception from the close method, else null
*/
static Throwable tryClose(AutoCloseable closeable, boolean logWarning) {
Throwable thrown = null;
if (closeable != null) {
try {
closeable.close();
} catch (Exception e) {
thrown = e;
if (logWarning) {
LOG.warning("Caught exception during close(): " + e);
}
}
}
return thrown;
}
您的 file.append(string)
调用将由 public static void append(File file, Object text)
方法处理。
根据代码我们可以看到 writer 在 finally
块中关闭,这意味着关闭操作将始终是 运行,无论是否有例外。
如果我有以下写入文件的逻辑,完成于Groovy
def file = new File(FILE_PATH + FILE_NAME)
file.append("hello again!")
(append(String s)方法)是否在异常或其他情况下自动关闭流?
查看 groovy 来源后,是的。
详情:
// ResourceGroovyMethods.java line 870
/**
* Append the text at the end of the File without writing a BOM.
*
* @param file a File
* @param text the text to append at the end of the File
* @throws IOException if an IOException occurs.
* @since 1.0
*/
public static void append(File file, Object text) throws IOException {
append(file, text, false);
}
// ResourceGroovyMethods.java line 882
/**
* Append the text at the end of the File. If the default
* charset is "UTF-16BE" or "UTF-16LE" (or an equivalent alias) and
* <code>writeBom</code> is <code>true</code>, the requisite byte order
* mark is written to the file before the text.
*
* @param file a File
* @param text the text to append at the end of the File
* @param writeBom whether to write a BOM
* @throws IOException if an IOException occurs.
* @since 2.5.0
*/
public static void append(File file, Object text, boolean writeBom) throws IOException {
append(file, text, Charset.defaultCharset().name(), writeBom);
}
// ResourceGroovyMethods.java line 1027
/**
* Append the text at the end of the File, using a specified encoding. If
* the given charset is "UTF-16BE" or "UTF-16LE" (or an equivalent alias),
* <code>writeBom</code> is <code>true</code>, and the file doesn't already
* exist, the requisite byte order mark is written to the file before the
* text is appended.
*
* @param file a File
* @param text the text to append at the end of the File
* @param charset the charset used
* @param writeBom whether to write a BOM
* @throws IOException if an IOException occurs.
* @since 2.5.0
*/
public static void append(File file, Object text, String charset, boolean writeBom) throws IOException {
Writer writer = null;
try {
boolean shouldWriteBom = writeBom && !file.exists();
FileOutputStream out = new FileOutputStream(file, true);
if (shouldWriteBom) {
IOGroovyMethods.writeUTF16BomIfRequired(out, charset);
}
writer = new OutputStreamWriter(out, charset);
InvokerHelper.write(writer, text);
writer.flush();
Writer temp = writer;
writer = null;
temp.close();
} finally {
closeWithWarning(writer);
}
}
// DefaultGroovyMethodsSupport.java line 119
/**
* Close the Closeable. Logging a warning if any problems occur.
*
* @param closeable the thing to close
*/
public static void closeWithWarning(Closeable closeable) {
tryClose(closeable, true); // ignore result
}
// DefaultGroovyMethodsSupport.java line 128
/**
* Attempts to close the closeable returning rather than throwing
* any Exception that may occur.
*
* @param closeable the thing to close
* @param logWarning if true will log a warning if an exception occurs
* @return throwable Exception from the close method, else null
*/
static Throwable tryClose(AutoCloseable closeable, boolean logWarning) {
Throwable thrown = null;
if (closeable != null) {
try {
closeable.close();
} catch (Exception e) {
thrown = e;
if (logWarning) {
LOG.warning("Caught exception during close(): " + e);
}
}
}
return thrown;
}
您的 file.append(string)
调用将由 public static void append(File file, Object text)
方法处理。
根据代码我们可以看到 writer 在 finally
块中关闭,这意味着关闭操作将始终是 运行,无论是否有例外。