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

Чтение с файла и полезные библиотеки 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. Способ 1 использует InputStreamReader и Способ 2 использует FileReader. В чем разница между этими двумя классами? 

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

Разница между этими двумя методами, что использовать для конструктора 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 не нужно их подавлять(хотя так код никогда не падает..... шутка) В примерах мы их подавляли ну это просто из-за лени.

 

comments powered by Disqus

Интересное

Стив Джобс о Mac OS X:
«Я убежден в том, что половина того что отделяет успешных предпринимателей от неудачников — это настойчивость.».
Марк Эллиот Цукерберг:
«Люди всегда немного скептически относятся к чему-то быстрорастущему, но им нужно просто взглянуть на то, что делается.».
Марк Эллиот Цукерберг:
"Множество конфиденциальных вещей намного проще держать в централизованной системе."
Стив Джобс о операционной системе Google Android:
Мы не лезем в поиск, но они решили заняться телефонами. Не надо заблуждаться, они хотят уничтожить iPhone. Мы им не позволим.
Стив Джобс о Mac OS X:
«Мы сделали значки на экране такими красивыми, что вам захочется их лизнуть».


Курсы валют

bank-ua.com bank-ua.com bank-ua.com

Стоит взглянуть