Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

· In-memory Buffers (e.g. arrays)



 

 

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
InputStreamReader

Writer
OutputStreamWriter

Arrays

ByteArrayInputStream

ByteArrayOutputStream

CharArrayReader

CharArrayWriter

Files

FileInputStream
RandomAccessFile

FileOutputStream
RandomAccessFile

FileReader

FileWriter

Pipes

PipedInputStream

PipedOutputStream

PipedReader

PipedWriter

Buffering

BufferedInputStream

BufferedOutputStream

BufferedReader

BufferedWriter

Filtering

FilterInputStream

FilterOutputStream

FilterReader

FilterWriter

Parsing

PushbackInputStream
StreamTokenizer

 

PushbackReader
LineNumberReader

 

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));

int bytesRead = 0;

while ((bytesRead = bufferedInput.read(buffer))!= -1) {

//Process the chunk of bytes read
}

· При помощи 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.

mybiblioteka.su - 2015-2024 год. (0.013 сек.)