如何使用Java读取和更新文件中的行

时间:2011-02-25 15:52:29

标签: java

目前我正在创建一个java应用程序而不需要数据库 这就是为什么我使用文本文件来实现它 文件的结构就像这样

unique6id username identitynumber point

unique6id username identitynumber point

我可以知道如何阅读并找到匹配unique6id然后更新相应的点行吗?

抱歉缺乏信息 这是我输入的部分

public class Cust{
  string name;
  long idenid, uniqueid;
  int pts;
  customer(){}
  customer(string n,long ide, long uni, int pt){
        name = n;
        idenid = ide;
        uniqueid = uni;
        pts = pt;
  }


FileWriter fstream = new FileWriter("Data.txt", true);
            BufferedWriter fbw = new BufferedWriter(fstream);
                Cust newCust = new Cust();

                newCust.name = memUNTF.getText();
                newCust.ic = Long.parseLong(memICTF.getText());
                newCust.uniqueID = Long.parseLong(memIDTF.getText());
                newCust.pts= points;

            fbw.write(newCust.name + " " + newCust.ic + " " + newCust.uniqueID + " " + newCust.point);
            fbw.newLine();
            fbw.close();

这是我在数据中发短信的方式 然后Data.txt中的结果是

spencerlim 900419129876 448505 0
Eugene 900419081234 586026 0

当用户键入586026时,它将获取eugene行 绑定到Cust 并更新pts(在这种情况下为0,尝试将其更新为其他数字,例如30)

回复的答案= D

3 个答案:

答案 0 :(得分:3)

阅读非常简单,但是就地更新文本文件(即不重写整个文件)非常尴尬。

所以,你有两个选择:

  1. 读取整个文件,进行更改,然后将整个文件写入磁盘,覆盖旧版本;这很简单,并且对于小文件来说足够快,但对于非常大的文件来说不是一个好主意。

  2. 使用非简单文本文件的格式。数据库是一种选择(并且要记住,JDK中内置了一个Derby);还有其他方法可以在磁盘上保存简单的键值存储(如HashMap,但在文件中),但JDK中没有内置任何内容。

答案 1 :(得分:2)

您可以使用OpenCSV with custom separators

以下是更新指定用户信息的示例方法:

public static void updateUserInfo(
    String userId,  // user id
    String[] values // new values
) throws IOException{
    String fileName = "yourfile.txt.csv";
    CSVReader reader = new CSVReader(new FileReader(fileName), ' ');
    List<String[]> lines = reader.readAll();
    Iterator<String[]> iterator = lines.iterator();
    while(iterator.hasNext()){
        String[] items = (String[]) iterator.next();
        if(items[0].equals(userId)){
            for(int i = 0; i < values.length; i++){
                String value = values[i];
                if(value!=null){ 
                    // for every array value that's not null,
                    // update the corresponding field
                    items[i+1]=value;
                }
            }
            break;
        }
    }
    new CSVWriter(new FileWriter(fileName), ' ').writeAll(lines);
}

答案 2 :(得分:1)

使用InputStream(s)和Reader(s)读取文件。 这是一段代码片段,展示了如何阅读文件。

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("c:/myfile.txt")));

String line = null;

while ((line = reader.readLine()) != null) {
    // do something with the line.
}

使用OutputStream和Writer写入文件。虽然您可以使用随机访问文件,即写入文件的特定位置,但我不建议您这样做。更容易和更健壮的方法是每次必须编写内容时创建新文件。我知道它可能不是最有效的方式,但是你不想因为某些原因使用DB ...如果你必须相对经常保存和更新部分信息并执行搜索到我建议你使用的文件D B。有非常轻量级的实现,包括纯java实现(例如h2:http://www.h2database.com/html/main.html)。