Java IO:DataOutputStream

时间:2020-01-09 10:36:02  来源:igfitidea点击:

JavaDataOutputStream类使我们可以将Java基元写到OutputStream而不是只写字节。我们将OutputStream包装在DataOutputStream中,然后可以向其编写基元。这就是为什么将其称为DataOutputStream的原因,因为我们可以将" int"," long"," float"和" double"值写入" OutputStream",而不仅仅是原始字节。

通常,我们会同时使用Java DataOutputStream和Java DataInputStream。我们使用DataOutputStream将数据写入例如文件,然后使用" DataInputStream"再次读取数据。稍后我将提供一个示例。

一起使用DataOutputStream和DataInputStream是一种方便的方法,它可以将比字节更大的原语写入OutputStream并再次读取它们,确保使用正确的字节顺序等。

DataOutputStream示例

这是一个JavaDataOutputStream示例:

DataOutputStream dataOutputStream = new DataOutputStream(
                            new FileOutputStream("binary.data"));

dataOutputStream.write(45);            //byte data
dataOutputStream.writeInt(4545);       //int data
dataOutputStream.writeDouble(109.123); //double data

dataOutputStream.close();

本示例首先创建一个" DataOutputStream",它将转换后的数据写入" FileOutputStream"。其次,该示例将一个"字节",一个" int"和一个"双精度"写入" DataOutputStream",然后将这些原语转换为字节并将其写入" FileOutputStream"。最后,关闭" DataOutputStream"。

将DataOutputStream与DataInputStream一起使用

如前所述,通常将DataOutputStream类与DataInputStream一起使用。因此,我只想向我们展示一个示例,该示例首先使用DataOutputStream写入数据,然后使用DataInputStream再次读取。这是示例Java代码:

import java.io.*;

public class DataOutputStreamExample {

    public static void main(String[] args) throws IOException {
        DataOutputStream dataOutputStream =
                new DataOutputStream(
                        new FileOutputStream("data/data.bin"));

        dataOutputStream.writeInt(123);
        dataOutputStream.writeFloat(123.45F);
        dataOutputStream.writeLong(789);

        dataOutputStream.close();

        DataInputStream dataInputStream =
                new DataInputStream(
                        new FileInputStream("data/data.bin"));

        int   int123     = dataInputStream.readInt();
        float float12345 = dataInputStream.readFloat();
        long  long789    = dataInputStream.readLong();

        dataInputStream.close();

        System.out.println("int123     = " + int123);
        System.out.println("float12345 = " + float12345);
        System.out.println("long789    = " + long789);
    }
}

这个例子首先创建一个" DataOutputStream",然后将一个" int"," float"和一个" long"值写入文件。第二个例子创建了一个" DataInputStream",它从同一文件中读取" int"," float"和" long"值。

关闭一个DataOutputStream

完成将数据写入" DataOutputStream"后,我们应该记得将其关闭。关闭DataOutputStream也将关闭DataOutputStream正在写入的OutputStream实例。

关闭DataOutputStream的方法是调用其close()方法。这是关闭DataOutputStream的样子:

dataOutputStream.close();

我们还可以使用Java 7中引入的try-with-resources构造。这是如何使用try-with-resources构造使用和关闭" DataOutputStream"外观的方法:

OutputStream output = new FileOutputStream("data/data.bin");

try(DataOutputStream dataOutputStream =
    new DataOutputStream(output)){

    dataOutputStream.writeInt(123);
    dataOutputStream.writeFloat(123.45F);
    dataOutputStream.writeLong(789);
}

请注意,不再有任何显式的close()方法调用。 try-with-resources构造可以解决这一问题。

还要注意,第一个FileOutputStream实例不是在try-with-resources块内创建的。这意味着try-with-resources块不会自动关闭此FileOutputStream实例。但是,当关闭DataOutputStream时,它也会同时关闭写入的OutputStream实例,因此,当DataOutputStream关闭时,FileOutputStream实例也将关闭。