КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Файлы. Потоки ввода/выводаДля работы с файлами в приложениях Java могут быть использованы классы из пакета java/io. Класс File служит для хранения и обработки в качестве объектов каталогов и имен файлов. Этот класс не описывает способы работы с содержимым файла, но позволяет манипулировать такими свойствами файла, как права доступа, дата и время создания, путь в иерархии каталогов, создание, удаление, изменение имени файла и каталога и т.д. Основные методы класса File и способы их применения рассмотрены в следующем примере // пример # 1 : работа с файловой системой : FileTest.java package com.learn; import java.io.*; import java.util.*; public class FileTest { Public static void main(String[] args) throws IOException /*отказ от обработки исключения в main()*/ { //c объектом типа File ассоциируется файл на диске File fp = new File("com\\learn\\FileTest.java"); //другие способы создания объекта //File fp = new File("\\com\\learn", "FileTest.java"); //File fp=new File("d:\\temp\\demo.txt"); //File fp=new File("demo.txt"); if(fp.isFile()){//если объект дисковый файл System.out.println("Имя файла:\t" + fp.getName()); System.out.println("Путь к файлу:\t" + fp.getPath()); System.out.println("Абсолютный путь:\t" + fp.getAbsolutePath()); System.out.println("Канонический путь:\t" + fp.getCanonicalPath()); System.out.println("Размер файла:\t" + fp.length()); System.out.println("Последняя модификация файла:\t" + fp.lastModified()); System.out.println("Файл доступен для чтения:\t" + fp.canRead()); System.out.println("Файл доступен для записи:\t" + fp.canWrite()); System.out.println("Файл удален:\t" + fp.delete()); } if(fp.createNewFile()){ System.out.println("Файл " + fp.getName() + " создан"); } if(fp.exists()){ System.out.println("temp файл "+ fp.getName() + " существует"); } Else System.out.println("temp файл " + fp.getName() + " не существует"); //в объект типа File помещается каталог\директория File dir = new File("com\\learn"); if (dir.isDirectory())/*если объект объявлен как каталог на диске*/ System.out.println("Директория!"); if(dir.exists()){//если каталог существует System.out.println("Dir " + dir.getName() + " существует"); File [] files = dir.listFiles(); System.out.println(""); for(int i=0; i < files.length; i++){ Date date = new Date(files[i].lastModified()); System.out.println(files[i].getPath() + " \t| " + files[i].length() + "\t| " + date.toString());//toLocaleString());//toGMTString()) } } } } У каталога (директории) как объекта класса File есть дополнительное свойство - просмотр списка имен файлов с помощью методов list(), listFiles(), listRoots(). Потоки ввода последовательности байт являются подклассами абстрактного класса InputStream, потоки вывода последовательности байт - подклассами абстрактного класса OutputStream. При работе с файлами используются подклассы этих классов соответственно FileInputStream и FileOutputStream, конструкторы которых открывают поток и связывают его с соответствующим файлом. Рис.1. Иерархия классов потоков ввода. Рис.2. Иерархия классов потоков вывода. Для чтения байта или массива байт используются перегружаемый метод read()/read(byte[] b)класса FileInputStream. Метод возвращает -1, если достигнут конец потока данных. Поэтому возвращаемое значение имеет тип int. /* пример # 2 : чтение байтов из потока ввода : ReadBytes.java */ import java.io.*; public class ReadBytes { public static void main(String[] args){ int b; try { File f = new File("ReadBytes.java"); FileInputStream is = new FileInputStream(f); while ((b = is.read()) != -1){ //прочитанные данные выводятся на консоль System.out.println("прочитан байт = " + b); } is.close(); //закрытие потока ввода } catch (IOException e){ System.out.println("ошибка файла: " + e); } } } Конструктор FileInputStream("ReadBytes.java") открывает поток is и связывает его с файлом ReadBytes.java. Для закрытия потока используется метод close(). При чтении из потока можно пропустить n байт с помощью методаlong skip(long n). Класс Systemпакетаjava.langсодержит поле in,которое является ссылкой на объект классаInputStream,иполя out,errклассаPrintStream, объявленные со спецификаторами public static и являющиеся стандартными потоками ввода, вывода и вывода ошибок соответственно. Эти потоки связаны с консолью, но могут быть переназначены на другое устройство. В настоящее время в языке Java для консольного ввода используется не байтовый, а символьный поток. При этом для ввода используется подкласс BufferedReaderабстрактного класса Readerи методы read() и readLine()чтениясимвола и строки.
Рис.3. Иерархия символьных потоков ввода/вывода. Следующая программа демонстрирует ввод строки, числа и символа с консоли и вывод на консоль и в файл. // пример # 6 : ввод с консоли : ConsoleInput.java import java.io.*; public class ConsoleInput { public static void main(String[] args){ InputStreamReader is = new InputStreamReader(System.in); BufferedReader bistream = new BufferedReader(is); try { char c; int number; System.out.println("введите имя и нажмите <ввод>:"); String nameStr = bistream.readLine(); System.out.println(nameStr + " введите число:"); String numberStr = bistream.readLine(); number = Integer.valueOf(numberStr).intValue(); System.out.println(nameStr + " вы ввели число " + number); System.out.println(nameStr + " введите символ:"); c = (char)bistream.read(); System.out.println(nameStr + " вы ввели символ " + c); //Вывод в файл PrintStream ps = new PrintStream( new FileOutputStream ("res.txt")); ps.println("привет " + nameStr + c + number); ps.close(); } catch (IOException e){ System.out.println("ошибка ввода " + e); } } } Для вывода данных в файл в текстовом формате использовался фильтрованный поток вывода PrintStream и метод println(). Метод valueOf(String str) возвращает объект класса Integer, соответствующий цифровой строке, метод intValue() преобразует значение этого класса к базовому типу int. Процесс преобразования объектов в байтовые потоки для хранения называется сериализацией. Процесс извлечения объекта из байтового потока называется десериализацией. Для того чтобы объекты класса могли быть подвергнуты процессу сериализации, этот класс должен расширять интерфейс Serializable. Этот процесс заключается в сериализации каждого поля объекта, но только в том случае если это поле не имеет модификатора static или transient. Модификатор transient означает, что поле им помеченное, не может быть предметом сериализации. ИнтерфейсSerializable не имеет методов, которые необходимо реализовать, поэтому его использование ограничивается упоминанием при объявлении класса. Все действия в дальнейшем произодятся по умолчанию. Ввод/вывод объектов производится с использование потоков ObjectOutputStream и ObjectInputStream.
|