|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Потоки данных поддерживают двоичный ввод-вывод примитивных значений типа данных (boolean, char, byte, short, int, long, float, и double) так же как Строковые значения. Все потоки данных реализуют любого DataInput взаимодействуйте через интерфейс или интерфейс. Этот раздел сосредотачивается на наиболее широко используемых реализациях этих интерфейсов, и .
| Порядок в записи | Тип данных | Описание данных | Выходной Метод | Входной Метод | Демонстрационное Значение |
|---|---|---|---|---|---|
| 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) не имейте двоичного представления.
Корректный тип, чтобы использовать для значений валюты . К сожалению, BigDecimal объектный тип, таким образом, он не будет работать с потоками данных. Однако, BigDecimal будет работать с объектными потоками, которые покрываются следующим разделом.