【问题标题】:How to create item objects from reading a text file?如何通过读取文本文件创建项目对象?
【发布时间】:2015-04-30 19:13:34
【问题描述】:

我正在尝试从文本文件中读取数据并使用它创建项目对象。 项目对象具有字段 String title、String formatt、boolean onLoan、String loanedTo 和 String dateLoaned。在我的 save() 方法中,我将每个对象打印到一个新行的文本文件中,并且字段由“$”(美元符号)分隔。如何逐行读取文本文件并从每一行创建一个新对象并将其添加到数组中。

文本文件示例:

星球大战$DVD$false$null$null

外星人$Bluray$true$John$Monday

public void save() {
    String[] array2 = listForSave();
    PrintWriter printer = null;

      try {
          printer = new PrintWriter(file);

            for (String o : array2) {
            printer.println(o);
            }
            printer.close();
        } catch ( IOException e ) {
            e.printStackTrace();
        }

}
public void open(){
    try{

    FileReader fileReader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    StringBuffer stringBuffer = new StringBuffer();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        stringBuffer.append(line);
        stringBuffer.append("\n");
    }
    fileReader.close();
    System.out.println("Contents of file:");
    System.out.println(stringBuffer.toString());

    }catch ( IOException e ) {
        e.printStackTrace();
    }


}

谢谢大家。这是我的最终代码:

public void open(){
    try{

    FileReader fileReader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String line;
    String[] strings;
    while ((line = bufferedReader.readLine()) != null) {
        strings = line.split("\\$");
        String title = strings[0];
         String format = strings[1];
         boolean onLoan = Boolean.parseBoolean(strings[2]);
         String loanedTo = strings[3];
         String dateLoaned = strings[4];

         MediaItem superItem = new MediaItem(title,format, onLoan,loanedTo,dateLoaned);
         items.add(superItem);

    }
    fileReader.close();


    }catch ( IOException e ) {
        e.printStackTrace();
    }


}

【问题讨论】:

    标签: java


    【解决方案1】:
    String line = // input line e.g. "Aliens$Bluray$true$John$Monday"
    String[] strings = line.split("\\$"); // use regex matching "$" to split
    String title = strings[0];
    String formatt = strings[1];
    boolean onLoan = Boolean.parseBoolean(strings[2]);
    String loanedTo = strings[3];
    String dateLoaned = strings[4];
    // TODO: create object from those values
    

    也许您需要以不同的方式处理null(如果您希望将字符串"null" 转换为null);请注意,您无法区分是否保存了 null"null"

    此函数将"null" 转换为null,否则返回相同的字符串:

    String convert(String s) {
        return s.equals("null") ? null : s;
    }
    

    将对象读入数组

    由于在阅读 all 行之前您不知道元素的数量,因此您必须解决这个问题:

    1. 将文件中对象的数量写为第一行,这将允许您在读取第一个对象之前创建数组。 (使用Integer.parseInt(String)将第一行转换为int):

      public void save() {
          String[] array2 = listForSave();
          PrintWriter printer = null;
      
            try {
                printer = new PrintWriter(file);
                printer.println(array2.length);
                  for (String o : array2) {
                      printer.println(o);
                  }
                  printer.close();
              } catch ( IOException e ) {
                  e.printStackTrace();
              }
      
      }
      public void open(){
          try{
      
          FileReader fileReader = new FileReader(file);
          BufferedReader bufferedReader = new BufferedReader(fileReader);
          StringBuffer stringBuffer = new StringBuffer();
          int arraySize = Integer.parseInt(stringBuffer.readLine());
          Object[] array = new Object[arraySize];
          int index = 0;
          String line;
          while ((line = bufferedReader.readLine()) != null) {
              // split line and create Object (see above)
              Object o = // ...
              array[index++] = o;
          }
          //...
          }catch ( IOException e ) {
              e.printStackTrace();
          }
          //...
      }
      

    2. 使用Collection,例如ArrayList 存储对象并使用List.toArray(T[]) 获取数组。

    【讨论】:

    • 感谢您的回答,但我的文本文件可以更改,并且可能并不总是包含相同的数据。如何使用 String line =... 使其自动读取每一行?
    【解决方案2】:

    快速而肮脏的解决方案可能是......

    public void open(){
        try{
        ArrayList<Item> list = new ArrayList<Item>(); //Array of your ItemObject
    
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        StringBuffer stringBuffer = new StringBuffer();
        String line;
        while ((line = bufferedReader.readLine()) != null) {
          Item itm = new Item(); //New Item Object 
          String [] splitLine = line.split("\\$");
    
          item.title = splitLine[0];
          item.format = splitLine[1];
          item.onLoan = Boolean.parseBoolean(splitLine[2]);
          item.loanedTo = splitLine[3];
          item.dateLoaned = splitLine[4];
    
          list.add(itm);
    
          stringBuffer.append(line);
          stringBuffer.append("\n");
        }
        fileReader.close();
        System.out.println("Contents of file:");
        System.out.println(stringBuffer.toString());
    
        }catch ( IOException e ) {
            e.printStackTrace();
        }
    }
    

    但如果您需要重新排列或添加新字段,这将无法扩展。

    【讨论】:

      【解决方案3】:

      你可以试试这个来“解析”你文件的每一行

      String[] result = "StarWars$DVD$false$null$null".split("\\$");
      for (int i=0; i<result.length; i++) {
           String field = result[i]
           ... put the strings in your object ...  
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        相关资源
        最近更新 更多