【问题标题】:Displaying first and last lines of Text File?显示文本文件的第一行和最后一行?
【发布时间】:2011-04-10 18:59:58
【问题描述】:

我有一个用于导航文本文件的 GUI 程序。没什么太复杂的,只是能够浏览文件并向其中添加新信息。但是,我还希望能够识别文本文件中的第一行以及最后一行。基本上,如果我有一个看起来像这样的文本文件:

  • 加利福尼亚西部,1981, 115, 25.99
  • 纽约,东部,1991, 120, 19.95

我希望,当一个按钮被按下时说 first - 文本 California 出现,标识文本中的第一行。但我只想显示加利福尼亚,而不是第一行的其余信息。我希望以相同的风格对最后一行执行此操作。

我将 FileReader 和 FileBuffer 与 StringTokenizer 一起使用。有没有办法只调用第一行的第一个标记和最后一行的第一个标记?感谢您的帮助!

【问题讨论】:

  • 每个文本文件中的数据是否相同
  • 只有一个文本文件,但每一行的格式相同。和上面一样,每行有 5 条信息,用逗号分隔。我想只打电话给第一个信息(即加利福尼亚、纽约)。

标签: java string text-files tokenize filereader


【解决方案1】:

要获得行的第一个标记,您可以这样做

String line = "California, West, 1981, 115, 25.99"
String firstToken = line.split(",")[0]

要获得最后一行,我会迭代整个文件并将其存储在 List 中并获取最后一个元素,例如:

String line ="";
List<String> list = new ArrayList<String>();
          while((line = fileReader.readLine())!= null){
                 list.add(line)
         }
 list.get(0) // first line
 list.get(list.size()-1) // last line

【讨论】:

  • 有没有办法从文本文件中读取?因为最后一行总是会改变,这取决于添加到文件中的内容。
  • 现在我更仔细地阅读了@harshit 的示例,它似乎涵盖了原始要求的每个部分。 你真的尝试过使用代码吗?
【解决方案2】:

提供的答案应该在大多数(绝大多数)情况下都能正常工作。但是对于真正巨大的输入文件,使用RandomAccessFile (RAF) 采取不同的方法可能是有意义的。

使用 RAF,读取第一个字节直到遇到换行符(对于第一行),然后从 RAF 的末尾向后查找以找到最后一个新行,然后从那里读取直到末尾(对于最后一行)。

如果行是固定列宽 (FCW) 则更容易,但此数据是 CSV。对于 FCW,您可以计算知道文件大小和行宽(长度)的最后一行从哪里开始,然后直接查找该点。

【讨论】:

  • 我只是想得到第一行的第一个单词,到目前为止我只设法得到了第一行的所有内容。
  • @rjdelight 如果您已经知道如何获取所需的行,最好再问一个关于对行进行标记以获取数据的问题。话虽如此,String.split(",")[0] 应该产生任何行的第一部分。
【解决方案3】:

这是一个非常古老的问题,但现在我们有一个简单的方法可以做到这一点,我没有找到任何例子。我给出了一个新的答案: 我正在使用 Java 11,但可能在 Java 8 中可用,必须检查。

Long lines = Files.lines(Paths.get(file)).count();
String first = Files.lines(Paths.get(file)).findFirst().get();
String last = Files.lines(Paths.get(file)).skip(lines - 1).findFirst().get();

【讨论】:

    【解决方案4】:

    如何找出所需字符串的示例

    使用流式阅读器读取文件

      streamreader sr=new streamreader("Your.txt");
      while(sr.peek()>=0)
      {
         string strLine=sr.readLine();
          if(strline.startswith("California"))
          {
             //Dispaly it
           }
              if(strline.startswith("NewYork"))
              {
                 //Display it
              }
        }
    

    【讨论】:

      【解决方案5】:

      有没有办法从文本文件中读取?

      如果中间的行不相关,则可以读取第一行并扫描到最后一行,而无需累积集合。

      import java.io.BufferedReader;
      import java.io.FileReader;
      
      /** @see http://stackoverflow.com/questions/5614004 */
      public class FirstLastTest {
      
          private static String first, last, line;
      
          public static void main(String[] args) throws Exception {
              BufferedReader in = new BufferedReader(new FileReader(args[0]));
              first = in.readLine();
              while ((line = in.readLine()) != null) {
                  if (line != null) {
                      last = line;
                  }
              }
              System.out.println(first + "\n" + last);
          }
      }
      

      【讨论】:

      • 由于某种原因,我不断得到数组索引越界异常......
      • 是的,args[0]是命令行参数,方便测试;在 IDE 中,只需替换引用的文件名。
      • 知道了,但是如何只显示第一行的第一个单词?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多