Ответ 1
Проверьте, что первая строка файла пуста:
BufferedReader br = new BufferedReader(new FileReader("path_to_some_file"));
if (br.readLine() == null) {
System.out.println("No errors, and file empty");
}
Я пытаюсь проверить, пустой ли файл журнала (что означает отсутствие ошибок) или нет, в Java, в Windows. Я пробовал использовать 2 метода до сих пор.
Метод 1 (отказ)
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!");
Метод 2 (отказ)
File logFile = new File(sLogFilename);
if(logFile.length() == 0)
System.out.println("NO ERRORS!");
else
System.out.println("SOME ERRORS!");
Теперь оба этих метода терпят неудачу, когда файл журнала пуст (не имеет содержимого), но размер файла не равен нулю (2 байта).
Каков наиболее эффективный и точный метод проверки, является ли файл пустым? Я просил об эффективности, так как я должен постоянно проверять размер файла в цикле.
Примечание. Размер файла будет находиться только от нескольких до 10 КБ.
Метод 3 (отказ)
Следуя предложению @Cygnusx1, я тоже пробовал использовать FileReader
, но безуспешно. Вот фрагмент, если кто-то заинтересован.
Reader reader = new FileReader(sLogFilename);
int readSize = reader.read();
if (readSize == -1)
System.out.println("NO ERRORS!");
else
System.out.println("SOME ERRORS!");
Проверьте, что первая строка файла пуста:
BufferedReader br = new BufferedReader(new FileReader("path_to_some_file"));
if (br.readLine() == null) {
System.out.println("No errors, and file empty");
}
Почему бы просто не использовать:
File file = new File("test.txt");
if (file.length() == 0) {
// file empty
} else {
// not empty
}
С этим что-то не так?
Вы можете выбрать метод FileReader, но, возможно, еще не время отказаться. Если поле BOM уничтожает, попробуйте это решение, размещенное здесь в stackoverflow.
Попробуйте FileReader
, этот читатель предназначен для чтения потока символов, а FileInputStream
предназначен для чтения необработанных данных.
Из Javadoc:
FileReader предназначен для чтения потоков символов. Для чтения потоки необработанных байтов, рассмотрите использование FileInputStream.
Поскольку вы хотите прочитать файл журнала, FileReader
- это класс для использования IMO.
Другой способ сделать это (используя 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());
}
}
Это улучшение ответа Saik0 на основе комментария Анвара Шейха о том, что слишком большие файлы (выше доступной памяти) выдадут исключение:
Использование 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());
}
}
String line = br.readLine();
String[] splitted = line.split("anySplitCharacter");
if(splitted.length == 0)
//file is empty
else
//file is not empty
У меня была такая же проблема с моим текстовым файлом. Хотя он был пуст, значение, возвращаемое методом readLine, не было нулевым. Поэтому я попытался присвоить его значение массиву String, который я использовал для доступа к раздробленным атрибутам моих данных. Это работало для меня. Попробуйте это и скажите мне, работает ли он для u.
Идея вашего первого фрагмента права. Вероятно, вы хотели проверить iByteCount == -1
: есть ли файл по крайней мере один байт:
if (iByteCount == -1)
System.out.println("NO ERRORS!");
else
System.out.println("SOME ERRORS!");
Теперь оба этих метода терпят неудачу, когда файл журнала пуст (не имеет содержимого), но размер файла не равен нулю (2 байта).
На самом деле, я думаю, вы обнаружите, что файл НЕ пуст. Скорее я думаю, что вы обнаружите, что эти два персонажа - это CR и NL; то есть файл состоит из одной пустой строки.
Если вы хотите проверить, является ли файл пустым или имеет одну пустую строку, простой, относительно эффективный способ:
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!");
}
}
Можем ли мы сделать это более эффективно? Возможно. Это зависит от того, как часто вам приходится иметь дело с тремя различными случаями:
Вероятно, вы можете сделать лучше, используя Files.length()
и/или просто считывая первые два байта. Однако проблемы включают в себя:
0x0d
и 0x0a
. (Например... UTF-16)Все это означает, что наиболее эффективное возможное решение будет довольно сложным.
Я думаю, что лучший способ - использовать file.length == 0
.
Иногда возможно, что первая строка пуста.
Украден из 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!!");
}
Обновлено: Мой первый ответ был преждевременным и содержал ошибку.