Чтение с файла

Чтение с файла и полезные библиотеки IOUtils, UniversalDetector
Есть множество подходов к тому как читать файл. Вы вольны сами выбирать, но я хотел бы показать два метода которыми я пользовался и обьяснить отличие между ними и какому я отдаю предпочтение. И так начинаем.Метод №1:
private static void readFile1(File fin){  
FileInputStream fis;
BufferedReader br = null;
try {
fis = new FileInputStream(fin);
br = new BufferedReader(new InputStreamReader(fis));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(br);
}

Метод №2:

private static void readFile1(File fin){   
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(fin));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(br);
}
}

Оба работает для чтения текстовых файлов построчно. 

Разница между этими двумя методами, что использовать для конструктора BufferedReader. Method1 использует InputStreamReader и Method2 использует FileReader. В чем разница между этими двумя классами? От Java Doc, “InputStreamReader является мостом от потоков байтов до символьных потоков: Это читает байты и переводит их в символы, используя указанную кодировку.” InputStreamReader может обрабатывать другие потоки ввода, чем файлы, такие как сетевые соединения, классы ресурсов, ZIP файлы и т.д. FileReader является “Удобный класс для чтения файлов символов. Конструкторы этого класса предполагает, что кодирование символов по умолчанию и размер байт-буфера по умолчанию подходят.” FileReader не позволяют указать кодировку, чем кодирования платформа по умолчанию. Таким образом, это не очень хорошая идея, чтобы использовать его, если программа будет работать на системах с другой кодировке платформы. Таким образом, InputStreamReader всегда безопасный выбор, чем FileReader. Стоит упомянуть, что вместо использования / или \\ для пути, вы всегда должны использовать File.separator который может гарантировать, что разделитель всегда правильный для разных операционных систем. Также стоит заметить что очень полезные библиотеки:  – org.apache.commons.io.IOUtils – org.mozilla.universalchardet.UniversalDetector Для UniversalDetector привидем пример как можно получить кодировку файла который Вы хотите открыть:

private String getEncoding(File file) throws Exception {      
FileInputStream fis = null;
UniversalDetector detector = new UniversalDetector(null);
String encoding = null;
byte[] buf = new byte[4096];
try {
fis = new FileInputStream(file);
int nread;
while ((nread = fis.read(buf)) > 0 && !detector.isDone()) {
detector.handleData(buf, 0, nread);
}
detector.dataEnd();
encoding = detector.getDetectedCharset();
if (encoding != null) {
//do something
} else {
encoding = null;
}
} finally {
IOUtils.closeQuietly(fis);
}
return encoding;
}

Вот Вам и пища для размышления))) Думайте, смотрите и выбирайте. И помните про работу с Exception не нужно их подавлять(хотя так код никогда не падает….. шутка) В примерах мы их подавляли ну это просто из-за лени.

Please follow and like us:

Leave a Comment