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