如何在JAVA中使用文本文件追加到特定行?

时间:2017-07-10 07:46:15

标签: java arraylist

我为我的项目创建的系统将是Java中的课程注册系统。

我现在面临的问题是如何附加到特定行(我们可以说是参考学生ID),以便注册代码模块位于逗号后面的行后面。

每当我尝试追加时,它总会附加到文件的最后一行。

文本文件的示例:
Example of the text file

在注册模块之后,我还需要显示该特定学生的特定学生行的所有模块。

我一直在研究解决方案。 有人说,实现arrayList->文件/从文件中写入和读取数据会更容易。

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

首先阅读您的文件。

List<String> lines = Files.readAllLines(Paths.get("/path/to/your/file.txt"), StandardCharsets.UTF_8);

然后查找并修改您的行,在此示例中,我修改以&#34; 0327159&#34;开头的行。

List<String> toWrite = new ArrayList<>();

for(int i = 0; i<lines.size(); i++){
    String line = lines.get(i);
    if(line.startsWith("0327159")){
        String updated = line.trim() + ", more text\n";
        toWrite.add(updated);
    } else{
        toWrite.add(line);
    }
}

所以现在toWrite包含您要写入文件的所有行。

Files.write(
    Paths.get("/path/to/outfile.txt"), 
    toWrite, 
    StandardCharsets.UTF_8, 
    StandardOpenOptions.CREATE, 
    StandardOpenOptions.TRUNCATE_EXISTING );

答案 1 :(得分:0)

你应该尝试一种基于JSON的方法,使其不那么笨拙并消除混淆。这是一个有效的例子。我的代码每次都会添加一名新学生,并且每次都会向现有学生添加一个新模块。代码没有真正优化,因为这只是为了说明

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ModuleRegistration
{
    public static void main(String[] args) throws IOException
    {
        File file = new File("C:\\MyStudents.txt");
        if (!file.exists())
            file.createNewFile();

        List<String> lines = Files.readAllLines(Paths.get(file.getAbsolutePath()));
        ObjectMapper mapper = new ObjectMapper();
        List<StudentInfo> newLines = new ArrayList<StudentInfo>(2);
        for (String line : lines)
        {
            StudentInfo info = mapper.readValue(line, StudentInfo.class);
            String modules = info.getModules() == null ? "" : info.getModules();
            if (!"".equals(modules))
                modules += ",";
            modules += "Module" + System.currentTimeMillis();
            info.setModules(modules);
            newLines.add(info);
        }
        StudentInfo info = new StudentInfo();
        long time = System.currentTimeMillis();
        info.setId(time);
        info.setModules("Module" + time);
        info.setName("Name" + time);
        info.setPassword("Password" + time);
        info.setType("Local");
        newLines.add(info);

        try (FileWriter writer = new FileWriter(file, false);)
        {
            for (StudentInfo i : newLines)
            {
                writer.write(i.toString());
                writer.write(System.lineSeparator());
            }
        }

        System.out.println("Done");
    }

    static class StudentInfo
    {
        @JsonProperty("id")
        private long id;

        @JsonProperty("password")
        private String password;

        @JsonProperty("name")
        private String name;

        @JsonProperty("type")
        private String type;

        @JsonProperty("modules")
        private String modules;

        // getters and setters

        @Override
        public String toString()
        {
            try
            {
                return new ObjectMapper().writeValueAsString(this);
            }
            catch (JsonProcessingException exc)
            {
                exc.printStackTrace();
                return exc.getMessage();
            }
        }
    }
}