【问题标题】:writing temporary files in Tomcat在 Tomcat 中写入临时文件
【发布时间】:2012-09-20 13:26:49
【问题描述】:

我需要创建临时目录,但是当我尝试在临时目录中创建文件时,总是被拒绝访问。

java.io.FileNotFoundException: C:\tmpDir7504230706415790917 (Access Denied)

这是我的代码:

public static File createTempDir() throws IOException {
    File temp = File.createTempFile("tmpDir", "", new File("C:/"));

    temp.delete();
    temp.mkdir();
    return temp;
}

public File createFile(InputStream inputStream, File tmpDir ) {
    File file = null;
    if (tmpDir.isDirectory()) {
        try {
            file = new File(tmpDir.getAbsolutePath());
            // write the inputStream to a FileOutputStream
            OutputStream out = new FileOutputStream(file);

            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = inputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }

            inputStream.close();
            out.flush();
            out.close();

            System.out.println("New file created!");
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } 
    }
    return file;
}

我正在开发一个 Web 应用程序,并且正在使用 tomcat。有没有办法在tomcat服务器内存上创建临时文件?我知道这很奇怪,但我不知道……也许有可能。

【问题讨论】:

  • 尝试使用 ByteArrayOutputStream 类而不是 FileOutputStream,这样您就可以将数据写入内存中的缓冲区,而无需使用文件。虽然我不懂 Java,所以无法提供更多帮助。
  • @Oscar 在 ByteArrayOutputStream 中写入数据后,我可以将其转换为文件吗?
  • “Tomcat 服务器内存”与您的问题有什么关系?
  • @EJP 我的意思是有一种方法可以使用 tomcat 上传 java.io.File 然后使用它,就像使用 tomcat 临时存储文件并在使用后删除它们一样。非常感谢
  • 换句话说,内存与它无关。您正在寻找一种存储临时文件的方法。我建议你修改你的标题和文字。

标签: java tomcat file-io temporary-files


【解决方案1】:

您可以使用 Tomcat 的临时文件夹。
如果你使用

<%=System.getProperty("java.io.tmpdir")%>  

在 JSP 中你可以得到它的路径。

【讨论】:

  • 你仍然可以使用Tomcat的临时文件夹。
  • 但是 java.io.tmpdir 是用于 windows 的
  • java.io.tmpdir 是系统属性。
【解决方案2】:

代码中的这一行表示在目录“C:\”中创建一个名称以文本“tmpDir”开头的文件。这不是你想要的。

File temp = File.createTempFile("tmpDir","",new File("C:/"));

操作系统正确地不允许这样做,因为 C:\ 是受保护的目录。请改用以下内容:

File temp = File.createTempFile("tmp",null);

这将使 Java 确定适当的临时目录。您的文件将具有简单的前缀“tmp”,后跟一些随机文本。您可以将“tmp”更改为对您的应用有意义的任何内容,以防您需要手动清除这些临时文件并且希望能够快速识别它们。

【讨论】:

  • 我试过了,但我得到了这个 java.io.FileNotFoundException: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\tmpDir8076115893277193438.tmp(拒绝访问)
  • 我想我看到了问题所在。你的哪一行代码导致了这个错误?
  • 放眼大局,我认为 rickz 有所作为。您不需要任何此代码来创建临时目录。只需使用系统定义的临时目录。但是,如果您仍想使用该代码,则需要将“return temp”更改为“return temp.getParentFile()”。您的方法返回的是文件(您刚刚删除)而不是目录。
  • 我改成这样: File temp = File.createTempFile("tmpDir","",new File("C://Documents and Settings//Administrateur//") );返回温度;拒绝访问错误消失,但文件未创建
  • 如果你使用user1657364第二行代码,那么将使用Tomcat的临时文件夹。
【解决方案3】:

由于默认权限设置,您通常无法直接写入C:\。我有时有这样做的许可问题。但是,您可以在用户文件夹中写入临时文件。通常,这在 XP 上是 C:\Documents and Settings\UserName\,在 vista 和 Windows 7 上是 C:\Users\UserName\。如果您想根据操作系统平台获取主目录,则来自 Apache Lang 的名为 SystemUtils 的工具非常有用。

例如:

SystemUtils.getUserDir();
SystemUtils.getUserHome();

更新

此外,您创建了一个临时文件对象,但您调用 mkdir 将其放入目录并尝试将文件写入该目录对象。您只能将文件写入目录,但不能写入目录本身。要解决这个问题,要么不要打电话给temp.mkdir();,要么把这个file=new File(tmpDir.getAbsolutePath());改成file=new File(tmpDir, "sometempname");

【讨论】:

  • 我同样的访问被拒绝了 :((
  • 目录是什么?您是否以拥有该目录的用户身份运行 tomcat?
  • @gigadot 提供的链接SystemUtils 已损坏。
【解决方案4】:

在安装了 tomcat7 的 Linux 上:

因此,如果您正在运行 Web 应用程序,这是 Tomcat 用于创建临时文件的临时目录。

TOMCAT_HOME/temp

在我的情况下 TOMCAT_HOME => /usr/share/tomcat7

如果你在没有tomcat的情况下运行Java程序,默认情况下它使用/tmp目录。

不确定它是否会影响,但我也运行了这个命令。

chmod 777 on TOMCAT_HOME/temp

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 2012-10-27
    • 2013-12-06
    • 2010-11-10
    • 1970-01-01
    • 2017-06-19
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多