如何/何时删除java中的文件?
问题是,用户单击JSP中的一个按钮,它将导出显示的数据。所以我要做的是,创建一个临时工。文件并在其中写入内容[resultSet>>xml>>csv],然后将内容写入ServletResponse。关闭响应输出流后,我尝试删除该文件,但每次都返回false 代码如何/何时删除java中的文件?,java,file,jsp,jakarta-ee,Java,File,Jsp,Jakarta Ee,问题是,用户单击JSP中的一个按钮,它将导出显示的数据。所以我要做的是,创建一个临时工。文件并在其中写入内容[resultSet>>xml>>csv],然后将内容写入ServletResponse。关闭响应输出流后,我尝试删除该文件,但每次都返回false 代码 我使用了“file.deleteOnExit();”和file.delete();但是它们都不起作用。您确实不想为请求创建临时文件。尽可能将生成的CSV保存在内存中 您可能需要将文件的写入与输出直接联系起来。所以,解析结果集的一行,将其
我使用了“file.deleteOnExit();”和file.delete();但是它们都不起作用。您确实不想为请求创建临时文件。尽可能将生成的CSV保存在内存中 您可能需要将文件的写入与输出直接联系起来。所以,解析结果集的一行,将其写入响应流,解析下一行,依此类推。这样,一次只在内存中保留一行。问题是响应可能会超时
如果您想要一个快捷方式方法,请查看。这使得在一个表中显示一组结果,然后向所述表中添加预构建的结果变得非常容易。CSV是这些选项之一。您确实不想为请求创建临时文件。尽可能将生成的CSV保存在内存中 您可能需要将文件的写入与输出直接联系起来。所以,解析结果集的一行,将其写入响应流,解析下一行,依此类推。这样,一次只在内存中保留一行。问题是响应可能会超时 如果您想要一个快捷方式方法,请查看。这使得在一个表中显示一组结果,然后向所述表中添加预构建的结果变得非常容易。CSV是这些选项之一。file.deleteOnExit()不会产生您想要的结果-它的目的是在JVM退出时删除该文件-如果这是从servlet调用的,则意味着在服务器关闭时删除该文件 至于为什么file.delete()不起作用——我在这段代码中看到的只是从文件中读取数据并写入servlet的输出流——当您将数据写入文件时,是否可能使文件的输入流保持打开状态?如果文件当前正在使用,则不会将其删除 此外,即使您的方法抛出IOException,如果在访问文件时出现异常,您仍然需要清理这些内容-将文件操作放入try块,并将stream.close()放入finally块。file.deleteOnExit()它不会产生您想要的结果-它的目的是在JVM退出时删除文件-如果这是从servlet调用的,这意味着在服务器关闭时删除文件 至于为什么file.delete()不起作用——我在这段代码中看到的只是从文件中读取数据并写入servlet的输出流——当您将数据写入文件时,是否可能使文件的输入流保持打开状态?如果文件当前正在使用,则不会将其删除 此外,即使您的方法抛出IOException,如果在访问文件时出现异常,您仍然需要清理这些内容-将文件操作放入try块,并将stream.close()放入finally块。不要创建该文件。 将数据直接从结果集写入CSV ResponseOutput流。 这样可以节省时间、内存、磁盘空间和令人头痛的问题 如果您确实需要它,请尝试使用File.createTempFile()方法。 如果这些文件以前没有被删除过,当您的虚拟机正常停止时,它们将被删除。不要创建该文件。 将数据直接从结果集写入CSV ResponseOutput流。 这样可以节省时间、内存、磁盘空间和令人头痛的问题 如果您确实需要它,请尝试使用File.createTempFile()方法。
这些文件将在VM正常停止时被删除,如果它们以前没有被删除过。您如何创建该文件。您可能需要使用
您应该能够很好地删除临时文件(不需要deleteOnExit)。当您试图删除该文件时,是否确定该文件未被使用?每个用户请求都应该有一个文件(这是避免使用临时文件并将所有内容存储在内存中的另一个原因)。如何创建文件。您可能需要使用
您应该能够很好地删除临时文件(不需要deleteOnExit)。当您试图删除该文件时,是否确定该文件未被使用?每个用户请求应该有一个文件(这是避免使用临时文件并将所有内容存储在内存中的另一个原因)。我假设您在这里遇到了某种并发问题。考虑使此方法非静态,并为您的临时文件使用唯一名称(如追加当前时间,或使用文件名的GUID)。很可能是您正在打开文件,然后其他人打开了它,因此第一次删除失败。我假设您在这里遇到了某种并发问题。考虑使此方法非静态,并为您的临时文件使用唯一名称(如追加当前时间,或使用文件名的GUID)。很可能是您正在打开文件,然后其他人打开了它,因此第一次删除失败。您可以尝试删除。这些缓冲区需要两个线程,一个用于向管道提供数据(导出器),另一个(servlet)用于使用管道中的数据并将其写入响应输出流,您可以尝试执行以下操作。这些缓冲区需要两个线程,一个用于向管道提供数据(导出器),另一个(servlet)用于使用管道中的数据并将其写入响应输出流,正如我看到的,您没有关闭DataInputStream dis-当您确实要删除文件时,这将导致错误状态。此外,您应该在try-catch-finally块中处理流,并在finally中关闭它们。代码有点粗糙,但它是安全的:
DataInputStream dis = null;
try
{
dis = new DataInputStream(new FileInputStream(
file));
... // your other code
}
catch(FileNotFoundException P_ex)
{
// catch only Exceptions you want, react to them
}
finally
{
if(dis != null)
{
try
{
dis.close();
}
catch (IOException P_ex)
{
// handle exception, again react only to exceptions that must be reacted on
}
}
}
在我看来,当您确实要删除文件时,您并没有关闭DataInputStream dis-这将导致错误状态。此外,您应该在try-catch-finally块中处理流,并在finally中关闭它们。代码有点粗糙
DataInputStream dis = null;
try
{
dis = new DataInputStream(new FileInputStream(
file));
... // your other code
}
catch(FileNotFoundException P_ex)
{
// catch only Exceptions you want, react to them
}
finally
{
if(dis != null)
{
try
{
dis.close();
}
catch (IOException P_ex)
{
// handle exception, again react only to exceptions that must be reacted on
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/csv");
response.setCharacterEncoding("UTF-8");
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
PrintWriter writer = response.getWriter();
try {
connection = database.getConnection();
statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
statement.setFetchSize(Integer.MIN_VALUE);
resultSet = statement.executeQuery("SELECT col1, col2, col3 FROM tbl");
while (resultSet.next()) {
writer.append(resultSet.getString("col1")).append(',');
writer.append(resultSet.getString("col2")).append(',');
writer.append(resultSet.getString("col3")).println();
// Note: don't forget to escape quotes/commas as per RFC4130.
}
} catch (SQLException e) {
throw new ServletException("Retrieving CSV rows from DB failed", e);
} finally {
if (resultSet != null) try { resultSet.close; } catch (SQLException logOrIgnore) {}
if (statement != null) try { statement.close; } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close; } catch (SQLException logOrIgnore) {}
}
}