Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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_File Io_Overwrite_Read Write - Fatal编程技术网

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

在java中同时读取和写入文件,java,file,file-io,overwrite,read-write,Java,File,File Io,Overwrite,Read Write,我一行一行地读取一个文件,我试图使它,如果我得到一行符合我的特定参数(在我的情况下,如果它以某个单词开头),我可以覆盖该行 我当前的代码: try { FileInputStream fis = new FileInputStream(myFile); DataInputStream in = new DataInputStream(fis); BufferedReader br = new BufferedReader(new InputStreamReader(in)

我一行一行地读取一个文件,我试图使它,如果我得到一行符合我的特定参数(在我的情况下,如果它以某个单词开头),我可以覆盖该行

我当前的代码:

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();
}
…其中
myFile
File
对象

一如既往,我们非常感谢您提供的任何帮助、示例或建议


谢谢

您在这里的最佳选择可能是将文件读入内存(类似于
StringBuilder
),并将您希望输出文件的外观写入
StringBuilder
。在完全读取完文件后,您将希望将
StringBuilder
的内容写入该文件

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

似乎很合适。它的javadoc说:

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


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

最近解决了一个老问题。分享经验

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();
    }
}
import java.nio.charset.charset;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
公共静态void updateFile(路径文件){
//把所有的线都接过来
try(Stream=Files.lines(file,StandardCharsets.UTF_8)){
//进行更换操作
List List=stream.map(line->line.replaceAll(“测试”、“新建”)).collect(Collectors.toList());
//把内容写回去
文件.write(文件、列表、标准字符集.UTF_8);
}捕获(IOE异常){
e、 printStackTrace();
}
}

为什么不立即读取整个文件,关闭它,打开它进行写入,然后在对其执行转换后写出每一行?@Patashu如果它是一个大文件,那么我建议的方法会更好。请不要使用DataInputStream读取文本好主意…我会尝试一下。@Melnocholson很高兴知道。谢谢