我在这里要做的是处理日志文件,在我的例子中是鱿鱼的access.log。我想让我的程序看看文件中的第一个“单词”,这是访问URL时Unix格式的时间。在程序的其他部分,我设计了一个时间类,它获取程序在Unix时间上次运行的时间,我想将此时间与文件中的第一个单词进行比较,这恰好是Unix时间。 / p>
我最初的思考是如何处理文件,将其存储在数组中,然后根据文件中的第一个单词,通过从处理文件所在的数组中删除行来省略行,以及把它放在另一个数组
这是我到目前为止所得到的。我很确定我很接近,但这是我第一次完成文件处理,所以我不知道我在做什么。
private void readFile(File file) throws FileNotFoundException, IOException{
String[] lines = new String[getLineCount(file)];
Long unixTime = time.getUnixLastRun();
String[] removedTime = new String[getLineCount(file)];
try(BufferedReader br = new BufferedReader(new FileReader(file))) {
int i = 0;
for(String line; (line = br.readLine()) != null; i++) {
lines[i] = line;
}
}
for(String arr: lines){
System.out.println(arr);
}
}
答案 0 :(得分:1)
private void readFile(File file) {
List<String> lines = new ArrayList<String>();
List<String> firstWord = new ArrayList<String>();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
// Adds the entire first line
lines.add(sCurrentLine);
// Adds the first word
firstWord.add(sCurrentLine.split(" ")[0]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
如果您愿意,可以使用阵列。
答案 1 :(得分:1)
private void readFile(File file) throws FileNotFoundException, IOException {
String[] lines = new String[getLineCount(file)];
Long unixTime = time.getUnixLastRun();
String[] removedTime = new String[getLineCount(file)];
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
int i = 0;
for (String line; (line = br.readLine()) != null; i++) {
lines[i] = line;
}
}
ArrayList<String> logsToBeUsed = new ArrayList<String>();
for (String arr : lines) {
//Gets the first word from the line and compares it with the current unix time, if it is >= unix time
//then we add it to the list of Strings to be used
try{
if(Long.parseLong(getFirstWord(arr)) >= unixTime){
logsToBeUsed.add(arr);
}
}catch(NumberFormatException nfe){
//Means the first word was not a float, do something here
}
}
}
private String getFirstWord(String text) {
if (text.indexOf(' ') > -1) {
return text.substring(0, text.indexOf(' '));
} else {
return text;
}
}
根据您发布的代码,这是答案。这可以更有效地完成,因为您可以使用ArrayList
来存储文件中的行,而不是在打开文件两次时首先读取行号getLineCount(file)
。在for循环中,您一次又一次地声明String
对象。