Файл читает, но не пишет в эту «базу данных» - PullRequest
0 голосов
/ 07 октября 2019

У меня есть файл с именем AccountDetails.txt, я пытаюсь отсканировать данные в этом файле и заменить баланс.

Раньше он нормально работал на моем ноутбуке Unix, но незаписать в текстовый файл на моем ПК с Windows. Я убедился, что текстовый файл не только для чтения

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 голосов
/ 07 октября 2019

Вы используете кодировку символов базовой платформы. Сканер может указать кодировку, 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, но я не думаю, что вы намеревались заменить старый файл.

0 голосов
/ 07 октября 2019

раньше он нормально работал на моем ноутбуке с Unix, но не записывал в txt файл на моем компьютере с Windows. Я убедился, что txt файл не только для чтения

Вывы используете \n (перевод строки), что хорошо для Linux, но в Windows разделитель строки по умолчанию использует два символа - \r\n (возврат каретки + перевод строки).

Если ваштекстовый файл создан на windows, нужно учесть и использовать \r\n

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...