2013-01-23 37 views
7

我正在逐行读取一个文件,并且我正在尝试使它符合我的特定参数(在我的情况下,如果它以某个词),我可以覆盖该行。在java中同时读取和写入文件

我当前的代码:

try { 
    FileInputStream fis = new FileInputStream(myFile); 
    DataInputStream in = new DataInputStream(fis); 
    BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
    String line; 

    while ((line = br.readLine()) != null) { 
     System.out.println(line); 
      if (line.startsWith("word")) { 
       // replace line code here 
      } 
    } 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

...其中myFileFile对象。

像往常一样,任何帮助,例子或建议,非常感谢。

谢谢!

+1

为什么不一次读取整个文件,关闭它,打开它进行写入,然后在对它执行转换后写出每一行? – Patashu

+1

@Patashu如果它是一个大文件呢,那么我提出的方法会更好。 – iphonedev7

+0

请不要使用DataInputStream来读取文本http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

回答

4

这里最好的办法是将文件读入内存(例如StringBuilder),然后将你想要的输出文件写入StringBuilder。完成文件读取后,您需要将StringBuilder的内容写入文件。

如果文件太大而无法在内存中完成此操作,则可以始终逐行读入文件的内容,并将它们写入临时文件而不是StringBuilder。完成之后,您可以删除旧文件并将临时文件移动到原位。

+0

好主意......我会尝试出。 – iphonedev7

12

RandomAccessFile似乎很适合。它的javadoc说:这个类支持读取和写入随机访问文件的

实例。随机访问文件的行为与存储在文件系统中的大量字节相同。有一种游标或指向隐含数组的索引,称为文件指针;输入操作从文件指针开始读取字节,并使文件指针超过读取的字节。如果随机访问文件是以读/写模式创建的,则输出操作也可用;输出操作从文件指针开始写入字节,并使文件指针超过写入的字节。写入隐含数组的当前末尾的输出操作会导致数组扩展。文件指针可以通过getFilePointer方法读取并通过seek方法设置。

这就是说,由于文本文件是一个连续的文件格式,你不能代替用线不同长度的线路没有走动所有后续字符,所以更换线路一般将量阅读和写作整个文件。如果您写入单独的文件,这可能会更容易完成,并在完成后重命名输出文件。如果出现错误,这也更加稳健,因为人们可以简单地重试初始文件的内容。 RandomAccessFile的唯一优点是您不需要临时输出文件的磁盘空间,并且由于更好的访问局部性,可能会在磁盘之外获得稍好的性能。

+0

@MelNicholson有用的信息。谢谢。 – iphonedev7

+0

这应该是被接受的答案。 – Makaveli84