Программирование ввода-вывода с использованием файлов на Java

Рассмотрим еще один аспект работы в Java — чтение из файла и запись в файл. В совокупности с рассмотренными выше вопросами — это одна из важнейших сторон программирования в Java.

Ввод-вывод играет большую роль в системах обработки информации. Часто просто требуется ввести какую-нибудь строку или число.

Например, мы бы хотели запросить название книги titie из окна диалога. Сделаем это. Нам потребуется создать новое окно для ввода информации, которое будет содержать текстовое поле и кнопку для закрытия окна. Данное окно следует объявить как отдельный класс на основе Frame:

class Dlgwin extends Frame implements ActionListener {

Book bb;

String param;

Button bexit=new Button("Exit From Dialog"); TextField tfi=new TextField();

public Dlgwin(Book z)

{

bb=z ;

param=z.title; setLayout(null) ; add(bexit); add (tfi) ;

bexit.addActionListener(this) ;

tfi.setBounds(20,160,200, 20) ;

tfi.setText(param);

bexit.setBounds(20, 60,100, 20) ;

setBackground(new Color(200,200,100));

}

public void actionPerformed (ActionEvent e)

{

if (e.getSource()==bexit)

{

bb.title= tfi.getText(); this.setVisible(false);

}

}

}

Наш новый класс содержит переменную типа Book. В нем многое очень похоже на класс iabi. В конструктор класса Digwin передаем объект book в виде объектной переменной z.

Оператор bb=z позволяет присвоить объектной переменной ьь ссылку на объект z, поскольку в момент выполнения присваивания переменная ьь не инициализирована. Мы используем переменную ьь в обработчике события от мыши чуть ниже.

Остальные действия конструктора — добавление на форму кнопки и текстового поля и подключение к ним прослушивателя. Обработчик события от программной кнопки заносит в поле titie объекта ьь значение из текстового поля tfi. Команда this.setVisible(false);

скрывает окно диалога. Итак, после вызова окна диалога пользователю нужно набрать в текстовом поле название книги (по умолчанию там отобразится "Pinoccio") и нажать кнопку Exit from dialog.

Теперь посмотрим, как вызвать диалог; создание соответствующей диалоговой переменной связываем с обработчиком события от кнопки Create Object класса iabi:

public void actionPerformed (ActionEvent e)

{

if (e.getSource()==bl)

System.exit(0) ; else

if (e.getSource()==b2)

{

if (book == null)

{

book=new Book("Pinoccio",200); // создаем переменную

// типа labl

dlg=new Dlgwin(book); // создаем переменную класса

// Dlgwin

dlg.setSize(300,300);

dlg.setVisible(true); // отображаем переменную Dlgwin

}

else

System.out.println("The object already exists");

Реализация этой части кода приведет к тому, что после запуска приложения и нажатия на кнопку Create Object откроется новое окнодиалога(рис. 1.8).

Рис. 1.8. Новое окно диалога

Нажатие на кнопку Exit From Dialog закроет диалоговое окно, но при этом в поле titie объекта book будет записано содержимое текстового поля диалогового окна.

Весьма простой вывод текстовой информации реализует оператор:

JOptionPane.showMessageDialog(null,book.title);

Второй аргумент этого оператора определяет выводимую строку. Чтобы этот оператор сработал, нужно импортировать пакет директивой:

import javax.swing.*;

Теперь рассмотрим работу с файлами. Допустим, мы хотим, чтобы вводимое в окне диалога значение поля tfi также сохранялось и в файле. Для этого размещаем в диалоговом окне новую кнопку для чтения ранее сохраненной строки в файле. Эта строка читается прямо в текстовое поле tfi. Сохранение строки в файле выполняется при нажатии на кнопку Exit в диалоговом окне. Все это реализуется в новом классе Digwin (листинг 1.8).

Листинг 1.8. Определение диалогового класса Dlgwin

import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*;

class Book

String title; int price;

Book(String s, int i) // Конструктор класса Book

this.title=s; this.price=i;

class Dlgwin extends Frame implements ActionListener

// Диалоговое окно

Book bb;

String param;

// Кнопка для выхода из диалога:

Button bexit=new Button("Exit From Dialog");

/ / Кнопка для чтения из файла:

Button bread=new Button("ReadFromButton");

// Текстовое поле для отображения названия книги:

TextField tfi=new TextField();

// Конструктор диалогового окна; ему передается объект класса // Book.

public Dlgwin(Book z)

bb=z; // bb получает ссылку на объект Book, переданный // конструктору param=z.title; setLayout(null); add(bexit); add (bread) ; add (tfi) ;

bexit.addActionListener(this); // Добавление прослушивателя bread.addActionListener(this) ;

tfi.setBounds(20,160,200,20); // Ручная компоновка элементов

// в окне

tfi.setText(param); bexit.setBounds(20, 60,100, 20); bread.setBounds(20, 90,100, 20) ; setBackground(new Color(200,200,100));

}

public void actionPerformed (ActionEvent e)

{

if (e.getSource()==bexit)

{

// При выходе из диалога инициализируем свойство title: bb.title= tfi.getText(); try {

FileOutputStream os=new FileOutputStream("dl.dat"); DataOutputStream dos=new DataOutputStream(os);

// Производим запись в файл dl.dat названия книги: dos.writeUTF(bb.title); dos.close();

}

catch(IOException err)

{

JOptionPane.showMessageDialog(null,"Error"+err);

}

else

if (e.getSource()==bread)

{

try

{

// Чтение из файла названия книги: FileInputStream is=new FileInputStream("dl.dat"); DataInputStream dis=new DataInputStream(is);

// Отображение названия в текстовом поле: tfi.setText(dis.readUTF()); dis.close ();

}

catch(IOException err)

{

JOptionPane.showMessageDialog(null,"Error"+err);

}

}

}

}

// Основной класс:

public class labl extends Frame implements ActionListener,KeyListener {

Dlgwin dlg; // Объявление окна диалога

Book book;

Button bl=new Button("Exit");

Button b2=new Button("Create Object");

Button b3=new Button("Show Object");

Label lb=new Label("INTRODUCTION in JAVA");

TextField tf = new TextField();

public labl()

{

setLayout(null);

add (tf) ;

add (Ы) ;

add(b2);

add (b3) ;

add(lb);

addKeyListener(this);

Ы.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this) ; lb.setBounds(20,20,200, 20) ; tf.setBounds(20,160,200,20);

Ы.setBounds (20, 60,100,20); b2.setBounds(20,90,100,20); b3.setBounds(20,120,100,20) ; setBackground(new Color(120,200,120));

}

public String showTitle(Book z) // Показывает название книги {

return z.title;

}

public void keyTyped(KeyEvent ke)

{

}

public void keyReleased(KeyEvent ke)

{

}

public void keyPressed(KeyEvent ke)

if(ke.getKeyChar()==’а’)

System.exit(0) ;

}

public void actionPerformed (ActionEvent e)

{

if (e.getSource()==bl)

System.exit(0); else

if (e.getSource()==b2)

{

if (book == null) // Создание объекта-книги {

book=new Book("Pinoccio",200);

// Открытие диалогового окна с передачей ссылки

// на Book:

dlg=new Dlgwin(book);

dlg.setSize(300,300);

dlg.setVisible(true);

}

else

System.out.println("The object already exists");

}

else

if (e.getSource()==b3)

{

if(book!=null)

{

Font fnt=new Font("Courier",Font.BOLD,24); Graphics g= getGraphics(); this.setForeground(new Color(250,0,0)); g.setFont(fnt);

g.drawString(book.title.toUpperCase(),20, 300) ;

tf.setText(this.showTitle(book).toUpperCase());

}

}

public static void main(String [] args) labl f= new labl();

f setForeground( new Color(0,0,250));

f.resize(500,500);

f.setVisible(true);

f.requestFocus();

Теперь подробно рассмотрим, как здесь выполняется запись в файл и чтение из файла. Запись в файл реализует следующий фрагмент кода:

public void actionPerformed (ActionEvent e) if (e.getSource()==bexit)

bb.title= tfi.getText(); try {

FileOutputStream os=new FileOutputStream("dl.dat"); DataOutputStream dos=new DataOutputStream(os); dos.writeUTF(bb.title); // Записали строку в файл dl.dat dos.close();

}

catch(IOException err)

{

JOptionPane.showMessageDialog(null,"Error"+err);

}

Сначала создаем файловую переменную os:

FileOutputStream os=new FileOutputStream("dl.dat");

Эта переменная принадлежит к классу FiieOutputstream. Данный класс содержит низкоуровневые методы для записи, выполняющие пересылку отдельных байтов. Поэтому используется более высокоуровневый вывод на основе класса DataOutputstream, который играет роль "обертывающего" класса по отношению к FiieOutputstream. Видим, что переменная dos создается с помощью конструктора, который получает в качестве входного аргумента переменную os класса FiieOutputstream. Запись в файл реализует оператор: dos.writeUTF(bb.title);

Этот оператор выполняет запись строковых величин в формате Unicode. Содержимое файла dl.dat после записи выглядит следующим образом:

Buratino

Фрагмент записи в файл помещен внутрь конструкции:

try

{

}

catch(IOException err)

{

}

Такая конструкция называется охраной. Охрана нужна для того, чтобы в случае возникновения ошибки передать управление на часть кода, записанную внутри catch(ioException err) {…}.

Несмотря на то, что в этом случае программа все равно завершается, обработчик ошибки позволяет принять меры для корректного завершения программы. Использованная конструкция catch отлавливает ошибки типа ioException (ошибки вводавывода). Это значит, что любая ошибка ввода-вывода, вызванная внутри блока try, будет передана на обработку в блок catch. Использование охраны имеет целью повысить надежность программ на языке Java. Впрочем, охрана применяется и в других современных языках.

Наконец, чтение из файла реализует следующий фрагмент кода:

if (e.getSource()==bread)

{

try

{

FileInputStream is=new FileInputStream("dl.dat");

DataInputStream dis=new DataInputStream(is); tfi.setText(dis.readUTF());// прочитали строку из файла dis.close(); //закрыли файл

}

catch(IOException err)

{

JOptionPane.showMessageDialog(null,"Error"+err);

}

}

Без труда можно проследить аналогию между этим фрагментом и фрагментом для записи, только сейчас мы имеем дело с базовыми классами FileInputStream И DataInputStream.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100