如何在java中重写文本文件的一行

如何在java中重写文本文件的一行,java,selenium,file-writing,Java,Selenium,File Writing,下图显示了我正在开发的web机器人的设置文件格式。如果您查看图像中的第31行,您将看到它显示chromeVersion。这样程序就知道要使用哪个版本的chromedriver。如果用户输入无效响应或将字段留空,程序将检测该响应并确定版本本身,并将其确定的版本保存到名为chromeVersion的字符串中。完成后,我想将该文件的第31行替换为 “(31)chromeVersion(76/77/78),如果您不知道此字段将在第一次运行bot时自动填充):“+chromeVersion 明确地说,我不

下图显示了我正在开发的web机器人的设置文件格式。如果您查看图像中的第31行,您将看到它显示
chromeVersion
。这样程序就知道要使用哪个版本的chromedriver。如果用户输入无效响应或将字段留空,程序将检测该响应并确定版本本身,并将其确定的版本保存到名为
chromeVersion
的字符串中。完成后,我想将该文件的第31行替换为

“(31)chromeVersion(76/77/78),如果您不知道此字段将在第一次运行bot时自动填充):“+chromeVersion

明确地说,我不想重写整个文件,我只想更改文本文件中分配给
chromeVersion
的值,或者用包含的版本重写该行

如有任何建议或方法,我们将不胜感激


您需要重写整个文件,但修改后文件的字节长度保持不变。由于不能保证会发生这种情况,或者发现这种情况太麻烦,因此这里有一个简单的程序:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

public class Lab1 {

    public static void main(String[] args)  {
            String chromVersion = "myChromeVersion";
        try {
            Path path = Paths.get("C:\\whatever\\path\\toYourFile.txt");
            List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
            int lineToModify = 31;
            lines.set(lineToModify, lines.get(lineToModify)+ chromVersion);
            Files.write(path, lines, StandardCharsets.UTF_8);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
import java.io.IOException;
导入java.nio.charset.StandardCharset;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.List;
公共类Lab1{
公共静态void main(字符串[]args){
字符串chromVersion=“myChromeVersion”;
试一试{
Path Path=Path.get(“C:\\whater\\Path\\toYourFile.txt”);
列表行=Files.readAllLines(路径,StandardCharsets.UTF_8);
int lineToModify=31;
lines.set(lineToModify,lines.get(lineToModify)+chromevision);
写入(路径、行、标准字符集.UTF_8);
}捕获(IOEX异常){
例如printStackTrace();
}
}
}

请注意,这不是处理非常大的文件的最佳方法。但是对于您拥有的小文件来说,这不是问题。

正确的方法是加载整个文件,进行更改,然后将其全部保存回去。在读取文件时,不能更改文件。有几种方法可以做到这一点,但您可以考虑使用属性文件。这样,您就有了密钥-值对,只需调用setProperty(String key,String value),如果密钥已经存在,java将更新该值:如果您要将密码和/或信用卡写入磁盘,请确保使用特定于保存它们的计算机的密钥对它们进行加密/解密。@pcalkins关于加密/解密,您有这方面的知识吗?或者我应该做一些研究吗?这是我用于加密/解密的内容:写时加密,加载时解密。您可以获取机器的序列号,并将其用作“密码”或作为“密码”的一部分。如果您知道行号,这很好。如果您知道该属性,您可以使用模式匹配检查列表中的每个项目,然后更改该元素并全部写回。
String lineToChange=lines.stream().filter(s->s.contains(“chromeVersion”)。findFirst().orElse(“”);如果(!lineToChange.isEmpty()){lines.set(lines.indexOf(lineToChange),detectedVer);}
@mavriksc感谢您的添加。谢谢,它工作得很好,我认为这样一个小文件不需要任何更复杂的东西。另外,如果我错了,请纠正我,这是因为
.readAllLines
导致
java.lang.OutOfMemoryError
是的,这是正确的。这种方法的问题是所有文件行都保存在内存中——如果文件足够大,这将很快导致OutOfMemoryError。为了避免这种情况,您需要使用一些流媒体技术/第三方库,如
Apache Commons IO
,它提供了一个允许处理每行的LineIterator,而无需保留对它们的引用——总之,不要将它们保留在记忆中。