C# 释放资源时,尝试…最终捕获内部?
我想将C# 释放资源时,尝试…最终捕获内部?,c#,java,programming-languages,C#,Java,Programming Languages,我想将字符串写入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 Output
字符串
写入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#进行比较:
甚至try..catch
表单将是:
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#和.Net世界。但这是将字符串写入文件的正确方法吗?对于这样简单的任务来说,代码太多了。在C#中,我会说只需
out.close()就是这样,但在finally
语句中添加try..catch
似乎有点奇怪。我添加了finally
语句来关闭文件(资源),无论发生什么情况。避免使用太多资源。在Java中这是正确的方法吗?如果是这样,为什么close
抛出异常?那么,问题是什么?没有对错之路。close甚至可以引发IO异常吗?那你怎么办?我通常不喜欢任何形式的再催促,一点也不喜欢
问题是-你只是在关闭时吞下一个IO异常-很好。你能忍受那阵风吗?如果不是,你有问题,如果是-没有问题
我从来没有这样做过,但是,这取决于您的业务情况。是的,java中的Try-catch inside finally()并没有什么奇怪之处。close()可能由于各种原因引发IoException,这就是为什么它必须被try-catch块包围。在最新的JavaSE7中,有一个改进的解决方案可以解决您的这个问题
我的方式。这应该能奏效。如果要管理行为复杂的异常,请创建StreamWriter
public static bool saveStringToFile(String fileName, String text)
{
try
{
File.WriteAllText(fileName, text, Encoding.UTF8);
}
catch (IOException exp)
{
return false;
}
return true;
}
避免这种情况的最好方法是将out.close()放在out.flush()之后,如果关闭失败,进程将自动处理。或者使用这个更好(我正在使用的):
您是正确的,因为您需要在finally块中调用close(),并且还需要包装这是一个try/catch
通常,您会在项目中编写实用程序方法,或者使用库中的实用程序方法,例如:。忽略close()中的任何抛出异常
另一方面,Java 7增加了对try with resources的支持,如果您希望使用最少的代码,则无需手动关闭资源
我不会使用布尔值,因为忽略错误发生的事实或异常消息中出现错误的原因很少是一个好主意。使用选中的异常可以确保调用方始终正确处理此类错误,并可以记录有意义的错误消息,说明原因
使用特定字符集保存文件的步骤
try {
FileUtils.writeStringToFile(new File(fileName), text, "UTF-8");
} catch(IOException ioe) {
Logger.getLogger(getClass()).log(Level.WARNING, "Failed to write to " + fileName, ioe);
}
与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;
}
}
虽然我对java很生疏,但我认为代码是正确的。捕捉out.Close()“代码>不是强制性的,但最好能抓住每一个可能的错误”。@TimSchmelter抱歉搞混了。代码在Java
中,而不是c
中。我编辑了我的问题。在c#中,它比你提到的还要简单<代码>文件.WriteAllText(路径,文本)代码>这就是伊藤,Java。这么多的行只需要这么少的东西…@mikeTheLiar不幸的是,我不得不在我的项目中使用Java。我只是喜欢C。对Java的Unicode支持非常糟糕:(在这种情况下,如果flush
抛出异常,文件会被关闭吗?此代码在C
中。我在Java
中寻找类似的东西,这是C,对不起,我误解了你。我以为你的问题是基于Java编写C代码。我会更新我的答案的。谢谢。没有必要。我的问题是关于st语言设计结构。好的,我明白了。@bstick12给出了一个很好的答案。与C#相比,Java确实有时会给开发人员带来更多的工作。希望Java开发人员不要因为这些词而追求我。你在这里没有发现任何例外。我只想得到false
,而不是异常
(错误处理).@AlirezaNoori为什么你想要一个布尔值,因为你必须检查它,或者冒着忽略它的风险?你最好抛出异常,这样它才会被检查。+1我的问题是,这种编程可能会产生极其复杂的代码。正如你所看到的,如此小的工作量产生了大量的噪音。假设我有两个资源,它们是我可以说,在finally
中不应该有可能引发某些异常的函数调用。是的,我同意,因此在最新的java SE 7中有一个改进的解决方案。啊哈!这正是我想要的。谢谢。请将此链接添加到您的答案中。大多数p人们不阅读评论。有人会怎么做?我无法关闭文件。我无能为力(除了一次又一次地尝试…).我想说close
方法的实现方式应该是释放句柄。.net
人们做了什么?这是正确的方式。我只是好奇也许我做错了什么。幸运的是@codeMan的链接显示java
人们正在努力解决这个问题。我不确定有没有正确的方法。这取决于您的业务方面。在我的代码中,写入失败将被忽略。在这种特殊情况下使用错误处理不会损害我的项目。此外,错误将被记录(我删除了该错误以简化问题中的代码).BTW,这是否会将字符串
保存在UTF-8
中?如果这是默认字符编码,它将是UTF-8。如果您特别想要UTF-8,您可以
FileUtils.writeStringToFile(new File(fileName), text);
try {
FileUtils.writeStringToFile(new File(fileName), text, "UTF-8");
} catch(IOException ioe) {
Logger.getLogger(getClass()).log(Level.WARNING, "Failed to write to " + fileName, ioe);
}
public static void saveStringToFile(String fileName, String text) throws IOException {
try (Writer w = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
w.write(text);
}
}
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;
}
}