尝试最后在释放资源时捕获内部
本文关键字:内部 释放资源 最后 | 更新日期: 2023-09-27 17:50:35
我想将String
写入Unicode文件。我在Java
中的代码是:
public static boolean saveStringToFile(String fileName, String text) {
BufferedWriter out = null;
boolean result = true;
try {
File f = new File(fileName);
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(f), "UTF-8"));
out.write(text);
out.flush();
} catch (Exception ex) {
result = false;
} finally {
if (out != null)
try {
out.close();
} catch (IOException e) {
// nothing to do! couldn't close
}
}
return result;
}
更新
现在将其与C#进行比较:
private static bool SaveStringToFile(string fileName, string text)
{
using (StreamWriter writer = new StreamWriter(fileName))
{
writer.Write(text);
}
}
或者甚至CCD_ 3的形式将是:
private static bool SaveStringToFile(string fileName, string text)
{
StreamWriter writer = new StreamWriter(fileName);
try
{
writer.Write(text);
}catch (Exception ex)
{
return false;
}
finally
{
if (writer != null)
writer.Dispose();
}
}
也许是因为我来自C#和。网络世界。但是,这是将字符串写入文件的正确方法吗?对于这样简单的任务来说,代码太多了。在C#中,我只想说out.close();
,仅此而已,但在finally
语句中添加try..catch
似乎有点奇怪。我添加了finally
语句来关闭文件(资源(,无论发生什么情况。为了避免使用过多的资源。这是Java中正确的方法吗?如果是,为什么close
抛出异常?
你是正确的,你需要在finally块中调用close((,你还需要包装这是一个try/catch
通常,你会在项目中编写一个实用程序方法,或者使用库中的实用程序方法http://commons.apache.org/io/apidocs/org/apache/commons/io/IOUtils.html#closeQuietly(java.io.Closeable(到closeQuietly。即忽略来自close((的任何抛出异常。
另外,Java 7还增加了对try with resources的支持,这消除了手动关闭资源的需要http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
是的,java中的Try-catch在finally((中没有什么奇怪的。close((可能会由于各种原因抛出IoException,这就是为什么它必须被try-catch块包围的原因。在最新的java SE 7中,有一个改进的解决方案可以解决您的这个问题。尝试使用资源
与using语句等价的Java是在Java 7:中添加的try-with-resources语句
public static void saveStringToFile(String fileName, String text) throws IOException {
try (Writer w = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
w.write(text);
}
}
try-with-resources将自动关闭流(这意味着刷新它(,并抛出在这样做时遇到的任何异常
如果只进行一次写入调用,则不需要BufferedWriter(其目的是将对底层流的多次写入组合起来,以减少系统调用次数,从而提高性能(。
如果你坚持通过返回false来处理错误,你可以添加一个catch子句:
public static boolean saveStringToFile(String fileName, String text) {
try (Writer w = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
w.write(text);
return true;
} catch (IOException e) {
return false;
}
}
这样就可以了。如果您想管理具有复杂行为的异常,请创建StreamWriter
public static bool saveStringToFile(String fileName, String text)
{
try
{
File.WriteAllText(fileName, text, Encoding.UTF8);
}
catch (IOException exp)
{
return false;
}
return true;
}
那么,问题是什么?没有对错之分。关闭甚至可以引发IO异常吗?那你干什么?一般来说,我喜欢任何形式的不反思——一点也不。
问题是——你只是在关闭时吞下一个IO异常——很好。你能忍受这种吹风吗?如果不是,你有问题,如果是——没有错。
我从来没有这么做过,但是——再说一遍,这取决于你的商业案例。
arch = new File("path + name");
arch.createNewFile();
FileOutputStream fos = new FileOutputStream(arch);
fos.write("ur text");
fos.close();
我的方式。
避免这种情况的最佳方法是将out.close((放在out.flush((之后,如果关闭失败,则会自动处理该过程。或者使用这个更好(我正在使用的(:
File file = ...
OutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream(file));
...
finally {
if (out != null) {
out.close();
}
}
}
如果您想要最少的代码,可以使用FileUtils.writeStringToFile
FileUtils.writeStringToFile(new File(fileName), text);
我不会使用布尔值,因为忽略发生错误的事实或异常消息中发生错误的原因是个好主意。使用选中的Exception可以确保调用方始终正确处理此类错误,并可以记录有意义的错误消息以说明原因。
使用特定的CharSet 保存文件
try {
FileUtils.writeStringToFile(new File(fileName), text, "UTF-8");
} catch(IOException ioe) {
Logger.getLogger(getClass()).log(Level.WARNING, "Failed to write to " + fileName, ioe);
}