Я имею дело с проблемами, вызванными файлами, которые не были надлежащим образом завершены символом EOF.
Как определить, содержит ли файл правильный EOF, и правильно ли добавить его, если он отсутствует в Java/Scala?
Я имею дело с проблемами, вызванными файлами, которые не были надлежащим образом завершены символом EOF.
Собственно, я сомневаюсь, что это правда. Сверху моей головы я не могу думать о какой-либо основной операционной системе, где необходимо закончить файл с символом EOF. (В этой статье объясняется миф о "характере EOF" и почему ни ^ Z, ни ^ D не являются символами EOF. Да, некоторые оболочки интерпретируют один или другой как "маркеры EOF" при чтении входного потока пользователя через консоль, но это особый случай... и ваше приложение, конечно, не увидит ^ Z или ^ D, когда он прочитает поток.)
Возможно, вы закодировали приложение, чтобы ожидать какого-либо характера EOF. Если у вас есть, то лучшим решением, вероятно, является исправление приложения. (Я не могу придумать вескую причину для разработки приложения для работы таким образом...)
Возможно также, что ваша настоящая проблема - это нечто иное. Например, у вас могут быть файлы, в которых последняя строка не заканчивается распознаваемой последовательностью конца строки. Это, как известно, вызывает проблемы для некоторых классических утилит Linux/Unix.
Ради полноты, вот ответ на заданный вами вопрос.
Как определить, содержит ли файл правильный EOF, и правильно ли добавить его, если он отсутствует в Java/Scala?
Способ узнать, не завершился ли файл конкретным символом (например, ^ Z), - просто прочитать последний символ файла и проверить его. Например, в Java (untested):
import java.io.*;
public class TestForArcaneEOF {
public static void main(String[] args) throws IOException {
Reader reader;
if (args.length == 0) {
reader = new InputStreamReader(System.in);
} else {
reader = new FileReader(args[0]);
}
reader = new BufferedReader(reader);
int last = 0;
int ch;
while ((ch = reader.read()) != -1) {
last = ch;
}
if (last == 0x1a) {
System.out.println("Ends with ^Z");
} else {
System.out.println("Doesn't end with ^Z");
}
}
}
Добавление символа (например, ^ Z) в конце файла еще проще: