Руководство Java DataInputStream
1. DataInputStream
DataInputStream используется для чтения примитивных данных из источника данных, особенно источников данных, записанных DataOutputStream.
public class DataInputStream extends FilterInputStream implements DataInput
- ByteArrayInputStream
- FileInputStream
- FilterInputStream
- BufferedInputStream
- InputStream
- PushbackInputStream
- ObjectInputStream
- PipedInputStream
- SequenceInputStream
- AudioInputStream
- CheckedInputStream
- DeflaterInputStream
- InflaterInputStream
- CipherInputStream
- DigestInputStream
3. Methods
public final boolean readBoolean() throws IOException
public final byte readByte() throws IOException
public final int readUnsignedByte() throws IOException
public final short readShort() throws IOException
public final int readUnsignedShort() throws IOException
public final char readChar() throws IOException
public final int readInt() throws IOException
public final long readLong() throws IOException
public final float readFloat() throws IOException
public final double readDouble() throws IOException
public final String readUTF() throws IOException
public static final String readUTF(DataInput in) throws IOException
public final void readFully(byte[] b) throws IOException
public final void readFully(byte[] b, int off, int len) throws IOException
@Deprecated
public String readLine() throws IOException
Другие методы, унаследованные от родительских классов:
public int read() throws IOException
public int read(byte[] b) throws IOException
public int read(byte[] b, int off, int len) throws IOException
public byte[] readAllBytes() throws IOException
public byte[] readNBytes(int len) throws IOException
public int readNBytes(byte[] b, int off, int len) throws IOException
public long skip(long n) throws IOException
public int available() throws IOException
public void close() throws IOException
public synchronized void mark(int readlimit)
public synchronized void reset() throws IOException
public boolean markSupported()
public long transferTo(OutputStream out) throws IOException
public static InputStream nullInputStream()
4. Examples
DataInputStream обычно используется для чтения источников данных, записанных DataOutputStream. В этом примере мы используем DataOutputStream для записи таблицы данных со структурой, подобной Excel, в файл, а затем используем DataInputStream для чтения этого файла.
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.datainputstream.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.datainputstream.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.datainputstream.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. readUTF()
Метод readUTF() спользуется для чтения строки, закодированной с помощью "Modified UTF-8" (Модифицированной UTF-8). Правила чтения симметричны правилам записи метода DataOutput.writeUTF(String).
public final String readUTF() throws IOException
В положении курсора (cursor) в потоке bytes (stream of bytes), DataInputStream прочитает следующие 2 bytes, используя метод readUnsignedShort(), для определения количества bytes, используемых для хранения строки UTF-8, и получается результат utfLeng.
Затем DataInputStream считывает следующие utfLengbytes и преобразует их в строку UTF-8.
- UTF-8
- DataOutputStream
6. readUTF(DataInput in)
Статический методreadUTF(DataInput) используется для чтения строки "Modified UTF-8" (Модифицированной UTF-8) из указанного объекта DataInput.
public static final String readUTF(DataInput in) throws IOException
7. readFully(byte[] buffer)
Считывает как можно больше bytes из этого DataInputStream и присвоит его указанному массиву buffer.
public final void readFully(byte[] buffer) throws IOException
Этот метод блокируется (block) до тех пор, пока не возникнет одно из следующих условий:
- Чтение buffer.length bytes.
- Достигнут конец stream.
- Возникает исключение IOException (отличается от исключения EOFException).
8. readFully(byte[] buffer, int off, int len)
Считывает как можно больше bytes из этого DataInputStream и присваивает его указанному массиву buffer от индекса off до индекса off+len-1.
public final void readFully(byte[] buffer, int off, int len) throws IOException
Этот метод блокируется (block) до тех пор, пока не возникнет одно из следующих условий:
- При чтении buffer.length bytes.
- Достигнут конец stream.
- Возникает исключение IOException (отличается от исключения EOFException).
9. readBoolean()
Метод readBoolean() считывает byte из этого DataInputStream. Если результат не 0, метод возвращает значение true, в противном случае возвращает значение false.
public final boolean readBoolean() throws IOException
10. readByte()
Метод ReadByte() считывает byte из этого DataInputStream, возвращаемое значение находится в диапазоне от -128 до 127.
Он подходит для чтения данных, записанных методом DataOutput.writeByte(byte).
public final byte readByte() throws IOException
11. readUnsignedByte()
Метод readUnsignedShort() считывает 1 byte из этого DataInputStream и преобразует его в целое число 4 bytes без знака со значениями от 0 до 255.
public final int readUnsignedByte() throws IOException
12. readShort()
Метод readShort() считывает 2 bytes из этого DataInputStream и преобразует его в тип данных short.
public final short readShort() throws IOException
Правило преобразования:
return (short)((firstByte << 8) | (secondByte & 0xff));
13. readUnsignedShort()
Метод readUnsignedShort() считывает2 bytes из этого DataInputStream и преобразует его в целое число 4 bytes без знака, значения от 0 до 65535.
public final int readUnsignedShort() throws IOException
Правило преобразования:
return (((firstByte & 0xff) << 8) | (secondByte & 0xff))
14. readChar()
Метод readChar() считывает 2 bytes из этого DataInputStream и преобразует его в тип данных char.
public final char readChar() throws IOException
Правило преобразования:
return (char)((firstByte << 8) | (secondByte & 0xff));
15. readInt()
Метод readInt() считывает 4 bytes из этого DataInputStream и преобразует его в тип данных int.
public final int readInt() throws IOException
Правило преобразования:
return (((firstByte & 0xff) << 24) | ((secondByte & 0xff) << 16)
| ((thirdByte & 0xff) << 8) | (fourthByte & 0xff));
16. readLong()
Метод readLong() считывает 8 bytes из этого DataInputStream и преобразует его в тип данных long.
public final long readLong() throws IOException
Правило преобразования:
return (((long)(byte1 & 0xff) << 56) |
((long)(byte2 & 0xff) << 48) |
((long)(byte3 & 0xff) << 40) |
((long)(byte4 & 0xff) << 32) |
((long)(byte5 & 0xff) << 24) |
((long)(byte6 & 0xff) << 16) |
((long)(byte7 & 0xff) << 8) |
((long)(byte8 & 0xff)));
Руководства 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