【问题标题】:Java Buffered Reader goes back and jump linesJava Bufferedreader 返回并跳转行
【发布时间】:2016-05-12 15:50:44
【问题描述】:

如果我有一个 bufferedReader 从以下文本文件中读取行。如何让阅读器读取例如第一个 ITEM 的标签 ITEM_TYPE,然后返回并读取标签 CODE 并继续阅读所有其他标签(第一个 ITEM)?

 ITEM_LIST
{
  ITEM
{
    CODE ADLS443
    ITEM_TYPE tv
    MODEL IDL32KJX4300
    MODEL_YEAR 2016
    MANUFACTURER Samsung
    PRICE 350
    PANEL_TYPE LCD
    DIMENSIONS 32
    RESOLUTION "Full HD"
    INTERFACES "HDMI USB SCART"
    PIECES 43
}
ITEM
{
    CODE KD444211
    ITEM_TYPE tv
    MODEL KDL49DDR4600
    MODEL_YEAR 2014
    MANUFACTURER Sony
    PRICE 600
    PANEL_TYPE LED
    DIMENSIONS 49
    RESOLUTION "Ultra HD"
    INTERFACES "HDMI USB SCART Ethernet WiFi"
    PIECES 8
}

【问题讨论】:

  • 阅读器会从上到下阅读文件。你想做什么?我怀疑真正的问题是如何在解析结果时处理它们。
  • 我正在尝试根据标签 ITEM_TYPE 创建对象(例如,如果 ITEM_TYPE 是 tv,我创建一个 tv 对象,该对象将具有 ITEM_TAG 的其余部分作为字段)。
  • 顺便说一句,您可以控制文件格式吗?如果您可以将格式转换为 JSON 等格式,解析会更容易(Gson 或 Jackson 等库会为您完成)。
  • 这个项目的文件格式应该是特殊的,我不能改变它。

标签: java


【解决方案1】:

您可以在解析中添加一个中间步骤。

  1. 将所有键值对(用于部分)解析为映射。
  2. 使用地图值创建所需的对象。

这里不知道您的其余代码是如何解析数据的一些伪代码。

Map<String, String> values = new HashMap<>();
// For each key value pair in section
  String key = // parse key name
  String value = // parse key value
  values.put(key, value);

String type = values.get("ITEM_TYPE");
if (type.equals("tv"))
  TvObject tv = new TvObject(values);
}

编辑:

您不应该解析特定的键值,而是解析文件的格式。

ITEM
{
    <key> <value>
    <key> <value>
    <key> <value>
}

这里是example,介绍如何解析 INI 文件,您可以在此基础上进行扩展。

【讨论】:

  • 我本来打算建议loading the whole file into a list,,但这是一种更好的方法,可以更轻松地以流方式解析文件,而不必太担心文件的总大小。
  • 谢谢,但是如果标签顺序不明确,如何从文件中读取键和值并将它们放入映射中?
  • 你试过什么?你准备好解析的教程了吗?我很乐意为您提供帮助,但不会为您编写项目。
  • 我使用了一个 if 语句并检查了每一行:如果它以 CODE 开头,那么我将代码和该行的其余部分放在地图中,否则如果它以 ITEM_TYPE 开头,我将 ITEM_TYPE 和地图中的其余行等。
  • 您通常应该寻找文件 的格式,因为那是您文件的语法。我用示例链接更新了答案。
猜你喜欢
  • 2013-05-13
  • 2016-03-23
  • 1970-01-01
  • 2018-12-11
  • 2014-06-07
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多