|
Java IO
I. Java. Io
1) Input/Output Streams
· Files
· Pipes
· Network Connections
· In-memory Buffers (e.g. arrays)
· System.in, System.out, System.error
2) Purposes
| Byte Based | Character Based | ||
| Input | Output | Input | Output |
Basic | InputStream | OutputStream | Reader | Writer |
Arrays | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
Files | FileInputStream | FileOutputStream | FileReader | FileWriter |
Pipes | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
Buffering | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
Filtering | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
Parsing | PushbackInputStream |
| PushbackReader |
|
Strings |
|
| StringReader | StringWriter |
Data | DataInputStream | DataOutputStream |
| |
Data - Formatted |
| PrintStream |
| PrintWriter |
Objects | ObjectInputStream | ObjectOutputStream |
|
|
Utilities | SequenceInputStream |
|
|
|
3) Files processing
· File
· RandomAcessFile
· FileInputStream / FileOutputStream
4) Pipes
Позволяют осуществлять взаимодействие нескольких потоков.
· PipedInputStream
· PipedOutpuStream
PipedOutputStream output = new PipedOutputStream();
PipedInputStream input = new PipedOutputStream(output);
Данные записанные одним потоком с помощью pipedOutputStream могут быть считаны другим потоком с помощью pipedInputStream, соединенного с pipedOutputStream.
Операции чтения и записи должны происходить в разных потоках. Так как операции read(), write() являются блокирущими, то попытка читать и писать в Pipe в одном и том же потоке приведет к deadlock (склинивание).
5) Networking
Потоки ввода/вывода повсеместно используются в работе с сетевыми интерфейсами в java. Однако более подробно мы рассмотрим этот вопрос при рассмотрении java.net
6) ByteArrayInputStream/ByteArrayOutputStream
Input
byte[] bytes = new byte[1024];//write data into byte array...InputStream input = new ByteArrayInputStream(bytes);//read data from InputStream.Output
OutputStream output = new ByteArrayOutputStream();//write data to output stream...byte[] bytes = output.toByteArray();7) Read data from file
// Упомянуть про отличия buffered input stream
· При помощи InputStream
bufferedInput = new BufferedInputStream(new FileInputStream(filename));· При помощи BufferedReader
String sCurrentLine; br = new BufferedReader(new FileReader("C: \\ testing.txt")); while ((sCurrentLine = br.readLine())!= null) { System.out.println(sCurrentLine); }
8) Read string from file
Данная задача является довольно распространенной, если есть необходимость считать текст из файла. Сделать это можно:
· При помощи ByfferedReader как показано выше
· При помощи Scanner
· Считывая массивы символов/байт
· При помощи Apache IOUtils.toString
9) System.out, System.err, System.in
Данные потоки ввода/вывода инициализируются при старте JVM
· System.in
Потока ввода, по умолчанию отслеживающий клавиатуру
· System.out
Поток вывода, по умолчанию пишущий данные в консоль
· System.err
Используется для вывода ошибок.
II. Java.nio
Данный пакет является более новым и совершенным по сравнению с java.io и позволяет осуществлять неблокирующий ввод/вывод данных.
1) Channels
Данные сущности позволяют писать и считывать буферы (аналогичны массивам)
Наиболее важные имплементации:
· FileChannel
· DatagramChannel
· SocketChannel
· ServerSocketChannel
Основным отличием каналов от потоков ввода/вывода является возможно осуществления асинхронного неблокирующего ввода/вывода.
2) Buffers
Данные сущности пишутся в Channel или считываются из него. Типичный алгоритм работы с Buffer состоит из 4 шагов:
· Запись данных в буфер
· Вызов buffer.flip()
· Ивзлечение данных из буфера
· Вызов buffer.clear() (очищает весь буфер) или buffer.compact() (очищает только считанные данные, остальное же сдвигает в начало буфера)
Так же необходимо знать 3 основных параметра буфера:
· Position – текущее положение указателя (от 0 до capacity -1)
· limit – описывает количество записанных данных
· capacity – описывает максимальный размер буфера
Основные типы буферов:
· ByteBuffer
· CharBuffer
· DoubleBuffer
· FloatBuffer
· IntBuffer
· LongBuffer
· ShortBuffer
Основные операции:
· Allocation
Инициализация (выделение памяти) буфера осуществляется статическим методом allocate(int capacity). Например ByteBuffer.allocate(48);
· Flip – переключение буфера на запись\чтение
· Rewind() – возврат указателя (корретки) в начало. После чего данные в буфере могут быть перезаписаны
· Clear()/compact() –были рассмотрены выше
· Mark()/reset() – помечаетпозицию в буфере и возвращает указатель на нее соответсвенно.
3) Типичный пример считывания данных с помощью channel
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel(); ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buf); while (bytesRead!= -1) { buf.flip();// do something with data buf.clear(); bytesRead = inChannel.read(buf); } aFile.close();
4) Selectors
Позволяют одному потоку отслеживать несколько Channel
Пример использования:
Selector selector = Selector.open();channel.configureBlocking(false);SelectionKey key = channel.register(selector, SelectionKey.OP_READ);while(true) { int readyChannels = selector.select(); if(readyChannels == 0) continue; Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); while(keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if(key.isAcceptable()) { // a connection was accepted by a ServerSocketChannel. } else if (key.isConnectable()) { // a connection was established with a remote server. } else if (key.isReadable()) { // a channel is ready for reading } else if (key.isWritable()) { // a channel is ready for writing } keyIterator.remove(); }}
Дата добавления: 2015-11-04; просмотров: 46 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
Реализовать конструктор, методы get и set, toString (вывод в виде ‘a/b’) | | | Given a year number. Output the number of days of that year. |