I am trying to check if a log file is empty (meaning no errors) or not, in Java, on Windows. I have tried using 2 methods so far.
Method 1 (Failure)
FileInputStream fis = new FileInputStream(new File(sLogFilename));
int iByteCount = fis.read();
if (iByteCount == -1)
System.out.println("NO ERRORS!");
else
System.out.println("SOME ERRORS!");
Method 2 (Failure)
File logFile = new File(sLogFilename);
if(logFile.length() == 0)
System.out.println("NO ERRORS!");
else
System.out.println("SOME ERRORS!");
Now both these methods fail at times when the log file is empty (has no content), yet the file size is not zero (2 bytes).
What is the most efficient and accurate method to check if the file is empty? I asked for efficiency, as I have to keep checking the file size thousands of times, in a loop.
Note: The file size would hover around a few to 10 KB only!
Method 3 (Failure)
Following @Cygnusx1's suggestion, I had tried using a FileReader
too, without success. Here's the snippet, if anyone's interested.
Reader reader = new FileReader(sLogFilename);
int readSize = reader.read();
if (readSize == -1)
System.out.println("NO ERRORS!");
else
System.out.println("SOME ERRORS!");
This question is related to
java
file
logging
file-io
filesystems
String line = br.readLine();
String[] splitted = line.split("anySplitCharacter");
if(splitted.length == 0)
//file is empty
else
//file is not empty
I had the same problem with my text file. Although it was empty, the value being returned by the readLine method was not null. Therefore, I tried to assign its value to the String array which I was using to access the splitted attributes of my data. It did work for me. Try this out and tell me if it works for u as well.
Try FileReader
, this reader is meant to read stream of character, while FileInputStream
is meant to read raw data.
From the Javadoc:
FileReader is meant for reading streams of characters. For reading streams of raw bytes, consider using a FileInputStream.
Since you wanna read a log file, FileReader
is the class to use IMO.
You can choose try the FileReader approach but it may not be time to give up just yet. If is the BOM field destroying for you try this solution posted here at stackoverflow.
This is an improvement of Saik0's answer based on Anwar Shaikh's comment that too big files (above available memory) will throw an exception:
Using Apache Commons FileUtils
private void printEmptyFileName(final File file) throws IOException {
/*Arbitrary big-ish number that definitely is not an empty file*/
int limit = 4096;
if(file.length < limit && FileUtils.readFileToString(file).trim().isEmpty()) {
System.out.println("File is empty: " + file.getName());
}
}
Another way to do this is (using Apache Commons
FileUtils
) -
private void printEmptyFileName(final File file) throws IOException {
if (FileUtils.readFileToString(file).trim().isEmpty()) {
System.out.println("File is empty: " + file.getName());
}
}
Now both these methods fail at times when the log file is empty (has no content), yet the file size is not zero (2 bytes).
Actually, I think you will find that the file is NOT empty. Rather I think that you will find that those two characters are a CR and a NL; i.e. the file consists of one line that is empty.
If you want to test if a file is either empty or has a single empty line then a simple, relatively efficient way is:
try (BufferedReader br = new BufferedReader(FileReader(fileName))) {
String line = br.readLine();
if (line == null ||
(line.length() == 0 && br.readLine() == null)) {
System.out.println("NO ERRORS!");
} else {
System.out.println("SOME ERRORS!");
}
}
Can we do this more efficiently? Possibly. It depends on how often you have to deal with the three different cases:
You can probably do better by using Files.length()
and / or reading just the first two bytes. However, the problems include:
0x0d
and 0x0a
. (For example ... UTF-16)All of this means that the most efficient possible solution is going to be rather complicated.
I combined the two best solutions to cover all the possibilities:
BufferedReader br = new BufferedReader(new FileReader(fileName));
File file = new File(fileName);
if (br.readLine() == null && file.length() == 0)
{
System.out.println("No errors, and file empty");
}
else
{
System.out.println("File contains something");
}
Why not just use:
File file = new File("test.txt");
if (file.length() == 0) {
// file empty
} else {
// not empty
}
Is there something wrong with it?
The idea of your first snippet is right. You probably meant to check iByteCount == -1
: whether the file has at least one byte:
if (iByteCount == -1)
System.out.println("NO ERRORS!");
else
System.out.println("SOME ERRORS!");
I think the best way is to use file.length == 0
.
It is sometimes possible that the first line is empty.
Stolen from http://www.coderanch.com/t/279224/Streams/java/Checking-empty-file
FileInputStream fis = new FileInputStream(new File("file_name"));
int b = fis.read();
if (b == -1)
{
System.out.println("!!File " + file_name + " emty!!");
}
Updated: My first answer was premature and contained a bug.
Source: Stackoverflow.com