当我的程序启动时,它会打开一个文件并定期写入。(它不是日志文件;它是程序的输出之一。)我需要让文件在程序的长度内可用,但我不需要做任何特别的事情来结束文件;把它关上。
我认为,对于Java中的文件I/O,我应该实现可自动关闭的,并将其封装在一个try-with-resources块中。然而,因为这个文件是长期存在的,并且是该程序的少数输出之一,我发现很难组织事情,使我打开的所有文件都包装在try-with-resources块中。此外,顶级类(mymain()
函数所在的地方)不知道这个文件。
这是我的代码;注意缺少编写器。close():
public class WorkRecorder {
public WorkRecorder(String recorderFile) throws FileNotFoundException {
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(recorderFile)));
}
private Writer writer;
public void record(Data data) throws Exception {
// format Data object to match expected file format
// ...
writer.write(event.toString());
writer.write(System.lineSeparator());
writer.flush();
}
}
tl;我需要实现自动关闭并调用写入程序吗。close()如果资源是打开的输出文件,并且在程序完成之前我永远不需要关闭它?我可以假设JVM和操作系统(Linux)会自动为我清理吗?
奖金(?):我在C#'s的IDisposeable中也遇到了这个问题。使用块,就像Java的try-with-resources构造一样,当我有要打开的东西,快速做一些事情,然后马上关闭时,这是一个很好的特性。但通常情况并非如此,尤其是对于文件,当对该资源的访问挂起一段时间时,或者当需要管理多个这样的资源时。如果我的问题的答案是“始终使用资源块进行尝试”,那么我又被卡住了。
我(现在)认为更好的答案是“视情况而定”:-。Lukas Eder在此提供了详细的处理。同时查看Lambda EG小组帖子。
但一般来说,在使用完资源后,最好将其返回到操作系统,并始终使用“尝试使用资源”(除非您知道自己在做什么)。
您应该始终关闭资源或将它们设置为空,这样垃圾收集器就可以在Java中拾取它。使用尝试资源块是让Java在完成资源后自动关闭资源的好方法。即使您在程序期间使用它,即使在最后也关闭它也是很好的编程实践。有些人可能会说你不需要,我个人会说继续做吧,原因如下:
当不再需要流时,请始终使用close()方法将其关闭,或使用try-with-resource语句将其自动关闭。不关闭流可能会导致输出文件中的数据损坏或其他编程错误
-《Java编程导论》第10版,梁
如果可能,只需在程序末尾的资源上运行。
我有类似的代码,它不适合包装在try-with-资源语句中。我认为这很好,只要您在程序完成时关闭它。
只要确保您考虑到可能发生的任何异常。例如,在我的程序中,有一个当程序关闭时调用的方法。这将调用writer。close()。如果有任何异常行为会导致程序关闭,则也称为。
如果这只是一个简单的程序,并且您希望编写器在其持续时间内处于打开状态,我认为当程序终止时不关闭它真的没什么大不了的。。。但是,确保您的资源已关闭是一种很好的做法,因此我将继续并将其添加到您的程序可能关闭的地方。
问题内容: 我在我的一个Java应用程序中使用Socket通信。据我所知,如果程序遇到任何异常终止,侦听端口不会关闭,并且由于报告“端口已打开。”而无法重新启动该程序。处理这个问题?处理此问题的一般方法是什么? 问题答案: 听起来您的程序正在套接字上侦听。通常,当程序退出时,操作系统会关闭所有可能打开的套接字(包括侦听套接字)。但是,对于侦听套接字,操作系统通常在程序退出后将端口保留一段时间(几分
我正在尝试使用WorkManager每10秒运行一个简单的工作。当应用程序在后台或前台运行时,它可以完美地工作。当我关闭应用程序(杀死应用程序)时,工作将不再被调用。 我在创建MainActivity时调用以下代码 工人阶级 这些代码在我的应用程序未关闭时运行良好。 我如何让它运行,即使应用程序关闭?
https://developer.android.com/codelabs/build-your-first-android-app#1 该网站第8页第3.3步说:“在FirstFragment类中,添加采用单个视图参数的方法countMe()。单击Count按钮并调用click listener时,将调用此方法。”但是我在哪里添加这个函数呢?在这里输入图像描述 这个地方是正确的吗?如果它是正确
问题内容: 我找到了终止(关闭或停止)Java程序的方法。我找到了两个解决方案。 使用 return; 当我想退出或终止程序执行时,添加它。 使用 System.exit() ; 有时我用它。我从This Question中了解了 Sytem.exit()。 所以,我对他们都了解一点。但是我仍然对它们的实际工作方式感到困惑。请检查以下代码… 我确定 2不会出现。我想知道为什么或其他代码可以在的语句
我正在使用一个Windows可执行文件来完成一些优化任务。此可执行文件从Windows命令提示符(cmd)运行。它读取一个批处理文件,该文件告诉它如何运行一个模型接口(它将需要多次运行它),该模型接口读取和写入文本文件,以便在它和optimisation.exe程序之间输入/输出。这个模型接口是用java编写的,并且已经编译成功。我的批处理文件如下所示: 我的问题是,我正在运行的可执行文件需要知道
输出:pool-2=线程-1 pool-3=线程-1,pool-4=线程-1............. 我想要池-2=线程-1池-2=线程-1池-2=线程-1................ Threadpool不能从method()放到外部,每次都需要创建新的Threadpool。我可以完全终止线程池吗? 有什么需要帮忙的吗