当前位置: 代码迷 >> 综合 >> Java IO (8) -- DataOutputStream 类 DataInputStream 类
  详细解决方案

Java IO (8) -- DataOutputStream 类 DataInputStream 类

热度:94   发布时间:2023-12-16 13:26:34.0

文章目录

    • 1. 概念
    • 2. 字段
      • 1. DataOutputStream
      • 2. DataInputStream
    • 3. 方法
      • 1. 构造器
        • 1. DataOutputStream
        • 2. DataInputStream
      • 2. 其他方法
        • 1. DataOutputStream
        • 2. DataInputStream
    • 4. 案例
    • 5. 扩展

1. 概念

DataOutputStream数据输出流允许应用程序将基本Java数据类型写到基础输出流中,而DataInputStream数据输入流允许应用程序以机器无关的方式从底层输入流中读取基本的Java类型。

2. 字段

1. DataOutputStream

  1. protected int written:写到数据输出流的字节数
  2. private byte[] bytearr = null:将数据读取到字节数组中缓冲

2. DataInputStream

  1. private byte bytearr[] = new byte[80]:字节数组,会将数据先读取到字节数组里面缓冲
  2. private char chararr[] = new char[80]:字符数组,会将数据先读取到字符数组里面缓冲

3. 方法

1. 构造器

1. DataOutputStream

  1. public DataOutputStream(OutputStream out) { super(out); }:传入基础输出流,将数据实际写到基础输出流中

2. DataInputStream

  1. public DataInputStream(InputStream in) { super(in);}:传入基础输入流.读取数据实际上通过基础输入流 in 来读取

2. 其他方法

1. DataOutputStream

  1. private void incCount(int value):数据输出流增加的字节数
  2. public synchronized void write(int b) throws IOException:将int类型的b写到数据输出流中
  3. public synchronized void write(byte b[], int off, int len) throws IOException:将字节数组b中off位置开始,len个长度写到数据输出流中
  4. public void flush() throws IOException:刷新数据输出流
  5. public final void writeBoolean(boolean v) throws IOException:将布尔类型的数据写到数据输出流中,底层是转化成一个字节写到基础输出流中
  6. public final void writeByte(int v) throws IOException:将一个字节写到数据输出流中(实际是基础输出流)
  7. public final void writeShort(int v) throws IOException:将一个short类型的数据写到数据输出流中,底层将v转换2个字节写到基础输出流中
  8. public final void writeChar(int v) throws IOException:将一个charl类型的数据写到数据输出流中,底层是将v转换成2个字节写到基础输出流中
  9. public final void writeInt(int v) throws IOException:将一个int类型的数据写到数据输出流中,底层将4个字节写到基础输出流中
  10. public final void writeLong(long v) throws IOException:将一个long类型的数据写到数据输出流中,底层将8个字节写到基础输出流中
  11. public final void writeFloat(float v) throws IOException:将一个float类型的数据写到数据输出流中,底层会将float转换成int类型,写到基础输出流中
  12. public final void writeDouble(double v) throws IOException:将一个double类型的数据写到数据输出流中,底层会将double转换成long类型,写到基础输出流中
  13. public final void writeBytes(String s) throws IOException:将字符串按照字节顺序写到基础输出流中
  14. public final void writeChars(String s) throws IOException:将字符串按照字节顺序写到基础输出流中
  15. public final void writeUTF(String str) throws IOException:以机器无关的方式使用utf-8编码方式将字符串写到基础输出流中
  16. public final int size(): 写到数据输出流中的字节数

2. DataInputStream

  1. public final int read(byte b[]) throws IOException:从数据输入流读取数据存储到字节数组b中
  2. public final int read(byte b[], int off, int len) throws IOException:从数据输入流中读取数据存储到数组b里面,位置从off开始,长度为len个字节
  3. public final void readFully(byte b[]) throws IOException:从数据输入流中循环读取b.length个字节到数组b中
  4. public final void readFully(byte b[], int off, int len) throws IOException:从数据输入流中循环读取len个字节到字节数组b中.从b的off位置开始
  5. public final int skipBytes(int n) throws IOException:跳过n个字节
  6. public final boolean readBoolean() throws IOException:从数据输入流读取布尔类型的值
  7. public final byte readByte() throws IOException:从数据输入流中读取一个字节
  8. public final int readUnsignedByte() throws IOException:数据输入流中读取一个无符号的字节,返回值转换成int类型
  9. public final short readShort() throws IOException:从数据输入流读取一个short类型数据
  10. public final int readUnsignedShort() throws IOException:从数据输入流读取一个无符号的short类型数据
  11. public final char readChar() throws IOException:从数据输入流中读取一个字符数据
  12. public final int readInt() throws IOException:从数据输入流中读取一个int类型数据
  13. public final long readLong() throws IOException:从数据输入流中读取一个long类型的数据
  14. public final float readFloat() throws IOException:从数据输入流中读取一个float类型的数据
  15. public final double readDouble() throws IOException:从数据输入流中读取一个double类型的数据
  16. public final String readUTF() throws IOException:从数据输入流中读取用UTF-8格式编码的UniCode字符格式的字符串

4. 案例

public class DataOutAndInStreamDemo {
    public static void main(String[] args) throws IOException {
    DataOutputStream dos = new DataOutputStream(new FileOutputStream("D:\\java.txt"));dos.writeUTF("α");dos.writeInt(1234567);dos.writeBoolean(true);dos.writeShort((short)123);dos.writeLong((long)456);dos.writeDouble(99.98);DataInputStream dis = new DataInputStream(new FileInputStream("D:\\java.txt"));System.out.println(dis.readUTF());System.out.println(dis.readInt());System.out.println(dis.readBoolean());System.out.println(dis.readShort());System.out.println(dis.readLong());System.out.println(dis.readDouble());dis.close();dos.close();}
}
//结果
α
1234567
true
123
456
99.98

5. 扩展

  1. 数据输入流和输出流以机器无关的方式进行写入和读取数据,实际上数据输出流是将java的基本类型,底层存储的时候以字节形式进行存储.而数据输入流读取后数据后,会将字节的进行拼接.得到java基本类型,如:

    public final void writeShort(int v) throws IOException {
          out.write((v >>> 8) & 0xFF);out.write((v >>> 0) & 0xFF);
    }public final short readShort() throws IOException {
          int ch1 = in.read();int ch2 = in.read();if ((ch1 | ch2) < 0)throw new EOFException();return (short)((ch1 << 8) + (ch2 << 0));
    }
    

    当数据输出流使用write写出一个short类型的数据,由于short类型占2字节,即16位,分别移动8,0位,然后和0xFF(二进制是1111 1111)进行逻辑"&"运算分别得到2个8位.进行&0xFF操作,不会改变原先的数值(例如1100 0011&0xFF还是得到原先的11000011),比如(v>>>8)&0xFF是为了取得v的高8位.而(v>>>0)&0xFF是为了取得低8位.然后两个字节分别存储

  2. 关于writeUTF()和readUTF()方法,前者就是Unicode编码转换成UTF-8编码,readUTF()方法将对应的UTF-8编码转换,获取其中有效的位数,转换成Unicode编码

  相关解决方案