Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何/何时删除java中的文件?_Java_File_Jsp_Jakarta Ee - Fatal编程技术网

如何/何时删除java中的文件?

如何/何时删除java中的文件?,java,file,jsp,jakarta-ee,Java,File,Jsp,Jakarta Ee,问题是,用户单击JSP中的一个按钮,它将导出显示的数据。所以我要做的是,创建一个临时工。文件并在其中写入内容[resultSet>>xml>>csv],然后将内容写入ServletResponse。关闭响应输出流后,我尝试删除该文件,但每次都返回false 代码 我使用了“file.deleteOnExit();”和file.delete();但是它们都不起作用。您确实不想为请求创建临时文件。尽可能将生成的CSV保存在内存中 您可能需要将文件的写入与输出直接联系起来。所以,解析结果集的一行,将其

问题是,用户单击JSP中的一个按钮,它将导出显示的数据。所以我要做的是,创建一个临时工。文件并在其中写入内容[resultSet>>xml>>csv],然后将内容写入ServletResponse。关闭响应输出流后,我尝试删除该文件,但每次都返回false

代码


我使用了“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) {}
    }
}