【问题标题】:How can I write to a specific line number in a txt file in Java如何在 Java 中写入 txt 文件中的特定行号
【发布时间】:2014-11-01 02:43:01
【问题描述】:

我目前正在为学校编写我的项目,其中需要我读写 txt 文件。我可以正确阅读它们,但我只能在最后从附加的 FileWriter 写入它们。我希望能够通过首先删除行上的数据然后写入新数据来覆盖行号上的 txt 文件中的内容。我尝试使用这种方法...

public void overWriteFile(String dataType, String newData) throws IOException
{
    ReadFile file = new ReadFile(path);
    RandomAccessFile ra = new RandomAccessFile(path, "rw");
    int line = file.lineNumber(path, dataType);
    ra.seek(line);
    ra.writeUTF(dataType.toUpperCase() + ":" + newData);
}

但我相信 seek 方法以字节而不是行号移动。任何人都可以帮忙。在此先感谢:)

附: file.lineNumber 方法返回旧数据所在的确切行,因此我已经有了需要写入的行号。

编辑:找到解决方案!谢谢大家:)如果有人感兴趣,我会在下面发布解决方案

public void overWriteFile(String dataType, String newData, Team team, int dataOrder) throws IOException
{
    try
    {
        ReadFile fileRead = new ReadFile(path);
        String data = "";
        if(path == "res/metadata.txt")
        {
            data = fileRead.getMetaData(dataType);
        }
        else if(path == "res/squads.txt")
        {
            data = fileRead.getSquadData(dataType, dataOrder);
        }
        else if(path == "res/users.txt")
        {
            data = fileRead.getUsernameData(dataType, dataOrder);
        }
        else if(path == ("res/playerdata/" + team.teamname + ".txt"))
        {
            //data = fileRead.getPlayerData(dataType, team.teamname, dataOrder);
        }
        BufferedReader file = new BufferedReader(new FileReader(path));
        String line;
        String input = "";
        while((line = file.readLine()) != null)
        {
            input += line + '\n';
        }
        input = input.replace(dataType.toUpperCase() + ":" + data, dataType.toUpperCase() + ":" + newData);
        FileOutputStream out = new FileOutputStream(path);
        out.write(input.getBytes());
    }
    catch(Exception e)
    {
        System.out.println("Error overwriting file: " + path);
        e.printStackTrace();
    }
}

【问题讨论】:

  • 如果不知道每行的长度,就不能随机访问给定的行。只需复制所有行,直到您要查找的那一行,然后写下它的替换,然后再写其余的行。
  • 如果您找到了解决方案 - 与其在问题中发布,不如将其发布为您问题的答案。

标签: java file text file-io randomaccessfile


【解决方案1】:

这里有一个类似这样的问题的链接,答案很好: I want to open a text file and edit a specific line in java

基本上,您不能只编辑该行,除非它的长度完全相同。

相反,您需要复制每一行,然后当您到达要更改的行的行号时,而不是复制旧行,只需放入新行即可。

我给你的链接有一个很好的例子来说明如何做到这一点。

我希望这会有所帮助...如果没有,请告诉我,我会在帖子中进一步详细说明。祝你好运:)

【讨论】:

    【解决方案2】:

    一种快速而肮脏的解决方案是使用Files.readAllLinesFiles.write 方法读取所有行,更改您要更改的行,然后覆盖整个文件:

    List<String> lines = Files.readAllLines(file.toPath());
    lines.set(line, dataType.toUpperCase() + ":" + newData);
    Files.write(file.toPath(), lines); // You can add a charset and other options too
    

    当然,如果文件非常大,这不是一个好主意。有关在这种情况下如何逐行复制文件的一些想法,请参阅this answer

    但是,无论您如何操作,如果您要更改行的字节长度,您将需要重写整个文件 (AFAIK)。 RandomAcessFile 允许您在文件中移动并覆盖数据,但不能插入新字节或删除现有字节,因此文件的长度(以字节为单位)将保持不变。

    【讨论】:

    • 好吧,您当然不需要复制相关行之前的数据。它之后的数据需要通过编辑引入的差异来移动。如果文件很大并且编辑的行接近尾声,它可能会得到回报。如果文件太大以至于额外的工作副本不适合磁盘,这可能是至关重要的。
    猜你喜欢
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    相关资源
    最近更新 更多