InputStreamReader и OutputStreamWriter
Пакет java.ioпредоставляет классы, которые позволяют выполнять конвертацию между символьными потоками Unicode и байтовыми потоками не-Unicode текста. При помощи класса InputStreamReaderсуществует возможность преобразовывать байтовые потоки в символьные потоки. Для перевода символьных потоков в байтовые потоки используется класс OutputStreamWriter.
При создании объектов InputStreamReader и OutputStreamWriter, задается байтовая кодировка, в которую необходимо выполнить преобразование. Например, чтобы перевести текстовый файл в кодировке UTF-8 в Unicode, необходимо сделать следующее:
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF8");
Если не указать идентификатор кодировки, InputStreamReader и OutputStreamWriter будут обращаться к кодировке по умолчанию. Вы можете определить кодировку, используемую InputStreamReader или OutputStreamWriter, вызвав метод getEncoding, таким образом:
InputStreamReader defaultReader = new InputStreamReader(fis);
String defaultEncoding = defaultReader.getEncoding();
Пример для разбора
Пусть необходимо разработать программу, подсчитывающую количество определенного слова в файле. В качестве параметров в командной строке передаются:
имя файла
кодировка файла
слово для подсчета
import java.io.*;
import java.util.Scanner;
public class Reader
{
private static String _encoding;
private static String _string;
public static void main(String[] args)
{
if (args.length != 3)
{
System.out.println("Wrong number of input arguments");
return;
}
File testFile = new File(args[0]);
_encoding = args[1];
_string1 = args[2];
String contents = GetContents(testFile);
System.out.print("File contents:\r\n" + contents);
System.out.println("--------------------------------------------");
Analyze(contents);
}
static public String GetContents(File file)
{
StringBuilder contents = new StringBuilder();
try
{
if (file == null)
{
throw new IllegalArgumentException("File should not be null.");
}
if (!file.exists())
{
throw new FileNotFoundException();
}
if (!file.canRead())
{
throw new IllegalArgumentException("File cannot be written: " + file);
}
if (!file.isFile())
{
throw new IllegalArgumentException("Should not be a directory: " + file);
}
FileInputStream fis = new FileInputStream(file);
InputStreamReader in = new InputStreamReader(fis, _encoding);
BufferedReader input = new BufferedReader(in);
try
{
String line = null;
while ((line = input.readLine()) != null)
{
contents.append(line + "\r\n");
}
}
finally
{
input.close();
}
}
catch (FileNotFoundException ex)
{
System.out.println("File does not exist: " + file);
}
catch(IllegalArgumentException ex)
{
System.out.println(ex.getMessage());
}
catch (Exception ex)
{
ex.printStackTrace();
}
return contents.toString();
}
private static void Analyze(String contents)
{
Scanner scanner = new Scanner(contents);
int stringCount = 0;
while (scanner.hasNextLine())
{
Scanner s = new Scanner(scanner.nextLine());
while (s.hasNext())
{
String word = s.next();
if (word.contentEquals(_string))
stringCount++;
}
s.close();
}
scanner.close();
System.out.println(_string + " — " + stringCount);
}
}