1 Ввод–вывод в Java Обобщенное понятие источника ввода относится к различным способам получения информации: к чтению дискового файла, символов с клавиатуры,

Презентация:



Advertisements
Похожие презентации
Java in pictures. Part 3.
Advertisements

Работа с файлами.. Процедура Assign(var f; name : String); Связывает внешний файл с именем name и переменную файлового типа f. Все дальнейшие операции.
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Ввод-вывод Java Advanced. 2Georgiy KorneevJava Advanced / Ввод-вывод Содержание 1.Потоки ввода-вывода 2.Файловый ввод-вывод и конвертация потоков 3.Фильтрующие.
Saint Petersburg, 2012 Java Lecture #04 Part I - IO.
Файловый тип данных Turbo Pascal Операции для работы с файлами 11 класс.
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Click to edit Master title style IDK1011 Основы программирования Диалоговые окна Чтение файлов и директорий.
Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. В языке Паскаль файл представляет собой последовательность.
Ввод-вывод Java Advanced. 2Georgiy KorneevJava Advanced / Ввод-вывод Содержание 1.Потоки ввода-вывода 2.Файловый ввод-вывод и конвертация потоков 3.Фильтрующие.
Interace & abstract Java Advanced (not so). 2 Interface interface Instrument { int VALUE = 5; // public, static и final! void play(Note n); // public.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Множества значений или переменных с одним общим именем называются структурированными типами. По способу организации и типу компонентов выделяют: 1. Массивы.
Изучение динамического определения типов. Класс Class. Динамическая загрузка и инстанцирование классов. В Java вся информация о классе хранится в специальном.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
b5_java_s4
Файловая переменная. Файл – совокупность данных, записанная во внешней памяти под определенным именем. Любой файл имеет три характерные особенности: уникальное.
Язык программирования Java Андрей Дмитриев ©2009.
1 Обработка исключений в Java Одно из важнейших преимуществ Java – разработанный на уровне языка механизм обработки исключений. Исключение в Java - это.
Транксрипт:

1 Ввод–вывод в Java Обобщенное понятие источника ввода относится к различным способам получения информации: к чтению дискового файла, символов с клавиатуры, либо получению данных из сети. Под обобщенным понятием вывода также могут пониматься дисковые файлы, сетевое соединение и т.п. В Java эта абстракция называется потоком (stream) и реализована в нескольких классах пакета java.io. Это единое обобщенное представление дает удобную возможность для работы с вводом-выводом (I/O), не требуя при этом, чтобы каждая часть программы понимала разницу между, скажем, клавиатурой и сетью. Ввод реализован в абстрактном классе InputStream, вывод - в OutputStream. В Java также есть несколько специализаций этих абстрактных классов, учитывающих различия при работе с дисковыми файлами, сетевыми соединениями и даже с буферами в памяти.

2 Ввод–вывод в Java File File - единственный объект в java.io, который работает непосредственно с дисковыми файлами. Хотя на использование файлов в апплетах наложены жесткие ограничения, файлы по-прежнему остаются основными ресурсами для постоянного хранения и совместного использования информации. Каталог в Java трактуется как обычный файл, но с дополнительным свойством - списком имен файлов, который можно просмотреть с помощью метода list. ЗАМЕЧАНИЕ Java правильно обрабатывает разделители имен каталогов в пути, используемые в UNIX и DOS. Если вы используете стиль UNIX - символы '/', то при работе в Windows Java автоматически преобразует их в '\'. Не забудьте, если вы привыкли к разделителям, принятым в DOS, то есть, к '\', то для того, чтобы включить их в строку пути, необходимо их удвоить, аналогично тому, как это сделано в строке \\java\\COPYRIGHT. Класс File несимметричен. Имеется широкий набор методов, позволяющих узнать свойства объекта, но соответствующие функции для изменения этих свойств отсутствуют.

3 Ввод–вывод в Java import java.io.File; class FileTest { static void p(String s) { System.out.println(s); } public static void main(String args[ ]) { File f1 = new File("/java/COPYRIGHT"); p("File Name:" + f1.getName()); p("Path:" + f1.getPath()); p("Abs Path:" + f1.getAbsolutePath()); p("Parent:" + f1.getParent()); p(f1.exists() ? "exists" : "does not exist"); p(f1.canWrite() ? "is writeable" : "is not writeable"); p(f1.canRead() ? "is readable" : "is not readable"); p("is " + (f1.isDirectory() ? " " : "not") + " a directory"); p(f1.isFile() ? "is normal file" : "might be a named pipe"); p(f1.isAbsolute() ? "is absolute" : "is not absolute"); p("File last modified:" + f1. lastModified()); p("File size:" + f1.length() + " Bytes"); } ВЫВОД File Name:COPYRIGHT Path:/java/COPYRIGHT Abs Path:/java/COPYRIGHT Parent:/java exists is writeable is readable is not a directory is normal file is absolute File last modified: File size:695 Bytes Существует также несколько сервисных методов, использование которых ограничено обычными файлами (их нельзя применять к каталогам). Метод renameTo(File dest) переименовывает файл (нельзя переместить файл в другой каталог). Метод delete уничтожает обычный дисковый файл. Каталог, даже пустой, с его помощью удалить не удастся.

4 Ввод–вывод в Java Каталоги - это объекты класса File, в которых содержится список других файлов и каталогов. Если File ссылается на каталог, его метод isDirectory возвращает значение true. В этом случае вы можете вызвать метод list и извлечь содержащиеся в объекте имена файлов и каталогов. import java.io.File; class DirList { public static void main(String args[]) { String dirname = "/java"; // имя каталога File f1 = new File(dirname); if (f1.isDirectory()) { // является ли f1 каталогом System.out.println("Directory of ' + dirname); String s[] = f1.list(); for ( int i=0; i < s.length; i++) { File f = new File(dirname + "/" + s[i]); if (f.isDirectory()) { // является ли f каталогом System.out.println(s[i] + " is a directory"); } else { System.out.println(s[i] + " is a file"); } else { System.out.println(dirname + " is not a directory"); } Вывод: Directory of /java bin is a directory COPYRIGHT is a file README is a file Метод mkdir создает подкаталог внутри существующего каталога. Метод mkdirs - создает не только указанный каталог, но и все отсутствующие родительские каталоги до корневого. Для избранного вывода списка имен файлов каталога в пакет java.io включен интерфейс FilenameFilter. Объекту класса File для реализации этого интерфейса требуется определить метод accept(), который будет вызываться один раз с каждым новым именем файла. Метод accept возвращает true для тех имен, которые надо включать в список, и false для имен, которые следует исключить.

5 Ввод–вывод в Java InputStream - абстрактный класс, задающий используемую в Java модель входных потоков. Все методы этого класса при возникновении ошибки возбуждают, но сами не обрабатывают исключение IOException. Методы класса InputStream. abstract int read() - возвращает представление очередного доступного символа во входном потоке в виде целого. int read(byte b[ ]) - пытается прочесть максимум b.length байтов из входного потока в массив b. Возвращает количество байтов, в действительности прочитанных из потока. int read(byte b[ ], int off, int len) - пытается прочесть максимум len байтов, расположив их в массиве b, начиная с элемента off. Возвращает количество реально прочитанных байтов. long skip(long n) - пытается пропустить во входном потоке n байтов. Возвращает количество пропущенных байтов. int available() - возвращает количество байтов, доступных для чтения в настоящий момент. void close() - закрывает источник ввода. Последующие попытки чтения из этого потока приводят к возбуждению IOException. void mark(int readlimit) - ставит метку в текущей позиции входного потока, которую можно будет использовать до тех пор, пока из потока не будет прочитано readlimit байтов. void reset() - возвращает указатель потока на установленную ранее метку. boolean markSupported() - возвращает true, если данный поток поддерживает операции mark/reset.

6 Ввод–вывод в Java OutputStream OutputStream - абстрактный класс. Он задает модель выходных потоков Java. Все методы этого класса имеют тип void и возбуждают исключение IOException в случае ошибки. Методы класса OutputStream: abstract void write(int b) - записывает один байт в выходной поток. Аргумент этого метода имеет тип int, что позволяет вызывать write, передавая ему выражение, при этом не нужно выполнять приведение его типа к byte. void write(byte b[]) - записывает в выходной поток весь указанный массив байтов. void write(byte b[], int off, int len) - записывает в поток часть массива - len байтов, начиная с элемента b[off]. void flush() - очищает любые выходные буферы, завершая операцию вывода. void close() - закрывает выходной поток. Последующие попытки записи в этот поток будут возбуждать IOException.

7 Ввод–вывод в Java Файловые потоки FilelnputStream Класс FileInputStream используется для ввода данных из файлов. Можно разными способами создать несколько объектов этого класса, использующих один и тот же дисковый файл. InputStream f0 = new FileInputStream("/autoexec.bat"); или File f = new File("/autoexec.bat"); InputStream f1 = new FileInputStream(f); Когда создается объект класса FileInputStream, он одновременно с этим открывается для чтения. Класс FileInputStream замещает первые шесть методов абстрактного класса InputStream. Попытки применить к объекту этого класса методы mark и reset приводят к возбуждению исключения IOException.

8 Ввод–вывод в Java import java.io.*; import java.util.*; class FileInputStreamS { public static void main(String args[ ]) throws IOException { InputStream f1 = new FileInputStream("/wwwroot/default.htm"); int size = f1.available(); System.out.println("Total Available Bytes: " + size); System.out.println("First 1/4 of the file: read()"); for (int i=0; i < size/4; i++) { System.out.print((char) f1.read()); } System.out.println("Total Still Available: " + f1.available()); System.out.println("Reading the next 1/8: read(b[])"); byte b[] = new byte[size/8]; if (f1.read(b) != b.length) { System.err.println("Something bad happened"); } String tmpstr = new String(b, 0, 0, b.length); System.out.println(tmpstr); System.out.println("Still Available: " + f1.available()); System.out.println("Skipping another 1/4: skip()"); f1.skip(size/4); System.out.println( "Still Available: " + f1.available()); System.out.println("Reading 1/16 into the end of array"); if (f1.read(b, b.length-size/16, size/16) != size/16) { System.err.println("Something bad happened"); } System.out.println("Still Available: " + f1.available()); f1.close(); } В приведенном примере показано, как можно читать одиночные байты, массив байтов и поддиапазон массива байтов. В этом примере также показано, как методом available можно узнать, сколько еще осталось непрочитанных байтов, и как с помощью метода skip можно пропустить те байты, которые читать не нужно.

9 Ввод–вывод в Java FileOutputStream У класса FileOutputStream - два таких же конструктора, что и у FileInputStream. Однако, создавать объекты этого класса можно независимо от того, существует файл или нет. При создании нового объекта класс FileOutputStream перед тем, как открыть файл для вывода, сначала создает его. import java.io.*; class FileOutputStreamS { public static byte[ ] getInput() throws Exception { byte buffer[ ] = new byte[12]; for (int i=0; i

10 Ввод–вывод в Java ByteArraylnputStream ByteArrayInputStream - это реализация входного потока, в котором в качестве источника используется массив типа byte. У этого класса два конструктора, каждый из которых в качестве первого параметра требует байтовый массив. В приведенном ниже примере создаются два объекта этого типа. Эти объекты инициализируются символами латинского алфавита. String tmp = "abcdefghijklmnopqrstuvwxyz"; byte b[] = new byte [tmp.length()]; tmp. getBytes(0, tmp.length(), b, 0); ByteArrayInputStream input1 = new ByteArrayInputStream(b); ByteArrayInputStream input2 = new ByteArreyInputStream(b,0,3); ByteArrayOutputStream У класса ByteArrayOutputStream - два конструктора. Первая форма конструктора создает буфер размером 32 байта. При использовании второй формы создается буфер с размером, заданным параметром конструктора (в приведенном ниже примере байта): OutputStream out0 = new ByteArrayOutputStream(); OutputStream out1 = new ByteArrayOutputStream(1024);

11 Ввод–вывод в Java import java.io.*; import java.util.*; class ByteArrayOutputStreamS { public static void main(String args[ ]) throws Exception { ByteArrayOutputStream f0 = new ByteArrayOutputStream(12); System.out.println("Enter 10 characters and a return"); while (f0.size() != 10) { f0.write( System.in.read()); } System.out.println("Buffer as a string"); System.out.println(f0.toString()); System.out.println ("Into array"); byte b[ ] = f0.toByteArray(); for (int i=0; i < b.length; i++) { System.out.print((char) b[i]); } System.out.println(); System.out.println("To an OutputStream()"); OutputStream f2 = new FileOutputStream("test.txt"); f0.writeTo(f2); System.out.println("Doing a reset"); f0. reset(); System.out.println("Enter 10 characters and a return"); while (f0.size() != 10) { f0.write (System.in.read()); } System.out.println("Done."); } Создается выводной поток типа массива байтов и заполняется 10 символами с клавиатуры Содержимое выводного потока f0 переводится в строку и выводится с помощью метода toString(), затем содержимое переводится в массив типа byte с помощью метода toByteArray() и выводится. Создание выводного файлового потока FileOutputStream и перезапись в него содержимого выводного потока типа байтового массива методом writeTo() Установка в начало выводного потока f0 и снова заполнение его 10 символами с клавиатуры

12 Ввод–вывод в Java StringBufferlnputStream StringBufferInputStream идентичен классу ByteArrayInputStream с тем исключением, что внутренним буфером объекта этого класса является экземпляр String, а не байтовый массив. Кроме того, в Java нет соответствующего ему класса StringBufferedOutputStream. У этого класса есть единственный конструктор: StringBufferInputStream( String s) Фильтруемые потоки При работе системы вывода в среде с параллельными процессами при отсутствии синхронизации могут возникать неожиданные результаты. Причиной этого являются попытки различных подпроцессов одновременно обратиться к одному и тому же потоку. Все конструкторы и методы, имеющиеся в этом классе, идентичны тем, которые есть в классах InputStream и OutputStream, единственное отличие классов фильтруемых потоков в том, что их методы синхронизованы. Буферизованные потоки Буферизованные потоки являются расширением классов фильтруемых потоков, в них к потокам ввода-вывода присоединяется буфер в памяти. Этот буфер выполняет две основные функции: Он дает возможность исполняющей среде java проделывать за один раз операции ввода- вывода с более чем одним байтом, тем самым повышая производительность среды. Поскольку у потока есть буфер, становятся возможными такие операции, как пропуск данных в потоке, установка меток и очистка буфера.

13 Ввод–вывод в Java PushbacklnputStream Одно из необычных применений буферизации - реализация операции pushback (вернуть назад). Pushback применяется к InputStream для того, чтобы после прочтения символа вернуть его обратно во входной поток. Однако возможности класса PushbacklnputStream весьма ограничены - любая попытка вернуть в поток более одного символа приведет к немедленному возбуждению исключения IOException. У этого класса - единственный конструктор PushbackInputStream(InputStream in) Помимо уже хорошо нам знакомых методов класса InputStream, PushbacklnputStream содержит метод unread(int ch), который возвращает заданный аргументом символ ch во входной поток. SequencelnputStream Класс SequencelnputStream поддерживает новую возможность слияния нескольких входных потоков в один. В конструкторе класса SequenceInputStream в качестве параметра используется либо два объекта InputStream, либо перечисление, содержащее коллекцию объектов InputStream: SequenceInputStream(Enumeration e) SequenceInputStream(InputStream s0, InputStream s1) В процессе работы класс выполняет поступающие запросы, считывая информацию из первого входного потока до тех пор, пока он не закончится, после чего переходит ко второму и т.д.

14 Ввод–вывод в Java PrintStream Класс PrintStream предоставляет все те утилиты форматирования, которые используются для вывода через файловые дескрипторы пакета System. Мы уже привыкли писать System.out.println, не сильно задумываясь при этом о тех классах, которые занимаются форматированием выводимой информации. У класса PrintStream два конструктора: PrintStream(OutputStream out) и PrintStream(OutputStream out, boolean autoflush). Параметр autoflush второго из них указывает, должна ли исполняющая среда Java автоматически выполнять операцию очистки буфера над выходным потоком. В Java-объектах PrintStream есть методы print и println, умеющие работать с любыми типами данных, включая Object. Если в качестве аргумента этих методов используется один из примитивных типов, то они вызывают метод toString класса Object, после чего выводят полученный результат. Каждый объектный тип (класс) может перегрузить метод toString корневого класса Object, чтобы определить необходимую процедуру вывода для своих экземпляров.