文件读取但不写入此“数据库”

时间:2019-10-07 12:37:03

标签: java file

我有一个名为AccountDetails.txt的文件,我要尝试的是扫描此文件中的数据并替换余额。

它过去可以在Unix笔记本电脑上正常工作,但不能写入Windows PC上的文本文件。 我确保文本文件不是只读的

public void removeFromBalance(String username, long amount) {


        String tempFile = "temp.txt";
        File oldfile = new File(directory, fileName);
        File newFile = new File(directory, tempFile);

        String userName = "";
        String balance = "";

        try {
            FileWriter fw = new FileWriter(tempFile, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);
            Scanner x = new Scanner(oldfile);

            x.useDelimiter("[,\n]");

            while (x.hasNext()) {

                userName = x.next();
                balance = x.next();

                if (userName.equalsIgnoreCase(username)) {

                    long result = Long.parseLong(balance) - amount;
                    pw.println(userName + "," + result);

                } else {
                    pw.println(userName + "," + balance);
                }
            }

            x.close();
            pw.flush();
            pw.close();
            oldfile.delete();
            File dump = new File(fileName);
            newFile.renameTo(dump);


        } catch (Exception e) {

            e.printStackTrace();
        }


    }

2 个答案:

答案 0 :(得分:0)

  

它过去在我的unix笔记本电脑上可以正常工作,但是它无法写入Windows PC上的txt文件,因此我确保txt文件不是只读的

您使用\n(换行符)作为分隔符,这在Linux上很好,但是在Windows上,默认的行分隔符使用两个字符-\r\n(回车+换行符)。

如果您的文本文件是在Windows上创建的,则需要将其考虑在内并使用\r\n

答案 1 :(得分:0)

您正在使用基础平台的字符编码。扫描程序可以指定字符集,FileWriter是一个太旧的实用工具类。

public void removeFromBalance(String username, long amount) throws IOException {

    String tempFile = "temp.txt";
    Path oldfile = Paths.get(directory.toString(), fileName);
    File newFile = oldfile.resolveSibling(tempFile);

    Charset charset = StandardCharsets.UTF_8;
    try (PrintWriter pw = new PrintWriter(
                Files.newBufferedWriter(newfile, charset,
                    StandardOpenOptions.APPEND, StandardOpenOptions.CREATE));
            Files.lines(oldfile)) {
                .map(line -> line.split("\\s*,\\s*"))
                .filter(xx -> xx.length >= 2)
                .map(xx -> {
                    String userName = xx[0];
                    String balance = xx[1];
                    if (userName.equalsIgnoreCase(username)) {
                        long result = Long.parseLong(balance) - amount;
                        pw.println(userName + "," + result);
                    } else {
                        pw.println(userName + "," + balance);
                    }
                });
    }
    Files.delete(oldfile);
    Files.move(newFile, oldfile); // Or ...

Files.lines默认为UTF-8。 Try-with-resources也可以关闭两个文件,Files.move也可以具有REPLACE_EXISTING,但是我不认为您打算替换旧文件。