在java中同时读取和写入文件

Posted

技术标签:

【中文标题】在java中同时读取和写入文件【英文标题】:Read and Writing to a file simultaneously in java 【发布时间】:2013-01-06 09:24:09 【问题描述】:

我正在逐行读取文件,并且我正在努力做到这一点,以便如果我到达适合我的特定参数的行(在我的情况下,如果它以某个单词开头),我可以覆盖那条线。

我当前的代码:

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 对象。

与往常一样,我们非常感谢任何帮助、示例或建议。

谢谢!

【问题讨论】:

为什么不一次读入整个文件,关闭它,打开它进行写入,然后在对其执行转换后写出每一行? @Patashu 如果它是一个大文件怎么办?那么我提出的方法会更好。 请不要使用DataInputStream读取文本vanillajava.blogspot.co.uk/2012/08/… 【参考方案1】:

RandomAccessFile 似乎很合适。它的 javadoc 说:

此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似于存储在文件系统中的大型字节数组。有一种游标,或隐含数组的索引,称为文件指针;输入操作从文件指针开始读取字节,并将文件指针推进超过读取的字节。如果随机存取文件是以读/写模式创建的,那么输出操作也是可用的;输出操作从文件指针开始写入字节,并将文件指针前进到写入的字节。写入隐含数组当前末尾的输出操作会导致数组被扩展。文件指针可以通过 getFilePointer 方法读取并通过 seek 方法设置。

也就是说,由于文本文件是一种顺序文件格式,如果不移动所有后续字符,就不能用不同长度的行替换一行,因此替换行通常相当于读取和写入整个文件.如果您写入单独的文件并在完成后重命名输出文件,这可能更容易完成。如果出现问题,这也更加健壮,因为可以简单地使用初始文件的内容重试。 RandomAccessFile 的唯一优点是您不需要临时输出文件的磁盘空间,并且由于更好的访问局部性,可能会从磁盘中获得更好的性能。

【讨论】:

@MelNicholson 很高兴知道。谢谢。【参考方案2】:

您最好的选择可能是将文件读入内存(类似于StringBuilder)并将您希望输出文件的外观写入StringBuilder。完全读完文件后,您需要将StringBuilder 的内容写入文件。

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

【讨论】:

好主意...我会试试看。【参考方案3】:

一个老问题,最近在研究这个。分享经验

import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public static void updateFile(Path file) 

    // Get all the lines
    try (Stream<String> stream = Files.lines(file,StandardCharsets.UTF_8)) 
        // Do the replace operation
        List<String> list = stream.map(line -> line.replaceAll("test", "new")).collect(Collectors.toList());
        // Write the content back
        Files.write(file, list, StandardCharsets.UTF_8);
     catch (IOException e) 
        e.printStackTrace();
    

【讨论】:

以上是关于在java中同时读取和写入文件的主要内容,如果未能解决你的问题,请参考以下文章

java能否读取csv文件的同时也写入数据?

java中可以允许多个流同时对文件进行操作吗?我有段代码出现问题,就是同时对一个文件建立读取流和写入流

java文件读写

如何同时读取和写入数据到同一个文件

Java用于读取和写入xlsx的内存不足错误

如何在 PyQt5 中同时读取和写入文件时正确执行多线程?