根据Flag替换.txt文件中的行

时间:2016-05-09 23:06:07

标签: java file text bufferedreader overwrite

这个问题不同于通常的“我需要更换一行代码”的问题,至少我希望如此。

我想在一个名为accounts.txt的文本文件中编辑一行代码,而不是使用该行作为替换的标志,我需要使用它上面的行,因为文件的进展去“账号,平衡”。任何帮助表示赞赏!这是我到目前为止所拥有的。

public boolean modifyBalance(int accountNum, int newBalance) {
    try {
      FileReader fileReader = new FileReader("accounts.txt");
      BufferedReader file = new BufferedReader(fileReader);
      String line;
      String input = "";
      String flag;
      boolean foundFlag = false;
      Integer intInstance = accountNum;
      flag = intInstance.toString();

      while ((line = file.readLine()) != null) {
        input += line;
        if (line.equals(flag)) {
          file.readLine();
          input += "\n" + newBalance;
          foundFlag = true;
        }//end if
      }//end while
      return foundFlag;
    } //end try
    catch (IOException e) {
       System.out.println("Input Failure in Modify Balance of Account"       
                           + " Repository.");
       System.exit(0);
       return false;
     }
       // look up inObj in the text file and change the associated 
      // balance to newBalance
   }

2 个答案:

答案 0 :(得分:0)

以下是需要考虑的一些事项。

如果文件很小,您可以将整个内容读入字符串数组(查看Java 7 Files类的javadoc)。然后你可以向前和向后走阵列进行改变。然后将修改后的文件写回。

如果文件很大,你可以从输入读取并一次写一行临时文件(但延迟输出一行,这样你就可以触发输入标志)。然后删除旧的输入文件并重命名临时文件。

答案 1 :(得分:0)

这是一种方法。

<强>过程

- 将文件的所有行写成ArrayList

- 如果找到该标志,则标记该行号

- 如果您的行号不是-1,则找到该帐户,然后对ArrayList进行更改,并将所有行写回文件。

public boolean modifyBalance(int accountNum, int newBalance)
{
    int lineNumberOfAccount = -1;
    boolean foundFlag = false;
    BufferedReader file = null;

    List<String> fileLines = new ArrayList<String>();
    try
    {
        FileReader fileReader = new FileReader("accounts.txt");
        file = new BufferedReader(fileReader);
        String line;
        String input = "";
        String flag;

        Integer intInstance = accountNum;
        flag = intInstance.toString();

        int lineNumber = 0;

        while ((line = file.readLine()) != null)
        {
            fileLines.add(line);

            System.out.println(lineNumber + "] " + line);
            // input += line;
            if (line.equals(flag))
            {
                lineNumberOfAccount = lineNumber;
                foundFlag = true;
            } // end if

            lineNumber++;

        } // end while
    } // end try
    catch (IOException e)
    {
        System.out.println("Input Failure in Modify Balance of Account" + " Repository.");
        // don't exit here, you are returning false
        // System.exit(0);
        return false;
    }
    // Close the file handle here
    finally
    {
        if (file != null)
        {
            try
            {
                file.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
    // look up inObj in the text file and change the associated
    // balance to newBalance

    System.out.println("lineNumberOfAccount: " + lineNumberOfAccount);

    // found the account
    if (lineNumberOfAccount != -1)
    {
        int nextLine = lineNumberOfAccount + 1;

        // remove the old balance
        fileLines.remove(nextLine);

        // add the new balance
        fileLines.add(nextLine, String.valueOf(newBalance));

        System.out.println(fileLines);

        // write all the lines back to the file
        File fout = new File("accounts.txt");
        FileOutputStream fos = null;
        BufferedWriter bw = null;
        try
        {
            fos = new FileOutputStream(fout);

            bw = new BufferedWriter(new OutputStreamWriter(fos));

            for (int i = 0; i < fileLines.size(); i++)
            {
                bw.write(fileLines.get(i));
                bw.newLine();
            }
        }
        catch (IOException e)
        {
            System.out.println("Could not write to file");
            return false;
        }
        // Close the file handle here
        finally
        {
            if (bw != null)
            {
                try
                {
                    bw.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

    return foundFlag;
}

备注

  • 您需要确保关闭文件句柄。
  • 理想情况下,您应该将此代码分解为至少2种方法。一种查找行号的方法,另一种在找到帐户时将文件写回的方法。
  • 使用System.exit()时要小心我在我的代码中对此进行了评论,因为如果您获得IOException,可能不希望以这种方式退出程序。您也可以抛出异常或将其包装在RuntimeException中,让调用代码处理它。
  • 您可能需要考虑将newBalance变量设为double而不是int