betacode

Руководство Java DataOutputStream

  1. DataOutputStream
  2. Constructors
  3. Methods
  4. Examples
  5. writeBytes(String s)
  6. writeChars(String s)
  7. writeUTF(String str)
  8. writeBoolean(boolean v)
  9. writeByte(int v)
  10. writeShort(int v)
  11. writeChar(int v)
  12. writeInt(int v)
  13. writeLong(long v)
  14. writeFloat(float v)
  15. writeDouble(double v)
  16. size()

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

2. Constructors

public DataOutputStream(OutputStream out)

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".

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

Show More