在java中编辑现有的txt文件

时间:2016-05-16 21:34:58

标签: java file io

我有类帐户,其中包含用户名,完整名称,密码,ID和点数。 所有帐户都保存在一个文件中。我的文件中有很多帐户,而不只是一个帐户。这是文本文件中一个帐户的示例。

Miljan9602 Rakita Miljan miljan123 1463433398614 0.0

用户名,全名,密码,ID和分数

现在,例如,如果我想更改用户名的分数。我要做的第一件事是浏览文件中的所有行并比较所有用户名,如果我找到相同的用户名。我会改变点。这是我的想法如何做到这一点。只是不知道如何在文件中编辑它。

public void edit(String username, double points)
{
    File f = new File("Accounts.txt");

    // file doesnt exist, return from method
    if(!f.exists())
        return;
    Scanner sc = null;

    try
    {
        sc = new Scanner(f);

        while(sc.hasNextLine())
        {
            String line = sc.nextLine(); // Take whole line
            String split[] = line.split(" "); // Split it so i can check username

            if(split[0].equals(username))
            {
                String change = Double.toString(points); // Make string from double
                split[5] = change; // on fifth index are points

                /* My question is now how to edit file and to replace my new points
                 * with old points ?
                 *  Miljan9602 Rakita Miljan miljan123 1463433398614 0.0 <- Need to change this 0.0 with split[4];
                 */
            }
        }
    }catch(Exception e)
    {
        e.printStackTrace();
    }finally{
        // finally will always close file
        sc.close();
    }

3 个答案:

答案 0 :(得分:0)

您可以使用Apache's Commons IO库。你可以在那里找到你需要的一切,甚至更多。此外,here是Commons IO的GitHub镜像。值得一看。

答案 1 :(得分:0)

{
File f = new File("Accounts.txt");

FileWriter fw = new FileWriter(f);
// file doesnt exist, return from method
if(!f.exists())
    return;
Scanner sc = null;

try
{
    sc = new Scanner(f);

    while(sc.hasNextLine())
    {
        String line = sc.nextLine(); // Take whole line
        String split[] = line.split(" "); // Split it so i can check username
        if(split[0].equals(username))
        {
            String change = Double.toString(points); // Make string from double
            split[5] = change; // on fifth index are points

            /* My question is now how to edit file and to replace my new points
             * with old points ?
             *  Miljan9602 Rakita Miljan miljan123 1463433398614 0.0 <- Need to change this 0.0 with split[4];
             */
            for(int i = 0; i < spit.length(); i++{
                fw.write(split[i] + " ");
            }
            System.getProperty("line.separator");
        }
    }
}catch(Exception e)
{
    e.printStackTrace();
}finally{
    // finally will always close file
    sc.close();
    fw.close();
}

这应该有效

答案 2 :(得分:0)

由于必须将整个读取文本写回文件系统,因此请使用Files.readAllLines()

Path path = Paths.get(".../Accounts.txt");
Charset charset = StandardCharsets.UTF_8;
List<String> lines = new ArrayList<>();
if (Files.exists()) {
    Files.readAllLines(path, charset);
    for (int i = 0; i < lines.size(); ++i) {
        String split[] = lines.get(i).split(" ");

        if (split[0].equals(username)) {
            String change = String.valueOf(points);
            split[5] = change; // on fifth index are points
            StringBuilder sb = new StringBuilder();
            for (String value : split) {
                if (sb.length() != 0) {
                    sb.append(' ');
                }
                sb.append(value);
            }
            lines.set(i, sb.toString()); // Changes the line.
            Files.write(path, lines, charset);
            break; // leave loop
        }
    }
}

更多解释

要更改文本文件的单行,原则上必须加载整个文本,并在更改行后,完全保护它。 原因是文件可能会缩小或增长,具体取决于行的更改。 即使有一些曲折,这也不是最佳选择。 Files.readAllLines是一个不错的方法。人们也可能会改变格式:

  • 固定长度记录(行)允许RandomAccessFile。但是,文本可能会被手动编辑,因此文件会损坏,而且字段长度也有限。
  • .properties 格式允许使用Properties类进行访问。要求是关键,格式为key = value。此外,文本还有一些转义(\)。

可以将Accounts.txt保留在核心中,比如在类帐户中,将所有内容表示为从用户名到帐户的映射。

class Account {
    public final String userName; // Unmodifiable key
    public String password;
    ...
}
class Accounts {
    private Map<String, Account> accountsByUserName = new HashMap<>();
    public void loadAccounts() throws IOException { ... }
    public void saveAccounts() throws IOException { ... }
    public Optional<Account> getAccountByUserName(String userName) { ... }
    public void deleteAccountByUserName(String userName) { ... }
    public void createAccount(Account account) throws AlreadyExistsException { ... }
}