Потоки
Иерархия классов символьных потоков вывода
Класс Writer
Класс OutputStreamWriter
Класс FileWriter
Запись в файл по одному символу
Запись в файл массива символов
Запись в файл массива символов
Запись строки в файл
Запись строки в файл
Запись строки в файл в кодировке UTF-16
Запись строки в файл в кодировке UTF-16
Класс BufferedWriter
Опустошение буфера
Опустошение буфера
Производительность буферизованного вывода
Производительность небуферизованного вывода
Почему такой маленький выигрыш?
Иерархия классов символьных потоков ввода
Класс Reader
Класс InputStreamReader
Класс FileReader
Чтение из файла по одному символу
Чтение из файла массива символов
Чтение символов из файла в кодировке UTF-16
Класс BufferedReader
Производительность буферизованного ввода
Производительность небуферизованного ввода
Почему такой маленький выигрыш?
1.07M
Category: programmingprogramming

Ввод - вывод. Символьные потоки

1.

2.

V. Ввод - вывод
3. Символьные потоки
2

3. Потоки

Объект из которого можно прочитать последовательность char называется символьный
поток ввода. Объект в который можно записать последовательность char называется
символьный поток вывода. Классы символьных потоков ввода являются подклассами
абстрактного класса Reader, а потоков вывода – подклассами абстрактного класса
Writer. Классы символьных потоков находятся в пакете java.io.
3

4.

Потоки вывода
4

5. Иерархия классов символьных потоков вывода

Шаблон Декоратор: Иерархия классов
символьных потоков вывода является
примером применения шаблона Декоратор.
5

6. Класс Writer

public
public abstract
abstract class
class Writer
Writer {{
public
public void
void write(int
write(int c)
c) throws
throws IOException
IOException {{
synchronized
synchronized (lock)
(lock) {{
if
if (writeBuffer
(writeBuffer ==
== null){
null){
writeBuffer
writeBuffer == new
new char[writeBufferSize];
char[writeBufferSize];
}}
writeBuffer[0]
writeBuffer[0] == (char)
(char) c;
c;
write(writeBuffer,
write(writeBuffer, 0,
0, 1);
1);
}}
}}
public
public void
void write(char
write(char cbuf[])
cbuf[]) throws
throws IOException
IOException
abstract
abstract public
public void
void write(char
write(char cbuf[],
cbuf[], int
int off,
off, int
int len)
len) throws
throws IOException;
IOException;
public
public
public
public
}}
void
void
void
void
write(String
write(String
write(String
write(String
str)
str)
str,
str,
throws
throws IOException
IOException
int
off,
int off, int
int len)
len) throws
throws IOException
IOException
abstract
abstract public
public void
void flush()
flush() throws
throws IOException;
IOException;
abstract
abstract public
public void
void close()
close() throws
throws IOException;
IOException;
C
A
Абстрактный класс Writer – базовый класс для символьных потоков вывода. Для вывода диапазона элементов
массива char в нём объявлен абстрактный метод write. Конкретные классы потомки должны переопределять
этот метод. Как правило потомки переопределяют и другие методы write более эффективными реализациями.
Класс содержит абстрактные методы close и flush. Метод close предназначен для закрытия потока и
освобождения неуправляемых ресурсов после окончания записи. Метод flush предназначен для опустошения
буфера если поток буферизованный. Как правило реализации close вызывают flush.
6

7. Класс OutputStreamWriter

public
public class
class OutputStreamWriter
OutputStreamWriter extends
extends Writer
Writer {{
private
StreamEncoder
se;
se
private final
final StreamEncoder
StreamEncoder se
se;
public
OutputStream out
out ))
public OutputStreamWriter(
OutputStreamWriter( OutputStream
public
String
charsetName
public OutputStreamWriter(
OutputStreamWriter( OutputStream
OutputStream out
out ,, String
String charsetName
charsetName ))
public
public
public
public
public
public
void
void
void
void
void
void
write(int
write(int c)
c) throws
throws IOException
IOException
write(char
cbuf[],
int
write(char cbuf[], int off,
off, int
int len)
len) throws
throws IOException
IOException
write(String
write(String str,
str, int
int off,
off, int
int len)
len) throws
throws IOException
IOException
public
public String
String getEncoding()
getEncoding()
}}
public
public void
void flush()
flush()
public
public void
void close()
close()
C
Класс OutputStreamWriter предназначен для превращения символов в байты с помощью кодировки и записи
полученных байтов в байтовый поток вывода. Кодировку можно задать в конструкторе. Если кодировка не
задаётся используется кодировка по умолчанию.
7

8. Класс FileWriter

public
public class
class FileWriter
FileWriter extends
extends OutputStreamWriter
OutputStreamWriter {{
public
public FileWriter(File
FileWriter(File file)
file) throws
throws IOException
IOException {{
super(new
FileOutputStream(file));
FileOutputStream(file)
super(new FileOutputStream(file)
FileOutputStream(file));
}}
}}
public
public FileWriter(File
FileWriter(File file,
file, boolean
boolean append)
append) throws
throws IOException
IOException {{
super(new
FileOutputStream(file,
append));
super(new FileOutputStream(file,
FileOutputStream(file, append)
append));
FileOutputStream(file,
append)
}}
C
Класс FileWriter предназначен для записи последовательности char в файл. Объект класса
FileOutputStream это OutputStreamWriter для записи в байтовый файловый поток вывода. При
использовании FileOutputStream всегда используется кодировка по умолчанию.
8

9. Запись в файл по одному символу

public
public class
class WriteCharDemo
WriteCharDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
FileWriter
FileWriter out
out == null;
null;
}}
}}
try
try {{
out
out == new
new FileWriter("I:\\FileIO\\charfile.txt");
FileWriter("I:\\FileIO\\charfile.txt");
for
for (int
(int ii == 0x0410;
0x0410; ii << 0x0450;
0x0450; i++)
i++) {{
System.out.print((char)i);
System.out.print((char)i);
out.write(i);
out.write(i);
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (out
(out !=
!= null)
null)
out.close();
out.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя
9

10. Запись в файл массива символов

public
public class
class WriteCharsDemo
WriteCharsDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
FileWriter
FileWriter out
out == null;
null;
char[]
char[] chars
chars == new
new char[64];
char[64];
for
for (int
(int ii == 0;
0; ii << 64;
64; i++)
i++) {{
chars[i]
chars[i] == (char)
(char) (0x0410
(0x0410 ++ i);
i);
}}
System.out.println(Arrays.toString(chars));
System.out.println(Arrays.toString(chars));
}}
}}
try
try {{
out
out == new
new FileWriter("I:\\FileIO\\charsfile.txt");
FileWriter("I:\\FileIO\\charsfile.txt");
out.write(chars);
out.write(chars);
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (out
(out !=
!= null)
null)
out.close();
out.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
[А,
[А, Б,
Б, В,
В, Г,
Г, Д,
Д, Е,
Е, Ж,
Ж, З,
З, И,
И, Й,...,
Й,..., Щ,
Щ, Ъ,
Ъ, Ы,
Ы, Ь,
Ь, Э,
Э, Ю,
Ю, Я,
Я, а,
а, б,
б, в,
в, г,
г, д,
д, е,
е, ж,
ж, з,
з, и,
и, й,...,
й,..., щ,
щ, ъ,
ъ, ы,
ы, ь,
ь, э,
э, ю,
ю,
я]
я]
10

11. Запись в файл массива символов

11

12. Запись строки в файл

public
public class
class WriteStringDemo
WriteStringDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws IOException
IOException {{
String
String source
source == "Hello
"Hello World!";
World!";
FileWriter
out
=
null;
FileWriter out = null;
System.out.println("String
System.out.println("String to
to write:
write: "" ++ source
source );
);
System.out.println("Default
System.out.println("Default charset
charset (encoding):
(encoding): "" ++ Charset.defaultCharset());
Charset.defaultCharset());
System.out.println("String
System.out.println("String bytes
bytes using
using default
default encoding:
encoding: "" ++ Arrays.toString(source.getBytes()));
Arrays.toString(source.getBytes()));
}}
}}
try
try {{
out
out == new
new FileWriter("I:\\FileIO\\stringfile.dat");
FileWriter("I:\\FileIO\\stringfile.dat");
out.write(source);
out.write(source);
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
{
finally {
try
try {{
if
if (out
(out !=
!= null)
null)
out.close();
out.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
String
String to
to write:
write: Hello
Hello World!
World!
Default
charset
(encoding):
Default charset (encoding): windows-1251
windows-1251
String
String bytes
bytes using
using default
default encoding:
encoding: [72,
[72, 101,
101, 108,
108, 108,
108, 111,
111, 32,
32, 87,
87, 111,
111, 114,
114, 108,
108, 100,
100, 33]
33]
12

13. Запись строки в файл

13

14. Запись строки в файл в кодировке UTF-16

public
public class
class WriteEncodingDemo
WriteEncodingDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws UnsupportedEncodingException{
UnsupportedEncodingException{
String
String
Writer
Writer
source
source == "Hello
"Hello World!";
World!";
out
=
null;
out = null;
System.out.println("String
System.out.println("String to
to write:
write: "" ++ source
source );
);
System.out.println("String
System.out.println("String bytes
bytes using
using UTF-16:
UTF-16: "" ++ Arrays.toString(source.getBytes("UTF-16")));
Arrays.toString(source.getBytes("UTF-16")));
try
try {{
FileOutputStream
FileOutputStream os
os == new
new FileOutputStream("I:\\FileIO\\WriteString.txt");
FileOutputStream("I:\\FileIO\\WriteString.txt");
out
out == new
new OutputStreamWriter(os,
OutputStreamWriter(os, "UTF-16");
"UTF-16");
}}
}}
out.write(source);
out.write(source);
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (out
(out !=
!= null)
null)
out.close();
out.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
String
String to
to write:
write: Hello
Hello World!
World!
String
String bytes
bytes using
using UTF-16:
UTF-16:
[-2,
[-2, -1,
-1, 0,
0, 72,
72, 0,
0, 101,
101, 0,
0, 108,
108, 0,
0, 108,
108, 0,
0, 111,
111, 0,
0, 32,
32, 0,
0, 87,
87, 0,
0, 111,
111, 0,
0, 114,
114, 0,
0, 108,
108, 0,
0, 100,
100, 0,
0, 33]
33]
14

15. Запись строки в файл в кодировке UTF-16

При кодировании
строки в UTF-16
добавляется BOM.
15

16.

Буферизованный вывод
16

17. Класс BufferedWriter

public
public class
class BufferedWriter
BufferedWriter extends
extends Writer
Writer {{
private
private Writer
Writer out;
out;
private
private
private
private
private
private
char
char cb[];
cb[];
int
int nChars,
nChars, nextChar;
nextChar;
static
static int
int defaultCharBufferSize
defaultCharBufferSize == 8192;
8192;
public
public
public
public
BufferedWriter(Writer
BufferedWriter(Writer
BufferedWriter(Writer
BufferedWriter(Writer
public
public
public
public
public
public
void
void
void
void
void
void
out)
out)
out,
out, int
int sz)
sz)
write(int
write(int c)throws
c)throws IOException
IOException
write(char
write(char cbuf[],
cbuf[], int
int off,
off, int
int len)
len) throws
throws IOException
IOException
write(String
write(String s,
s, int
int off,
off, int
int len)
len) throws
throws IOException
IOException
public
public void
void flush()
flush() throws
throws IOException
IOException {{
...
...
out.flush();
out.flush();
...
...
}}
}}
public
public void
void close()
close() throws
throws IOException
IOException {{
...
...
out.close();
out.close();
...
...
}}
C
При использовании буферизованного потока вывода данные могут накапливаться в буфере и
выводиться при наполнении буфера. Таким образом можно снизить количество операций записи в
оборачиваемый поток и повысить эффективность.
17

18. Опустошение буфера

public
public class
class WriteFlushDemo
WriteFlushDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws IOException
IOException {{
String
String source
source == "Hello
"Hello World!";
World!";
BufferedWriter
BufferedWriter out1
out1 == null;
null;
BufferedWriter
BufferedWriter out2
out2 == null;
null;
System.out.println("String
System.out.println("String to
to write:
write: "" ++ source
source );
);
try
try {{
out1
out1
out2
out2
==
==
new
new
new
new
BufferedWriter(new
BufferedWriter(new
BufferedWriter(new
BufferedWriter(new
FileWriter("I:\\FileIO\\file1.txt"));
FileWriter("I:\\FileIO\\file1.txt"));
FileWriter("I:\\FileIO\\file2.txt"));
FileWriter("I:\\FileIO\\file2.txt"));
out1.write(source);
out1.write(source);
out2.write(source);
out2.write(source);
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (out1
(out1 !=
!= null)
null)
out1.close();
out1.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
String
String to
to write:
write: Hello
Hello World!
World!
18

19. Опустошение буфера

19

20. Производительность буферизованного вывода

public
public class
class WriteBufPerform
WriteBufPerform {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws IOException
IOException {{
BufferedWriter
BufferedWriter outbuf
outbuf == null;
null;
FileWriter
FileWriter out
out == null;
null;
long
long time
time == System.currentTimeMillis();
System.currentTimeMillis();
try
{
try {
outbuf
outbuf == new
new BufferedWriter(new
BufferedWriter(new FileWriter(
FileWriter(
"I:\\FileIO\\outbuf.txt"));
"I:\\FileIO\\outbuf.txt"));
for
for (int
(int ii == 0;
0; ii << 10000000;
10000000; i++)
i++) {{
outbuf.write(65);
outbuf.write(65);
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (outbuf
(outbuf !=
!= null)
null)
outbuf.close();
outbuf.close();
}} catch
catch (Exception
(Exception e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
time
time == System.currentTimeMillis()
System.currentTimeMillis() -- time;
time;
System.out.println("Buffered
System.out.println("Buffered output
output time:
time: "" ++ time);
time);
}}
}}
...
...
20

21. Производительность небуферизованного вывода

public
public class
class WriteBufPerform
WriteBufPerform {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws IOException
IOException {{
...
...
time
time ==
try
try {{
out
out
}}
}}
System.currentTimeMillis();
System.currentTimeMillis();
== new
new FileWriter("I:\\FileIO\\outnobuf.txt");
FileWriter("I:\\FileIO\\outnobuf.txt");
for
for (int
(int ii == 0;
0; ii << 10000000;
10000000; i++)
i++) {{
out.write(65);
out.write(65);
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (out
(out !=
!= null)
null)
out.close();
out.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
time
time == System.currentTimeMillis()
System.currentTimeMillis() -- time;
time;
System.out.println("Non-buffered
System.out.println("Non-buffered output
output time:
time: "" ++ time);
time);
Buffered
Buffered output
output time:
time: 516
516
Non-buffered
Non-buffered output
output time:
time: 1469
1469
21

22. Почему такой маленький выигрыш?

Для байтовых потоков благодаря использованию буфера был
получен выигрыш в 100 раз. При использовании аналогичного
буфера для символьных потоков выигрыш был в 3 раза. Дело в
том, что символьные потоки уже буферизованы. В классе
StreamEncoder есть буфер.
22

23.

Потоки ввода
23

24. Иерархия классов символьных потоков ввода

Шаблон Декоратор: Иерархия классов
символьных
потоков
ввода
является
примером применения шаблона Декоратор.
24

25. Класс Reader

public
public abstract
abstract class
class Reader
Reader {{
public
public int
int read()
read() throws
throws IOException
IOException {{
char
char cb[]
cb[] == new
new char[1];
char[1];
if
if (read(cb,
(read(cb, 0,
0, 1)
1) ==
== -1)
-1)
return
return -1;
-1;
else
else
return
return cb[0];
cb[0];
}}
public
public int
int read(char
read(char cbuf[])
cbuf[]) throws
throws IOException
IOException {{
return
return read(cbuf,
read(cbuf, 0,
0, cbuf.length);
cbuf.length);
}}
public
public abstract
abstract int
int read(char[]
read(char[] cbuf,
cbuf, int
int off,
off, int
int len)
len) throws
throws IOException;
IOException;
}}
public
public abstract
abstract void
void close()
close() throws
throws IOException;
IOException;
C
A
Абстрактный класс Reader – базовый класс для символьных потоков ввода. Для чтения в диапазон элементов
массива char в нём объявлен абстрактный метод read. Определения этого метода в потомках должны
возвращать число char которое удалось считать или -1 если ни одного char считать нельзя из-за того что
достигнут конец потока. Для чтения одного char в нём объявлен метод read этот метод считывает один char и
возвращает его значение или -1 если он встретил конец потока. По этой причине тип возвращаемого значения
int а не char. Конкретные классы потомки должны переопределять абстрактный метод read. Как правило потомки
переопределяют и другие методы read более эффективными реализациями. Класс содержит абстрактный
методы close. Метод close предназначен для закрытия потока и освобождения неуправляемых ресурсов после
окончания чтения.
25

26. Класс InputStreamReader

public
public class
class InputStreamReader
InputStreamReader extends
extends Reader
Reader {{
private
sd;
private final
final StreamDecoder
StreamDecoder
StreamDecoder sd
sd
sd;
InputStreamReader(
InputStream
in)
InputStream
in
InputStreamReader( InputStream
InputStream in
in)
InputStreamReader(
InputStream
in
String charsetName
charsetName ))
InputStreamReader( InputStream
InputStream in
in ,, String
InputStream
in
public
public int
int read()
read() throws
throws IOException
IOException
public
public int
int read(char[]
read(char[] cbuf,
cbuf, int
int off,
off, int
int len)
len) throws
throws IOException
IOException
}}
String
String getEncoding()
getEncoding()
void
void close()
close()
C
Класс InputStreamReader предназначен для чтения байтов из байтового потока ввода и превращения их в
символы c помощью кодировки. Кодировку можно задать в конструкторе. Если кодировка не задаётся
используется кодировка по умолчанию.
26

27. Класс FileReader

public
public class
class FileReader
FileReader extends
extends InputStreamReader
InputStreamReader {{
public
public FileReader(String
FileReader(String fileName)
fileName) throws
throws FileNotFoundException
FileNotFoundException {{
super(new
super(new FileInputStream(fileName));
FileInputStream(fileName));
}}
}}
C
Класс FileReader предназначен для чтения последовательности char из файла. Объект класса FileReader
это InputStreamReader для чтения из байтового файлового потока ввода. При использовании FileReader
всегда используется кодировка по умолчанию.
27

28. Чтение из файла по одному символу

public
public class
class ReadCharDemo
ReadCharDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws IOException
IOException {{
FileReader
FileReader in
in == null;
null;
int
int temp;
temp;
try
try {{
in
in == new
new FileReader("I:\\FileIO\\charfile.txt");
FileReader("I:\\FileIO\\charfile.txt");
for
(int
i
for (int i == 0;
0; ii << 64;
64; i++)
i++) {{
temp
temp == in.read();
in.read();
if
if (temp
(temp ==
== -1)
-1)
break;
break;
System.out.print((char)temp);
System.out.print((char)temp);
}}
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (in
(in !=
!= null)
null)
in.close();
in.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя
АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя
28

29. Чтение из файла массива символов

public
public class
class ReadCharsDemo
ReadCharsDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws IOException
IOException {{
FileReader
FileReader in
in == null;
null;
try
try {{
in
in == new
new FileReader("I:\\FileIO\\charfile.txt");
FileReader("I:\\FileIO\\charfile.txt");
char[]
char[] chars
chars == new
new char[64];
char[64];
int
int nread
nread == in.read(chars);
in.read(chars);
if
if (nread
(nread >> 0)
0) {{
System.out.println("Read
System.out.println("Read "" ++ nread
nread ++ "" characters");
characters");
System.out.println(Arrays.toString(chars));
System.out.println(Arrays.toString(chars));
}}
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
{
finally {
try
try {{
if
if (in
(in !=
!= null)
null)
in.close();
in.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
Read
Read 64
64 characters
characters
[А,
Б,
В,
[А, Б, В, Г,
Г, Д,
Д, Е,
Е, Ж,
Ж, З,
З, И,
И, Й,...,
Й,..., Щ,
Щ, Ъ,
Ъ, Ы,
Ы, Ь,
Ь, Э,
Э, Ю,
Ю, Я,
Я, а,
а, б,
б, в,
в, г,
г, д,
д, е,
е, ж,
ж, з,
з, и,
и, й,...,
й,..., щ,
щ, ъ,
ъ, ы,
ы, ь,
ь, э,
э, ю,
ю,
я]
я]
29

30. Чтение символов из файла в кодировке UTF-16

public
public class
class ReadEncodingDemo
ReadEncodingDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws Exception
Exception {{
FileInputStream
FileInputStream is
is == new
new FileInputStream("I:\\FileIO\\writeutf16.txt");
FileInputStream("I:\\FileIO\\writeutf16.txt");
Reader
Reader in
in == new
new InputStreamReader(is,
InputStreamReader(is, "UTF-16");
"UTF-16");
}}
}}
int
int data
data == in.read();
in.read();
while
while (data
(data !=
!= -1)
-1) {{
char
char dataChar
dataChar == (char)
(char) data;
data;
data
data == in.read();
in.read();
System.out.print(dataChar);
System.out.print(dataChar);
}}
in.close();
in.close();
Hello
Hello World!
World!
30

31.

Буферизованный ввод
31

32. Класс BufferedReader

public
public class
class BufferedReader
BufferedReader extends
extends Reader
Reader {{
private
private
private
private
private
private
private
private
Reader
Reader in;
in;
char
char cb[];
cb[];
int
nChars,
int nChars, nextChar;
nextChar;
static
static int
int defaultCharBufferSize
defaultCharBufferSize == 8192;
8192;
public
public BufferedReader(Reader
BufferedReader(Reader in,
in, int
int sz)
sz) {{
super(in);
super(in);
if
if (sz
(sz <=
<= 0)
0)
throw
throw new
new IllegalArgumentException("Buffer
IllegalArgumentException("Buffer size
size <=
<= 0");
0");
this.in
this.in == in;
in;
cb
cb == new
new char[sz];
char[sz];
nextChar
nextChar == nChars
nChars == 0;
0;
}}
public
public BufferedReader(Reader
BufferedReader(Reader in)
in) {{
this(in,
this(in, defaultCharBufferSize);
defaultCharBufferSize);
}}
int
int read()
read()
int
int read(char[]
read(char[] cbuf,
cbuf, int
int off,
off, int
int len)
len)
String
String readLine()
readLine()
}}
public
public void
void close()
close() throws
throws IOException
IOException {{
...
...
out.close();
out.close();
...
...
}}
C
При использовании буферизованного потока ввода данные читаются в буфер из оборачиваемого потока
большими порциями а затем по мере необходимости читаются уже из буфера. Таким образом можно
снизить количество операций чтения из оборачиваемого потока и повысить эффективность.
32

33. Производительность буферизованного ввода

public
public class
class ReadBufPerform
ReadBufPerform {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws IOException
IOException {{
BufferedReader
BufferedReader inbuf
inbuf == null;
null;
FileReader
FileReader in
in == null;
null;
int
int temp;
temp;
long
long time
time == System.currentTimeMillis();
System.currentTimeMillis();
try
try {{
inbuf
inbuf == new
new BufferedReader(new
BufferedReader(new FileReader("I:\\FileIO\\outbuf.txt"));
FileReader("I:\\FileIO\\outbuf.txt"));
}}
}}
for
for (int
(int ii == 0;
0; ii << 10000000;
10000000; i++)
i++) {{
temp
temp == inbuf.read();
inbuf.read();
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (inbuf
(inbuf !=
!= null)
null)
inbuf.close();
inbuf.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
...
...
33

34. Производительность небуферизованного ввода

public
public class
class ReadBufPerform
ReadBufPerform {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws IOException
IOException {{
...
...
time
time == System.currentTimeMillis();
System.currentTimeMillis();
try
try {{
in
in == new
new FileReader("I:\\FileIO\\outnobuf.txt");
FileReader("I:\\FileIO\\outnobuf.txt");
}}
}}
for
for (int
(int ii == 0;
0; ii << 10000000;
10000000; i++)
i++) {{
temp
temp == in.read();
in.read();
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (in
(in !=
!= null)
null)
in.close();
in.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
time
time == System.currentTimeMillis()
System.currentTimeMillis() -- time;
time;
System.out.println("Non-buffered
input
System.out.println("Non-buffered input time:
time: "" ++ time);
time);
Buffered
Buffered input
input time:
time: 437
437
Non-buffered
Non-buffered input
input time:
time: 891
891
34

35. Почему такой маленький выигрыш?

Для байтовых потоков благодаря использованию буфера был
получен выигрыш в 30 раз. При использовании аналогичного
буфера для символьных потоков выигрыш был в 2 раза. Дело в
том что символьные потоки уже буферизованы. В классе
StreamDecoder есть буфер.
35
English     Русский Rules