【问题标题】:Reading a file and storing it in an array, then splitting up the file everywhere there is a },读取一个文件并将其存储在一个数组中,然后在任何有 } 的地方拆分文件,
【发布时间】:2013-09-10 14:21:38
【问题描述】:

我想读取一个文件并将其存储在一个数组中,然后在有 } 的任何地方拆分数组,以便数组中的每个项目都包含拆分的字符串。这就是我的意思,

我的文件包含以下内容:

[
{
    "sample1": {
        "color": "red", 
        "date": "2011, 
        "name": "george"
    }
}, 
{
    "sample2": {
        "color": "red", 
        "date": "2012", 
        "name": "phil"
    }
}, 

我想读取这个文件,例如数组中的 oth 元素来表示

{
        "sample1": {
            "color": "red", 
            "date": "2011, 
            "name": "george"
        }
}, 

并为第一个元素表示

    {
    "sample2": {
        "color": "red", 
        "date": "2012", 
        "name": "phil"
    }
}, 

现在我不太确定如何执行此操作,我不知道我的数组的大小是多少,我不确定如何访问我的数组的每个元素,到目前为止我已经开始这样做了

String str;
  char[] getArray;

  FileReader fr = new FileReader("/sampleProject");
  BufferedReader br = new BufferedReader(fr);

  br.readLine();

  while ((str = br.readLine()) != null) {
     str.toCharArray();
     str.split("},");

  }

  System.out.println("Here it is" + str);

  br.close();
}

【问题讨论】:

  • 这是 JSON 吗?你可以试试JSON in Java
  • 数据看起来像 JSON,你认为使用真正的解析器会更好吗?
  • 我不太确定,我将如何用 json 拆分它,我正在用 java 编写代码并读取 json 文件

标签: java arrays json


【解决方案1】:

如果您不知道数组的大小,您可以使用 ArrayList。 str.toCharArray();str.split("},")}; 可能不符合您的预期,因为您从未分配返回值。

我没有对此进行测试,但也许它可以满足您的需求:

String str;
  char[] getArray;

  FileReader fr = new FileReader("/sampleProject");
  BufferedReader br = new BufferedReader(fr);

  br.readLine();
  ArrayList<String> result = new ArrayList<>();

  while ((str = br.readLine()) != null) {
     String[] array = str.split("},");
     for(int i = 0; i< array.length;i++) {
         result.add(array[i]);
     }
  }

  System.out.println("Here it is" + str);

  br.close();

【讨论】:

  • 为什么要将split的结果复制到数组列表中?已经是可以直接访问的字符串数组了。
  • array 是文件中每一行的新数组。所以如果你不复制它,最后你的数组中只会有最后一行。
  • 好点,但在这个解决方案中,您打印出str,这只是最后一行。 @Jack,@Kayz:我仍然认为这个会给你一个误导性的结果。这就是为什么我逐行使用StringBuilderappend 来获得真正的完整包。
  • 哦,你是对的。我完全忘记了最后的输出。
【解决方案2】:

您最好使用 Jackson Mapper 将该 JSON 解析为一个对象,如下所示:

        import org.codehaus.jackson.JsonGenerationException;
        import org.codehaus.jackson.map.JsonMappingException;
        import org.codehaus.jackson.map.ObjectMapper;

        public void readJSON(){
            MyBean bean;
            ObjectMapper mapper = new ObjectMapper();

            try {
                bean = mapper.readValue(new File("/sampleProject"), MyBean.class);

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

您可以在http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/获取更多关于 JSON -> Java Objects 转换的信息

【讨论】:

    【解决方案3】:

    你已经很接近它了。只是一个视图的东西,没有必要。如果数据足够小以将其完全保存在内存中,这将是您的代码:

    StringBuilder data = new StringBuilder();
    BufferedReader br = new BufferedReader(new FileReader("/sampleProject"));
    
    // Read data in
    String line;
    while ((line = br.readLine()) != null) data.append(line);
    
    // Split into packages
    for(String package : data.toString().split("}")
        System.out.println("Here it is" + package + "}");
    
    br.close();
    

    一件小事是,split 删除了最后的 },您可以在 System.println() 中再次附加它。

    是的,它看起来像 JSON,其中存在良好的 JSON Parser,例如here。但是如果你不需要它......

    当您的数据变得太大而无法保存在内存中时,可能会出现更相关的情况。您需要设置一个完全流式传输的解决方案。

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多