我有一个名为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();
}
}
答案 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,但是我不认为您打算替换旧文件。