Национална академия по разработка на софтуер



страница4/14
Дата25.07.2016
Размер2.68 Mb.
#6706
1   2   3   4   5   6   7   8   9   ...   14

1.2.Вход/изход в Java


В тази тема ще направим съвсем кратък преглед на най-важните класове и методи за вход и изход в Java. Всичко останало може да се намери с документацията на JDK.

Входно-изходни потоци


В езика Java входно-изходните операции са базирани на работа с потоци от данни. Потоците са канали за данни, при които достъпът се осъществява само последователно. Класовете, чрез които се осъществяват входно-изходните операции се намират в пакета java.io. Има два основни типа потоци – текстови и бинарни.

Текстови потоци


Текстовите потоци служат за четене и писане на текстова информация, а бинарните – за четене и писане на двоична информация. Базов за всички входни текстови потоци е интерфейсът java.io.Reader, а за всички изходни текстови потоци – java.io.Writer.

Четене от текстов поток


Най-важният метод от интерфейса java.io.Reader е методът read(…), който служи за четене от текстов поток и се предоставя в няколко варианта съответно с различен набор от параметри:

int read() – прочита един символ и го връща във вид на число. Връща -1 ако е достигнат края на потока. Предизвиква IOException ако възникне грешка при четенето.

int read(char[] cbuf) – прочита поредица от символи и ги записва в подадения масив. Прочита най-много толкова символа, колкото е големината на масива. Връща броя на прочетените символи или -1 ако е достигнат края на потока. Предизвиква IOException ако възникне грешка при четенето.

int read(char[] cbuf, int off, int len) – прочита поредица от символи с максимална дължина len и ги записва в подадения масив на подаденото отместване off. Връща броя на прочетените символи или -1 ако е достигнат края на потока. Предизвиква IOException ако възникне грешка при четенето.

Всяка от изброените по-горе операции е блокираща, т.е. тя блокира при извикване и не връща управлението докато не прочете някакви данни или не възникне входно-изходна грешка. Винаги при четене от текстови потоци е възможно да бъдат прочетени по-малко на брой символи, отколкото са заявени и това е една от важните особености, с които трябва да се съобразяваме, когато четем от текстови потоци.

Много удобен за четене от текстови потоци е класът java.io.BufferedReader, защото предлага метод за четене на цял текстов ред readLine(), а това често се налага.


Писане в текстов поток


Най-важният метод от интерфейса java.io.Writer е методът write(…), който служи за писане в текстов поток. Той има няколко варианта:

void write(int c) – записва единичен символ в потока. Символът е представен като число. Предизвиква IOException ако възникне грешка при писането.

void write(char[] cbuf) – записва в потока последователността от символи, съдържаща се в подадения масив. Предизвиква IOException ако възникне грешка при писането.

void write(char[] cbuf, int off, int len) – записва в потока последователността от символи, съдържаща се в подадения масив, започваща от зададената позиция и имаща зададената дължина. Предизвиква IOException ако възникне грешка при писането.

void write(String str) – записва в потока даден символен низ. Предизвиква IOException ако възникне грешка при писането.

Както и при четенето от текстов поток всяка от изброените по-горе операции е блокираща, т.е. тя блокира при извикване и не връща управлението докато не запише данните или не възникне входно-изходна грешка. Операциите за писане в поток са или напълно успешни, т.е. записват всичките указани символи, или не са успешни и предизвикват изключение.

Важна операция при работа с текстови потоци е операцията flush(). Тя предизвиква реално изпращане на записаните данни към мястото, за което са предназначени, като се грижи за изпразване на всички буфери, използвани за кеширане на изпратените данни. Без да сме извикали flush() метода не можем да сме сигурни, че данните, които сме записали в даден поток с write(…), наистина са отпътували към местоназначението си. Когато разработваме приложения, които си комуникират чрез потоци, трябва винаги да внимаваме за тази особеност.

За писане в текстови потоци е удобен и класът java.io.PrintWriter, който има метод println(…) за печатане на цяла текстова линия.

Пример за работа с текстови потоци


Един прост пример за използване на текстови потоци е показан по-долу. Примерът представлява малка програмка, която номерира редовете на текстов файл:

TextFileLineNumberInserter.java

import java.io.*;

import java.lang.*;
public class TextFileLineNumberInserter {

public static void main(String[] args) throws IOException {

FileReader inFile = new FileReader("input.txt");

BufferedReader in = new BufferedReader(inFile);
FileWriter outFile = new FileWriter("output.txt");

PrintWriter out = new PrintWriter(outFile);


int lineNumberCounter = 0;

String line;



while ( (line=in.readLine()) != null ) {

lineNumberCounter++;

out.println(lineNumberCounter + " " + line);

}
in.close();

out.close();

}

}



Въпреки че Java работи вътрешно с Unicode стрингове, текстовите потоци четат и пишат символите не в Unicode, а като използват стандартните 8-бита за символ. При писане и четене информацията се преобразува от и към Unicode по текущо-активната кодова таблица, което създава известни проблеми. Това е една от причините, заради която не можем да обработваме бинарна информация с текстови потоци.

Двоични потоци


Базов за всички входни двоични (бинарни) потоци е интерфейсът java.io.InputStream, а за всички изходни двоични потоци е интерфейсът java.io.OutputStream. Ключов метод на InputStream е методът int read(byte[] b, int off, int len), който чете данни от входния поток и ги записва в масив, а ключови методи в OutputStream са write(byte[] b, int off, int len), който изпраща данни от масив към изходния поток и flush(), който изпразва буферите и записва чакащата в тях информация към местоназначението й. Методите read(…) и write(…) при двоичните потоци са напълно аналогични на съответните методи на текстовите потоци с разликата, че работят с двоични данни, а не със символи. Тези методи също са блокиращи, при четене също връщат броя прочетени байтове, който може да е по-малък от броя заявени за прочитане байтове, а при достигане на края на потока връщат -1, също хвърлят изключение при входно-изходна грешка и при писане също или се записва всичко, или се получава изключение.

За демонстрация на двоичните потоци ще дадем пример с една програмка, която копира двоични файлове:



BinaryFileCopier.java

import java.io.*;
public class BinaryFileCopier {

public static void main(String args[]) throws IOException {

FileInputStream inFile =



new FileInputStream("input.bin");

FileOutputStream outFile =



new FileOutputStream("output.bin");

byte buf[] = new byte[1024];

while (true) {

int bytesRead = inFile.read(buf);

if (bytesRead == -1) break;

outFile.write(buf, 0, bytesRead);

}

outFile.flush();



outFile.close();

inFile.close();

}

}




Каталог: books -> inetjava
books -> В обятията на шамбала
books -> Книга се посвещава с благодарност на децата ми. Майка ми и жена ми ме научиха да бъда мъж
books -> Николай Слатински “Надеждата като лабиринт” София, Издателство “виденов & син”, 1993 год
books -> София, Издателство “Българска книжница”, 2004 год. Рецензенти доц д. ик н. Димитър Йончев, проф д-р Нина Дюлгерова Научен редактор проф д-р Петър Иванов
books -> Николай Слатински “Измерения на сигурността” София, Издателство “Парадигма”, 2000 год
books -> Книга 2 щастие и успех предисловие
books -> Превръщане на числа от една бройна система в друга
books -> Тантриското преобразяване


Сподели с приятели:
1   2   3   4   5   6   7   8   9   ...   14




©obuch.info 2024
отнасят до администрацията

    Начална страница