更改文件中的第一行

时间:2017-10-15 10:49:03

标签: java

我在更改文件中的行时遇到问题,此代码的目的是将文件的第一个数字更改为自身+ 1.由于某种原因,代码似乎没有一切正常,任何帮助将不胜感激!

public static void changenumber(String fileName)
{
    ArrayList<String> list = new ArrayList<String>();
    File temp = new File(fileName);
    Scanner sc;
    try {
        sc = new Scanner(temp);
        while (sc.hasNextLine())
        {
            list.add(sc.nextLine());
        }
        sc.close();
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }
    String first = list.get(0);
    int i = Integer.parseInt(first);
    i = i+1;
    first = Integer.toString(i);
    list.set(0, first);
    writenumber(list,fileName);
}

public static void writenumber(ArrayList<String> list, String fileName)
{
    PrintWriter write;
    try {
        write = new PrintWriter(new FileWriter(fileName, true));
        for(int i = 0; i<list.size();i++)
        {
            write.append(list.get(i));
        }
        }
    catch(IOException err)
    {
        err.printStackTrace();
    }

}

1 个答案:

答案 0 :(得分:1)

您的问题是您从未关闭FileWriter

使用try-with-resources确保正确关闭文件流。

您的代码的其他一些改进:

  • 不要忽略异常。继续执行 - 如果没有发生任何不好的事情将导致许多问题。让异常退回到调用者,并让调用者决定在无法更新文件时该怎么做。

  • Scanner很慢。由于您正在阅读所有内容,请改为使用BufferedReader

  • 内存中的行不以换行符结尾,因此在将行写回时需要使用println()方法,否则结果是一个文件,其中所有行连接成一行单行。

  • 重命名的变量更具描述性。

public static void changenumber(String fileName) throws IOException {
    ArrayList<String> lines = new ArrayList<>();
    try (BufferedReader in = new BufferedReader(new FileReader(fileName))) {
        for (String line; (line = in.readLine()) != null; ) {
            lines.add(line);
        }
    }
    int i = Integer.parseInt(lines.get(0));
    i++;
    lines.set(0, Integer.toString(i));
    writenumber(lines, fileName);
}

public static void writenumber(List<String> lines, String fileName) throws IOException {
    try (PrintWriter out = new PrintWriter(new FileWriter(fileName, true))) {
        for (String line : lines) {
            out.println(line);
        }
    }
}

当然,您可以使用Java 7中添加的较新NIO.2类,特别是java.nio.file.Files类来极大地简化代码。

public static void changenumber(String fileName) throws IOException {
    Path filePath = Paths.get(fileName);
    List<String> lines = Files.readAllLines(filePath);
    lines.set(0, Integer.toString(Integer.parseInt(lines.get(0)) + 1));
    Files.write(filePath, lines);
}