betacode

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

View more Tutorials:

Следуйте за нами на нашей фан-странице, чтобы получать уведомления каждый раз, когда появляются новые статьи. Facebook

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

View more Tutorials:

Maybe you are interested

Это онлайн курс вне вебсайта o7planning, который мы представляем, он включает бесплатные курсы или курсы со скидкой.