如何在Java中读取特定行

如何在Java中读取特定行,java,Java,我有一个文件,里面有这样的内容 Fri Sep 19 19:16:39 UTC 2014 Test launched. Check every minute for an update minute 9: ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second: 926.13 [#/sec] (mean) ---------------------- minute 10: ec2-54-84-5-158.compute-1.

我有一个文件,里面有这样的内容

Fri Sep 19 19:16:39 UTC 2014
Test launched. Check every minute for an update
minute 9:
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second:    926.13 [#/sec] (mean)
----------------------
minute 10:
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second:    919.23 [#/sec] (mean)
----------------------
minute 11:
ec2-54-209-65-210.compute-1.amazonaws.com: Requests per second:    547.62 [#/sec] (mean)
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second: 875.14 [#/sec] (mean)
----------------------
minute 12:
ec2-54-209-65-210.compute-1.amazonaws.com: Requests per second:    862.83 [#/sec] (mean)
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second: 876.78 [#/sec] (mean)
----------------------
minute 13:
ec2-54-209-65-210.compute-1.amazonaws.com: Requests per second:    857.37 [#/sec] (mean)
ec2-54-84-5-158.compute-1.amazonaws.com: Requests per second: 880.64 [#/sec] (mean)
----------------------
它基本上每分钟都在更新。所以我想从这两条“----------”行之间的最后一个块中获取最后一个数据。最终目标是对该块每秒的请求求和。你能给我介绍一下最佳的应用逻辑吗

你可以做一个

那么你想要的街区就是

yourBlocks[yourBlocks.length-2]
更进一步,你想做的是

int numberRequest,numberRequest1;
String tempNumber;
for(String myString : yourBlocks) {
    String [] splitedString = myString.split("Requests per second:");
    tempNumber="";
    for(int i = 0;i< splitedString[1].length ; i++) {
          if(Charachter.isDigit()){
               tempNumber+=splitedString[i];
          }
          if('#'==splitedString[i]){
               break;
          }
    }
    numberRequest = Integer.parseInt(tempNumber);
    tempNumber="";
    for(int i = 0;i< splitedString[3].length ; i++) {
          if(Charachter.isDigit()){
               tempNumber+=splitedString[i];
          }
          if('#'==splitedString[i]){
               break;
          }
    }
    numberRequest1 = Integer.parseInt(tempNumber);
    // use numberRequest, numberRequest1 here
}
int numberRequest,numberRequest1;
字符串编号;
for(字符串myString:yourBlocks){
String[]splitedString=myString.split(“每秒请求数:”);
tempNumber=“”;
对于(int i=0;i

这可能不是很有效,但会使您达到所需的输出。

此代码将识别每秒请求数(字段#5),并将识别当前行上每秒请求数与包含每秒请求数的最后一行(最近一行)之间的差异

此代码假定每秒的请求数始终显示在以世界“分钟”(不带引号)开头的行之后的行上

试试看{
BufferedReader br=新的BufferedReader(新文件读取器(“C:\\TEMP\\MINUTE.txt”);
弦线;
字符串[]行字段;
int i;
int这条线每分钟一次;
最后一行每分钟一次;
将该线加倍;
双lastLine_reqpersec;
最后一行每分钟=0;
该线=0.0;
lastLine_reqpersec=0.0;
而((line=br.readLine())!=null){
lineFields=line.split(\\s+);
System.out.printf(“行读取:%s\n”,行);
对于(i=0;i
所以您试图对以虚线结束的每个块中的值求和,对吗?与其试图将文件分开,不如逐行阅读,直到文件结束,并对出现的任何一行做出适当的反应:

  • 如果它是一个包含“每秒请求数”的行,则解析出该值并将其添加到该块的总和中
  • 如果它是一个带“---”的行,那么这个块就完成了,所以对结果做任何你想做的事情,并将总和重置为0,这样你就可以开始下一个块了
  • 如果是其他行,请忽略它并阅读下一行

如果你想用每秒的总和做点什么(比如平均值),那么每次读完一个区块后,你都要做你需要做的事情。如果您只关心最后一个块,那么只需保存每次计算的最后一个和,覆盖最后一个值;当您点击文件中的最后一条虚线时,您已经计算并保存了最后一个块的总和,它将在那里供您阅读并执行所需操作。但我的直觉告诉我,你要使用所有的值,而不仅仅是最后一个…

注意你的问题标题不是你真正想问的。为什么不跟踪令牌流中的“每秒请求数:”然后获取随后的数字?你是指两行之间的最新时间值吗?不。只需在最近一分钟内求和每秒请求数。本案第13分钟
int numberRequest,numberRequest1;
String tempNumber;
for(String myString : yourBlocks) {
    String [] splitedString = myString.split("Requests per second:");
    tempNumber="";
    for(int i = 0;i< splitedString[1].length ; i++) {
          if(Charachter.isDigit()){
               tempNumber+=splitedString[i];
          }
          if('#'==splitedString[i]){
               break;
          }
    }
    numberRequest = Integer.parseInt(tempNumber);
    tempNumber="";
    for(int i = 0;i< splitedString[3].length ; i++) {
          if(Charachter.isDigit()){
               tempNumber+=splitedString[i];
          }
          if('#'==splitedString[i]){
               break;
          }
    }
    numberRequest1 = Integer.parseInt(tempNumber);
    // use numberRequest, numberRequest1 here
}
    try{
        BufferedReader br = new BufferedReader(new FileReader("C:\\TEMP\\MINUTE.txt"));

        String   line;
        String[] lineFields;
        int      i;
        int      thisLine_minute;
        int      lastLine_minute;
        Double   thisLine_reqpersec;
        Double   lastLine_reqpersec;
        lastLine_minute   = 0;
        thisLine_reqpersec= 0.0;
        lastLine_reqpersec= 0.0;
        while ( (line = br.readLine()) != null) {

            lineFields = line.split("\\s+");
            System.out.printf("LINE READ: %s\n", line);
            for (i=0; i < lineFields.length; i++) {
                System.out.printf("FIELD: %d  IS: %s\n", i, lineFields[i]);
            }
            if (lineFields[0].toUpperCase().equals("MINUTE")) {
                thisLine_minute=1;
            }
            else {
                thisLine_minute=0;
            }
            try {
            if (lastLine_minute==1) {
                lastLine_reqpersec = thisLine_reqpersec;
                thisLine_reqpersec = new Double(lineFields[4]);
            }
            }
            catch (Exception excepStrToInt) {
                thisLine_reqpersec = 0.0;
            }
            System.out.printf("*** REQUESTS PER SECOND: %f\n", 
            thisLine_reqpersec);
            System.out.printf("*** REQUESTS PER SECOND: DIFFERENCE: %f\n", 
            (thisLine_reqpersec- lastLine_reqpersec));

            lastLine_minute=thisLine_minute;
        }
        br.close();
    }
    catch(Exception e){
    }
String result="";
BufferedReader bf = new BufferedReader(new FileReader("your_file_path"));
int dashCount=0;
String finalResult= "";
while ((result = bf.readLine()) != null) {
 if (result.length() != 0) {
    if (result.charAt(0) == ’-’) {

        dashCount=dashCount+1;
        if(dashCount==2) break;

                                                  } 
        finalResult+=result;

                          }
                                    }