我有类帐户,其中包含用户名,完整名称,密码,ID和点数。 所有帐户都保存在一个文件中。我的文件中有很多帐户,而不只是一个帐户。这是文本文件中一个帐户的示例。
Miljan9602 Rakita Miljan miljan123 1463433398614 0.0
用户名,全名,密码,ID和分数
现在,例如,如果我想更改用户名的分数。我要做的第一件事是浏览文件中的所有行并比较所有用户名,如果我找到相同的用户名。我会改变点。这是我的想法如何做到这一点。只是不知道如何在文件中编辑它。
public void edit(String username, double points)
{
File f = new File("Accounts.txt");
// file doesnt exist, return from method
if(!f.exists())
return;
Scanner sc = null;
try
{
sc = new Scanner(f);
while(sc.hasNextLine())
{
String line = sc.nextLine(); // Take whole line
String split[] = line.split(" "); // Split it so i can check username
if(split[0].equals(username))
{
String change = Double.toString(points); // Make string from double
split[5] = change; // on fifth index are points
/* My question is now how to edit file and to replace my new points
* with old points ?
* Miljan9602 Rakita Miljan miljan123 1463433398614 0.0 <- Need to change this 0.0 with split[4];
*/
}
}
}catch(Exception e)
{
e.printStackTrace();
}finally{
// finally will always close file
sc.close();
}
答案 0 :(得分:0)
您可以使用Apache's Commons IO库。你可以在那里找到你需要的一切,甚至更多。此外,here是Commons IO的GitHub镜像。值得一看。
答案 1 :(得分:0)
{
File f = new File("Accounts.txt");
FileWriter fw = new FileWriter(f);
// file doesnt exist, return from method
if(!f.exists())
return;
Scanner sc = null;
try
{
sc = new Scanner(f);
while(sc.hasNextLine())
{
String line = sc.nextLine(); // Take whole line
String split[] = line.split(" "); // Split it so i can check username
if(split[0].equals(username))
{
String change = Double.toString(points); // Make string from double
split[5] = change; // on fifth index are points
/* My question is now how to edit file and to replace my new points
* with old points ?
* Miljan9602 Rakita Miljan miljan123 1463433398614 0.0 <- Need to change this 0.0 with split[4];
*/
for(int i = 0; i < spit.length(); i++{
fw.write(split[i] + " ");
}
System.getProperty("line.separator");
}
}
}catch(Exception e)
{
e.printStackTrace();
}finally{
// finally will always close file
sc.close();
fw.close();
}
这应该有效
答案 2 :(得分:0)
由于必须将整个读取文本写回文件系统,因此请使用Files.readAllLines()。
Path path = Paths.get(".../Accounts.txt");
Charset charset = StandardCharsets.UTF_8;
List<String> lines = new ArrayList<>();
if (Files.exists()) {
Files.readAllLines(path, charset);
for (int i = 0; i < lines.size(); ++i) {
String split[] = lines.get(i).split(" ");
if (split[0].equals(username)) {
String change = String.valueOf(points);
split[5] = change; // on fifth index are points
StringBuilder sb = new StringBuilder();
for (String value : split) {
if (sb.length() != 0) {
sb.append(' ');
}
sb.append(value);
}
lines.set(i, sb.toString()); // Changes the line.
Files.write(path, lines, charset);
break; // leave loop
}
}
}
更多解释
要更改文本文件的单行,原则上必须加载整个文本,并在更改行后,完全保护它。
原因是文件可能会缩小或增长,具体取决于行的更改。
即使有一些曲折,这也不是最佳选择。
Files.readAllLines
是一个不错的方法。人们也可能会改变格式:
key = value
。此外,文本还有一些转义(\
)。可以将Accounts.txt保留在核心中,比如在类帐户中,将所有内容表示为从用户名到帐户的映射。
class Account {
public final String userName; // Unmodifiable key
public String password;
...
}
class Accounts {
private Map<String, Account> accountsByUserName = new HashMap<>();
public void loadAccounts() throws IOException { ... }
public void saveAccounts() throws IOException { ... }
public Optional<Account> getAccountByUserName(String userName) { ... }
public void deleteAccountByUserName(String userName) { ... }
public void createAccount(Account account) throws AlreadyExistsException { ... }
}