Руководство Java DataOutputStream
1. DataOutputStream
DataOutputStream обычно используется для записи примитивных данных (primitive data) в другой OutputStream. Затем приложение может использовать DataInputStream для обратного считывания данных.
public class DataOutputStream extends FilterOutputStream implements DataOutput
DataOutputStream рекомендуется для записи табличных данных, таких как Excel. (См. Пример в середине этой статьи).
OrderDate | Finished | Item | Units | UnitCost | Total |
2020-01-06 | Pencil | 95 | 1.99 | 189.05 | |
2020-01-23 | Binder | 50 | 19.99 | 999.50 | |
2020-02-09 | Pencil | 36 | 4.99 | 179.64 | |
2020-02-26 | Pen | 27 | 19.99 | 539.73 | |
2020-03-15 | Pencil | 56 | 2.99 | 167.44 |
- ByteArrayOutputStream
- FileOutputStream
- FilterOutputStream
- ObjectOutputStream
- PipedOutputStream
- BufferedOutputStream
- OutputStream
- PrintStream
- CheckedOutputStream
- CipherOutputStream
- DeflaterOutputStream
- DigestOutputStream
- InflaterOutputStream
3. Methods
public final void writeBoolean(boolean v) throws IOException
public final void writeByte(int v) throws IOException
public final void writeShort(int v) throws IOException
public final void writeChar(int v) throws IOException
public final void writeInt(int v) throws IOException
public final void writeLong(long v) throws IOException
public final void writeFloat(float v) throws IOException
public final void writeDouble(double v) throws IOException
public final void writeBytes(String s) throws IOException
public final void writeChars(String s) throws IOException
public final void writeUTF(String str) throws IOException
public final int size()
Другие методы, унаследованные от родительских классов:
public static OutputStream nullOutputStream()
public void write(int b) throws IOException
public void write(byte b[]) throws IOException
public void write(byte b[], int off, int len) throws IOException
public void flush() throws IOException
public void close() throws IOException
4. Examples
DataOutputStream часто используется для записи данных структурированного типа, такого как Excel. Теперь мы запишем нижеприведенную таблицу данных в 1 файл:
OrderDate | Finished | Item | Units | UnitCost | Total |
2020-01-06 | Pencil | 95 | 1.99 | 189.05 | |
2020-01-23 | Binder | 50 | 19.99 | 999.50 | |
2020-02-09 | Pencil | 36 | 4.99 | 179.64 | |
2020-02-26 | Pen | 27 | 19.99 | 539.73 | |
2020-03-15 | Pencil | 56 | 2.99 | 167.44 |
Во-первых, напишите класс Order, который имитирует однострочные данные таблицы.
Order.java
package org.o7planning.dataoutputstream.ex;
import java.time.LocalDate;
public class Order {
private LocalDate orderDate;
private boolean finished;
private String item;
private int units;
private float unitCost;
private float total;
public Order(LocalDate orderDate, boolean finished, //
String item, int units, float unitCost, float total) {
this.orderDate = orderDate;
this.finished = finished;
this.item = item;
this.units = units;
this.unitCost = unitCost;
this.total = total;
}
public LocalDate getOrderDate() {
return orderDate;
}
public boolean isFinished() {
return finished;
}
public String getItem() {
return item;
}
public int getUnits() {
return units;
}
public float getUnitCost() {
return unitCost;
}
public float getTotal() {
return total;
}
}
Затем используйте DataOutputStream для записи приведенной выше таблицы данных в файл:
WriteDataFile_example1.java
package org.o7planning.dataoutputstream.ex;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.time.LocalDate;
public class WriteDataFile_example1 {
// Windows: C:/somepath/data-file.txt
private static final String filePath = "/Volumes/Data/test/data-file.txt";
public static void main(String[] args) throws IOException {
Order[] orders = new Order[] { //
new Order(LocalDate.of(2020, 1, 6), true, "Pencil", 95, 1.99f, 189.05f),
new Order(LocalDate.of(2020, 1, 23), false, "Binder", 50, 19.99f, 999.50f),
new Order(LocalDate.of(2020, 2, 9), true, "Pencil", 36, 4.99f, 179.64f),
new Order(LocalDate.of(2020, 2, 26), false, "Pen", 27, 19.99f, 539.73f),
new Order(LocalDate.of(2020, 3, 15), true, "Pencil", 56, 2.99f, 167.44f) //
};
File outFile = new File(filePath);
outFile.getParentFile().mkdirs();
OutputStream outputStream = new FileOutputStream(outFile);
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
for (Order order : orders) {
dataOutputStream.writeUTF(order.getOrderDate().toString());
dataOutputStream.writeBoolean(order.isFinished());
dataOutputStream.writeUTF(order.getItem());
dataOutputStream.writeInt(order.getUnits());
dataOutputStream.writeFloat(order.getUnitCost());
dataOutputStream.writeFloat(order.getTotal());
}
dataOutputStream.close();
}
}
После выполнения приведенного выше примера у нас есть файл данных. Его содержание довольно запутанно:
Наконец, мы используем DataInputStream для чтения вышеупомянутого файла.
ReadDataFile_example1.java
package org.o7planning.dataoutputstream.ex;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class ReadDataFile_example1 {
// Windows: C:/somepath/data-file.txt
private static final String filePath = "/Volumes/Data/test/data-file.txt";
public static void main(String[] args) throws IOException {
File file = new File(filePath);
InputStream inputStream = new FileInputStream(file);
DataInputStream dataInputStream = new DataInputStream(inputStream);
int row = 0;
System.out.printf("|%3s | %-10s | %10s | %-15s | %8s| %10s | %10s |%n", //
"No", "Order Date", "Finished?", "Item", "Units", "Unit Cost", "Total");
System.out.printf("|%3s | %-10s | %10s | %-15s | %8s| %10s | %10s |%n", //
"--", "---------", "----------", "----------", "------", "---------", "---------");
while (dataInputStream.available() > 0) {
row++;
String orderDate = dataInputStream.readUTF();
boolean finished = dataInputStream.readBoolean();
String item = dataInputStream.readUTF();
int units = dataInputStream.readInt();
float unitCost = dataInputStream.readFloat();
float total = dataInputStream.readFloat();
System.out.printf("|%3d | %-10s | %10b | %-15s | %8d| %,10.2f | %,10.2f |%n", //
row, orderDate, finished, item, units, unitCost, total);
}
dataInputStream.close();
}
}
Output:
5. writeBytes(String s)
Преобразуйте заданную String в последовательность символов, затем преобразуйте (cast) каждый символ в byte и запишите в этот DataOutputStream с помощью метода writeByte(byte).
public final void writeBytes(String s) throws IOException
Вызов метода writeBytes(String) эквивалентен:
int len = s.length();
for (int i = 0 ; i < len ; i++) {
out.write((byte)s.charAt(i));
}
incCount(len);
6. writeChars(String s)
Преобразуйте заданную String в последовательность символов, затем запишите каждый символ по очереди в этот DataOutputStream с помощью метода writeChar(char).
public final void writeChars(String s) throws IOException
Вызов метода writeChars(String) эквивалентен:
int len = s.length();
for (int i = 0 ; i < len ; i++) {
int v = s.charAt(i);
writeChar(v);
}
7. writeUTF(String str)
Запишите String в этот DataOutputStream с кодировкой "Modified UTF-8" (Модифицированая UTF-8).
public final void writeUTF(String str) throws IOException
Во-первых, в выходной поток записываются два bytes, как если бы с помощью метода writeShort казывалось количество последующих bytes. Это значение - количество фактически записанных bytes, а не длина строки.
Например, вызовите метод writeUTF("ÂBC") для записи строки "ÂBC". Как известно, UTF-8 использует 1, 2, 3 или 4 bytes для хранения символа.
- 'Â' --> 2 bytes
- 'B' --> 1 byte
- 'C' --> 1 byte
Сначало 2 bytes используются для хранения информации о количестве bytes, необходимых для хранения этой строки. Следующие 4 bytes используются для записи строки "ÂBC" по кодировке "Modified UTF-8".
- UTF-8
- DataInputStream
8. writeBoolean(boolean v)
public final void writeBoolean(boolean v) throws IOException
Метод writeBoolean(boolean) записывает логическое значение в этот DataOutputStream. Если это значение равно true, то (byte)1 будет записан, в противном случае (byte)0 будет записан.
9. writeByte(int v)
public final void writeByte(int v) throws IOException
Запишите один byte в этот DataOutputStream.
10. writeShort(int v)
public final void writeShort(int v) throws IOException
Метод writeShort(int) записывает 2 bytes в этот DataOutputStream.
Два bytes, в которые записываются:
(byte)(0xff & (v >> 8))
(byte)(0xff & v)
11. writeChar(int v)
public final void writeChar(int v) throws IOException
Метод writeChar(int) записывает 2 bytes в этот DataOutputStream.
Два bytes, в которые записываются:
(byte)(0xff & (v >> 8))
(byte)(0xff & v)
12. writeInt(int v)
public final void writeInt(int v) throws IOException
Метод writeInt(int) записывает 4 bytes в этот DataOutputStream.
Четыре bytes, в которые записываются:
(byte)(0xff & (v >> 24))
(byte)(0xff & (v >> 16))
(byte)(0xff & (v >> 8))
(byte)(0xff & v)
13. writeLong(long v)
public final void writeLong(long v) throws IOException
Метод writeLong(long) записывает 8 bytes в этот DataOutputStream.
Восемь bytes, в которые записываются:
(byte)(0xff & (v >> 56))
(byte)(0xff & (v >> 48))
(byte)(0xff & (v >> 40))
(byte)(0xff & (v >> 32))
(byte)(0xff & (v >> 24))
(byte)(0xff & (v >> 16))
(byte)(0xff & (v >> 8))
(byte)(0xff & v)
14. writeFloat(float v)
public final void writeFloat(float v) throws IOException
Метод writeFloat(float) записывает 4 bytes в этот DataOutputStream.
15. writeDouble(double v)
public final void writeDouble(double v) throws IOException
Метод writeDouble(double) записывает 8 bytes в этотDataOutputStream.
16. size()
Возвращает количество bytes, записанных в этот DataOutputStream, или Integer.MAX_VALUE, если значение на самом деле больше.
public final int size()
Например:
DataOutputStream_size_ex1.java
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeByte(111);
System.out.println("Number of bytes: " + dos.size()); // 1
// 1 char = 2 bytes.
dos.writeChars("ÂBC");
System.out.println("Number of bytes: " + dos.size()); // 1 + 2*3 = 7
// 1 char = 2 bytes.
dos.writeChar('A');
System.out.println("Number of bytes: " + dos.size()); // 7 + 2 = 9
// In UTF-8:
// Two bytes of length information is added before the UTF-8 String (See writeUTF methods).
// UTF-8 String: "ÂBC" =4 bytes; 'Â' = 2 bytes, 'B' = 1 byte, 'C' = 1 byte.
dos.writeUTF("ÂBC");
System.out.println("Number of bytes: " + dos.size()); // 9 + 2 + 4 = 15
Руководства Java IO
- Руководство Java CharArrayWriter
- Руководство Java FilterReader
- Руководство Java FilterWriter
- Руководство Java PrintStream
- Руководство Java BufferedReader
- Руководство Java BufferedWriter
- Руководство Java StringReader
- Руководство Java StringWriter
- Руководство Java PipedReader
- Руководство Java LineNumberReader
- Руководство Java PushbackReader
- Руководство Java PrintWriter
- Руководство Java IO Binary Streams
- Руководство Java IO Character Streams
- Руководство Java BufferedOutputStream
- Руководство Java ByteArrayOutputStream
- Руководство Java DataOutputStream
- Руководство Java PipedInputStream
- Руководство Java OutputStream
- Руководство Java ObjectOutputStream
- Руководство Java PushbackInputStream
- Руководство Java SequenceInputStream
- Руководство Java BufferedInputStream
- Руководство Java Reader
- Руководство Java Writer
- Руководство Java FileReader
- Руководство Java FileWriter
- Руководство Java CharArrayReader
- Руководство Java ByteArrayInputStream
- Руководство Java DataInputStream
- Руководство Java ObjectInputStream
- Руководство Java InputStreamReader
- Руководство Java OutputStreamWriter
- Руководство Java InputStream
- Руководство Java FileInputStream
Show More