代码之家  ›  专栏  ›  技术社区  ›  Jason

用Java解析文本文件

  •  1
  • Jason  · 技术社区  · 15 年前

    输入文件示例:

    ARTIST="unknown"
    TITLE="Rockabye Baby"
    LYRICS="Rockabye baby in the treetops
    When the wind blows your cradle will rock
    When the bow breaks your cradle will fall
    Down will come baby cradle and all
    "
    

    while (readIn.hasNext()) {
        readToken= readIn.next();
        if (readToken.contains("ARTIST")) {
            artist= readIn.next();
            }
            if (readToken.contains("TITLE")){
                title= readIn.next();
        System.out.print(artist+" "+title);
    }
    

    最后打印出来:

    "unknown"
    TITLE null"unknown"
    TITLE null"unknown"
    TITLE
    

    从代码中,我不明白为什么输出是这样打印的。每次通过循环时,readToken字符串都会被刷新,然后应该通过contains()方法进行比较。很明显我遗漏了什么。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Christopher Hunt    15 年前

    关于Alex Hart的回答,我认为您可以考虑使用Java的模式和匹配器类,并使用组来获得匹配的参数,例如(未测试的):

    private static final Pattern RECORDING_HEADER = 
      new Pattern("(ARTIST=\\"(.*)\\")?(TITLE=\\"(.*)\\")?(LYRICS=\\"(.*)\\")?");
    

    String line = readIn.readLine(); // Presuming that readIn is a BufferedReader
    Matcher m = RECORDING_HEADER.matcher(line);
    
    if (m.matches()) {
      final int artistGroup = 2;
      String artist = m.group(artistGroup);
    
      final int titleGroup = 4;
      String title = m.group(titleGroup);
    
      final int lyricsGroup = 6;
      String lyrics = m.group(lyricsGroup);
    
      if (artist != null) {
        // You've got an artist...
      } else if (title != null) {
        // etc...
      }
    }
    
        2
  •  3
  •   Kevin Zhou    15 年前

    从你的密码

    while (readIn.hasNext()) {
        readToken= readIn.next();
        if (readToken.contains("ARTIST")) {
            artist= readIn.next();
            }
        if (readToken.contains("TITLE")){
            title= readIn.next();
        System.out.print(artist+" "+title);
    }
    

    如果正确声明和实例化了程序(变量artist、readToken和title),则首先 检查while条件中是否存在现有的下一行,如果为真,则将字符串(im假设)readToken保存为下一行。如果readToken包含“ARTIST”,则下一行保存为ARTIST字符串。包含“标题”也是如此。当while循环返回时,您可能已经点击了歌词,完全跳过了标题,导致它为空。

    你想要的也许是存钱

    艺术家=readToken; 或者title=readToken;取而代之。

    如果您不想打印“artist=”ARTISTNAMEHERER“title=”TITLENAMEHERE“”而不是“ARTISTNAME,TITLENAME”,也不要忘记将artist和title分为子字符串

        3
  •  1
  •   Alex Hart    15 年前

    看起来您在这里所做的是逐行读取,但是当您找到您要查找的内容时,您正在将变量设置到下一行。这可能会导致问题和越界问题,很可能是你不幸的症状

    推荐文章