Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Основной ввод-вывод
Раздел: Потоки ввода-вывода
Потоки данных
Домашняя страница > Существенные Классы > Основной ввод-вывод

Потоки данных

Потоки данных поддерживают двоичный ввод-вывод примитивных значений типа данных (boolean, char, byte, short, int, long, float, и double) так же как Строковые значения. Все потоки данных реализуют любого DataInput взаимодействуйте через интерфейс или DataOutput интерфейс. Этот раздел сосредотачивается на наиболее широко используемых реализациях этих интерфейсов, DataInputStream и DataOutputStream.

DataStreams пример демонстрирует потоки данных, выписывая ряд записей данных, и затем читая их в снова. Каждая запись состоит из трех значений, связанных с элементом на счете, как показано в следующей таблице:

Порядок в записи Тип данных Описание данных Выходной Метод Входной Метод Демонстрационное Значение
1 double Цена на элемент DataOutputStream.writeDouble DataInputStream.readDouble 19.99
2 int Количество модуля DataOutputStream.writeInt DataInputStream.readInt 12
3 String Описание элемента DataOutputStream.writeUTF DataInputStream.readUTF "Java T-Shirt"

Давайте исследуем решающий код в DataStreams. Во-первых, программа определяет некоторые константы, содержащие имя файла данных и данных, которые будут записаны этому:

static final String dataFile = "invoicedata";

static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 };
static final int[] units = { 12, 8, 13, 29, 50 };
static final String[] descs = {
    "Java T-shirt",
    "Java Mug",
    "Duke Juggling Dolls",
    "Java Pin",
    "Java Key Chain"
};

Затем DataStreams открывает поток вывода. С тех пор a DataOutputStream может только быть создан как обертка для существующего объекта потока байтов, DataStreams обеспечивает буферизованный выходной поток байтов файла.

out = new DataOutputStream(new BufferedOutputStream(
              new FileOutputStream(dataFile)));

DataStreams выписывает записи и закрывает поток вывода.

for (int i = 0; i < prices.length; i ++) {
    out.writeDouble(prices[i]);
    out.writeInt(units[i]);
    out.writeUTF(descs[i]);
}

writeUTF метод выписывает String значения в измененной форме UTF-8. Это - переменная-width кодировка символов, которая только нуждается в единственном байте для общих Западных символов.

Теперь DataStreams читает данные въезжают задним ходом снова. Сначала это должно обеспечить входной поток, и переменные, чтобы содержать входные данные. Как DataOutputStream, DataInputStream должен быть создан как обертка для потока байтов.

in = new DataInputStream(new
            BufferedInputStream(new FileInputStream(dataFile)));

double price;
int unit;
String desc;
double total = 0.0;

Теперь DataStreams может считать каждую запись в потоке, сообщающем относительно данных, с которыми это встречается.

try {
    while (true) {
        price = in.readDouble();
        unit = in.readInt();
        desc = in.readUTF();
        System.out.format("You ordered %d" + " units of %s at $%.2f%n",
            unit, desc, price);
        total += unit * price;
    }
} catch (EOFException e) {
}

Заметьте это DataStreams обнаруживает условие конца файла, ловя EOFException, вместо того, чтобы тестировать на недопустимое возвращаемое значение. Все реализации DataInput использование методов EOFException вместо возвращаемых значений.

Также заметьте, что каждый специализировался write в DataStreams является точно соответствующим специализированным соответствием read. Это до программиста, чтобы удостовериться, что выводит типы, и входные типы являются соответствующими таким образом: входной поток состоит из простых двоичных данных ни с чем, чтобы указать на тип отдельных значений, или где они начинают в потоке.

DataStreams использование один очень плохой метод программирования: это использует числа с плавающей точкой, чтобы представить денежную стоимость. Вообще, плавающая точка плоха для точных значений. Это особенно плохо для десятичных дробей, потому что общие ценности (такой как 0.1) не имейте двоичного представления.

Корректный тип, чтобы использовать для значений валюты java.math.BigDecimal. К сожалению, BigDecimal объектный тип, таким образом, он не будет работать с потоками данных. Однако, BigDecimal будет работать с объектными потоками, которые покрываются следующим разделом.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: ввод-вывод из Командной строки
Следующая страница: Объектные Потоки