>我有一个问题。我想制作一个程序,它需要一个日志文件并逐行解析它。
日志如下所示:
"2014-02-14 14:26:37,836 INFO [org.jboss.msc] (主要) JBoss MSC 版本 1.0.4.GA-红帽-1"
我的代码:
public static void main(String[] args) throws InterruptedException {
try
{
String sCurrentLine;
BufferedReader br = new BufferedReader(new FileReader("C:\server.log"));
while ((sCurrentLine = br.readLine()) != null) {
String datetime = "";
String level = "";
String category = "";
String message = "";
String output = "";
if(sCurrentLine.length()<1){
}
else{
if (sCurrentLine.charAt(4)=='-' && sCurrentLine.charAt(7)=='-' && sCurrentLine.charAt(13)==':' && sCurrentLine.charAt(16)==':'){
String[] leerzeichen = sCurrentLine.split(" ");
String[] leerzeichenz = sCurrentLine.split(" ");
datetime = leerzeichen[0] + " " + leerzeichen[1];
level = leerzeichen[2];
category = leerzeichen[4];
int arraylength = leerzeichen.length;
for (int l=5; l<arraylength; l++){
message = message.concat(leerzeichen[l] + " ");
}
output = datetime + level + category + message;
} else {
message = message.concat(sCurrentLine);
output += message;
}
}
System.out.println(output);
}
} catch (IOException e) {
e.printStackTrace();
}
}
如果行的开头如下所示,则程序看起来如下所示:0000-00-00 00:00:00如果不是,则该行只是与前面的行相关的消息。
但我总是收到错误:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4
at java.lang.String.charAt(String.java:658)
at javaapplication5.JavaApplication5.main(JavaApplication5.java:38)
但他读了几行日志。但直到日志结束。
你能帮我吗?对不起我的英语。
你在行中有问题:
if (sCurrentLine.charAt(4)=='-' && sCurrentLine.charAt(7)=='-' && sCurrentLine.charAt(13)==':' && sCurrentLine.charAt(16)==':'){
不能假定该行至少包含 4、7 个或更多字符。
尝试将其更改为以下内容:
if (sCurrentLine.length() >= 16 && sCurrentLine.charAt(4)=='-' && sCurrentLine.charAt(7)=='-' && sCurrentLine.charAt(13)==':' && sCurrentLine.charAt(16)==':'){
错误的原因很简单;你首先检查字符串的长度是否> 1,然后直接在索引 4 处请求 char - 这不能保证存在,因为你只知道长度> 1。
因此,在尝试访问索引 4 处的 char 之前添加适当的检查,最重要的是,如 @VusP 的评论中所述,在尝试解析读取字符串之前添加一些读取字符串的打印/调试。