2009-02-21 63 views
2
public void exportUrlsToFile(String file, String urls) throws IOException { 
    String[] urlsArray = urls.split("\\s+");// split on one or more white space characters. 

    // create a fresh file 
    RandomAccessFile raf = new RandomAccessFile(file, "rw"); 

    for (String line : urlsArray) { 
     line = line.trim(); 
     if (line.isEmpty()) {// this won't happen! 
      continue; 
     } 
     raf.writeBytes(line); 
     raf.writeBytes(newline); 
    } 
    // close the file handler 
    raf.close(); 
} 

基本上我使用这个类来做一些事情。这是在tomcat JVM中运行的应用程序的一部分。我注意到,任何时候调用这个方法时,它会创建一个与参数名称相同的文件,然后在raf.close()之后,它仍然存在。 如何确保临时文件已被删除。Java RandomAccessFile

在此先感谢。

+0

奇怪...你想要什么文件? – OscarRyz 2009-02-21 02:31:27

回答

1

改为使用File.createTempFile()

我意识到,不会给你与RandomAccessFile相同的功能,但你可以建立你所需要的。

其实我甚至不确定你为什么要将这些东西写入文件。这是一种使用跟踪的东西吗?为什么不把它存储在内存中?

+0

这是一个struts web应用程序,为了让struts下载文件,您需要从文件中流式传输。我一直认为随机访问文件是用于创建文件的内存,而不用创建物理文件。 – samsina 2009-02-23 21:25:34

2

我打算假设你只显示了一小部分代码,并且有一个很好的理由,那就是你在使用RandomAccessFile时没有出现任何随机访问。

我会做这样的事情:

public void exportUrlsToFile(String file, String urls) throws IOException { 
    String[] urlsArray = urls.split("\\s+"); 

    // create a fresh file 
    RandomAccessFile raf = new RandomAccessFile(file, "rw"); 

    try { 
    for (String line : urlsArray) { 
     line = line.trim(); 
     if (line.isEmpty()) { // this won't happen! 
     continue; 
     } 
     raf.writeBytes(line); 
     raf.writeBytes(newline); 
    } 
    } finally { 
    // don't leak file handles on Exception -- put close in "try/finally" 
    try { raf.close(); } catch (IOException e) { /* ignore */ } 
    File todelete = new File(file); 
    if (!todelete.delete()) { 
     // Log a complaint that we couldn't delete the temp file 
    } 
    } 
} 

编辑:我同意,我们不希望在close()方法的理论IOException异常造成的问题。比忽略它更好的是记录一个“我们从未期望看到这个......”,但例外。我经常创建一个closeWithoutException()方法来包装它。理论上抛出IOException似乎是检查异常的滥用,因为没有任何事情可以让调用者做出响应。

5

一个更好的问题是,为什么你会想要经历所有制作文件,写入文件的事情,然后删除文件?

无论您不需要随机访问文件 - FileWriter会更好。

要确保文件被删除做埃迪表明,放在一个finnaly块删除 - 但你还需要确保raf.close()IOException异常的处理......这样的:

 
} finally { 
    try 
    { 
     raf.close(); 
    } 
    catch(final IOException ex) 
    { 
     // in 14 years of Java programming I still don't know what to do here! ;-) 
    } 
    finally 
    { 
     File todelete = new File(file); 
     if (!todelete.delete()) { 
      // Log a complaint that we couldn't delete the temp file 
     } 
    } 
} 

编辑:

您可能还意味着Tomcat进程完成后,该文件仍然存在,你想要它了。如果是这种情况请看java.io.File.deleteOnExit()。这应该在Tomcat JVM存在时删除这些文件。

+0

他他嘿嘿...大多数时候,你什么也没有做。 ... – OscarRyz 2009-02-21 02:30:23

0

你试过这个吗?

File temp = File.createTempFile("file", ".tmp"); 
temp.deleteOnExit();