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
будет работать с объектными потоками, которые покрываются следующим разделом.