在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很高兴知道。谢谢