|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
New PrintWriter(new BufferedWriter(
new FileWriter(new File("file.txt")))); В итоге класс BufferedWriter выступает классом-оберткой для класса FileWriter, так же как и класс BufferedReader для FileReader. Приведенный ниже пример демонстрирует вывод в файл строк и чисел с плавающей точкой. // пример # 5: вывод в файл: DemoWriter.java package chapt09; import java.io.*;
public class DemoWriter { public static void main(String[] args) { File f = new File("res.txt"); FileWriter fw = null; try { fw = new FileWriter(f, true); } catch (IOException e) { System. err. println("ошибка открытия потока " + e); System. exit (1); } BufferedWriter bw = new BufferedWriter(fw); PrintWriter pw = new PrintWriter(bw);
double [] v = { 1.10, 1.2, 1.401, 5.01 }; for (double version: v) pw.printf("Java %.2g%n", version); pw.close(); } } В итоге в файл res.txt будет помещена следующая информация: Java 1.1 Java 1.2 Java 1.4 Java 5.0 Для вывода данных в файл в текстовом формате использовался фильтрованный поток вывода PrintWriter и метод printf(). После соединения этого потока с дисковым файлом посредством символьного потока BufferedWriter и удобного средства записи в файл FileWriter становится возможной запись текстовой информации с помощью обычных методов println(), print(), printf(), format(), write(), append(). В отличие от Java 1.1 в языке Java 1.2 для консольного ввода используется не байтовый, а символьный поток. В этой ситуации для ввода используется подкласс BufferedReader абстрактного класса Reader и методы read() и readLine() для чтениясимвола и строки соответственно. Этот поток для организации чтения из файла лучше всего инициализировать объектом класса FileReader в виде: new BufferedReader(new FileReader(new File("f.txt"))); Чтение из созданного в предыдущем примере файла с использованием удобной технологии можно произвести следующим образом: // пример # 6: чтение из файла: DemoReader.java package chapt09; import java.io.*;
public class DemoReader { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader("res.txt")); String tmp = ""; while ((tmp = br.readLine())!= null) { //пробел использовать как разделитель String[] s = tmp.split("\\s"); //вывод полученных строк for (String res: s) System. out. println(res); } br.close(); } catch (IOException e) { e.printStackTrace(); } } } В консоль будет выведено: Java 1.1 Java 1.2 Java 1.4 Java 5.0 Сериализация объектов Кроме данных базовых типов, в поток можно отправлять объекты классов. Процесс преобразования объектов в потоки байтов для хранения называется сериализацией. Процесс извлечения объекта из потока байтов называется десериализацией. Существует два способа сделать объект сериализуемым. Для того чтобы объекты класса могли быть подвергнуты процессу сериализации, этот класс должен расширять интерфейс Serializable. Все подклассы такого класса также будут сериализованы. Многие стандартные классы реализуют этот интерфейс. Этот процесс заключается в сериализации каждого поля объекта, но только в том случае, если это поле не имеет спецификатора static или transient. Спецификаторы transient и static означают, что поля, помеченные ими, не могут быть предметом сериализации, но существует различие в десериализации. Так, поле со спецификатором transient после десериализацииполучает значение по умолчанию, соответствующее его типу (объектный тип всегда инициализируется по умолчанию значением null), а поле со спецификатором static получает значение по умолчанию в случае отсутствия в области видимости объектов своего типа, а при их наличии получает значение, которое определено для существующего объекта. Интерфейс Serializable не имеет методов, которые необходимо реализовать, поэтому его использование ограничивается упоминанием при объявлении класса. Все действия в дальнейшем производятся по умолчанию. Для записи объектов в поток необходимо использовать класс ObjectOutputStream. После этого достаточно вызвать метод writeObject(Object ob) этого класса для сериализации объекта ob и пересылки его в выходной поток данных. Для чтения используется соответственно класс ObjectInputStream и его метод readObject(), возвращающий ссылку на класс Object. После чего следует преобразовать полученный объект к нужному типу. Необходимо знать, что при использовании Serializable десериализация происходит следующим образом: под объект выделяется память, после чего его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается. /* пример # 7: запись сериализованного объекта в файл и его десериализация: Student.java: DemoSerialization.java */ package chapt09; import java.io.*;
class Student implements Serializable{ protected static String faculty; private String name; private int id; private transient String password; private static final long serialVersionUID = 1L; /*значение этого поля для класса будет дано далее*/ public Student(String nameOfFaculty, String name, int id, String password){ faculty = nameOfFaculty; this. name = name; this. id = id; this. password = password; } public String toString(){ return "\nfaculty " + faculty + "\nname " + name + "\nID " + id + "\npassword " + password; } }
public class DemoSerialization { public static void main(String[] args) { // создание и запись объекта Student goncharenko = new Student("MMF", "Goncharenko", 1, "G017s9"); System. out. println(goncharenko); File fw = new File("demo.dat"); try { ObjectOutputStream ostream = new ObjectOutputStream( new FileOutputStream(fw));
ostream.writeObject(goncharenko); ostream.close(); } catch (IOException e) { System. err. println(e); } Student.faculty="GEO"; //изменение значения static-поля // чтение и вывод объекта File fr = new File("demo.dat"); try { ObjectInputStream istream = new ObjectInputStream( new FileInputStream(fr));
Student unknown = (Student)istream.readObject(); istream.close(); System. out. println(unknown); } catch (ClassNotFoundException ce) { System. err. println(ce); System. err. println("Класс не существует"); } catch (FileNotFoundException fe) { System. err. println(fe); System. err. println("Файл не найден"); } catch (IOException ioe) { System. err. println(ioe); System. err. println("Ошибка доступа"); } } } В результате выполнения данного кода в консоль будет выведено: Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.01 сек.) |