Подтвердить что ты не робот

Самый эффективный способ проверить, является ли файл пустым в Java на Windows

Я пытаюсь проверить, пустой ли файл журнала (что означает отсутствие ошибок) или нет, в 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!");
4b9b3361

Ответ 1

Проверьте, что первая строка файла пуста:

BufferedReader br = new BufferedReader(new FileReader("path_to_some_file"));     
if (br.readLine() == null) {
    System.out.println("No errors, and file empty");
}

Ответ 2

Почему бы просто не использовать:

File file = new File("test.txt");

if (file.length() == 0) {
    // file empty
} else {
    // not empty
}

С этим что-то не так?

Ответ 4

Попробуйте FileReader, этот читатель предназначен для чтения потока символов, а FileInputStream предназначен для чтения необработанных данных.

Из Javadoc:

FileReader предназначен для чтения потоков символов. Для чтения потоки необработанных байтов, рассмотрите использование FileInputStream.

Поскольку вы хотите прочитать файл журнала, FileReader - это класс для использования IMO.

Ответ 5

Другой способ сделать это (используя 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());
    }        
}

Ответ 6

Это улучшение ответа 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());
    }        
}

Ответ 7

String line = br.readLine();
String[] splitted = line.split("anySplitCharacter");
if(splitted.length == 0)
    //file is empty
else
    //file is not empty

У меня была такая же проблема с моим текстовым файлом. Хотя он был пуст, значение, возвращаемое методом readLine, не было нулевым. Поэтому я попытался присвоить его значение массиву String, который я использовал для доступа к раздробленным атрибутам моих данных. Это работало для меня. Попробуйте это и скажите мне, работает ли он для u.

Ответ 8

Идея вашего первого фрагмента права. Вероятно, вы хотели проверить iByteCount == -1: есть ли файл по крайней мере один байт:

if (iByteCount == -1)  
    System.out.println("NO ERRORS!");
else
    System.out.println("SOME ERRORS!");

Ответ 9

Теперь оба этих метода терпят неудачу, когда файл журнала пуст (не имеет содержимого), но размер файла не равен нулю (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() и/или просто считывая первые два байта. Однако проблемы включают в себя:

  • Если вы оба проверяете размер файла И читаете первые несколько байтов, вы делаете 2 syscalls.
  • Фактической последовательностью завершения строки может быть CR, NL или CR NL, в зависимости от платформы. (Я знаю, что вы говорите, что это для Windows, но что произойдет, если вам нужно портировать приложение? Или если кто-то отправит вам файл без Windows?)
  • Было бы неплохо избежать установки стека потоков/считывателей, но кодировка символа файла могла отображать CR и NL в нечто, отличное от байтов 0x0d и 0x0a. (Например... UTF-16)
  • Тогда существует раздражающая привычка некоторых утилит Windows, которые помещают маркеры спецификации в кодированные файлы UTF-8. (Это даже испортило бы простую версию выше!)

Все это означает, что наиболее эффективное возможное решение будет довольно сложным.

Ответ 10

Я думаю, что лучший способ - использовать file.length == 0.

Иногда возможно, что первая строка пуста.

Ответ 11

Украден из 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!!");  
}  

Обновлено: Мой первый ответ был преждевременным и содержал ошибку.