• 学习-Java输入输出之数据IO流之向文件中写入数字并读取


    任务描述

    本关任务:使用数据 IO 流向给定文件中写入给定的 3 个 int 类型数字,并把这些数字分别读取出来。

    相关知识

    之前我们学习了 InputStream(字节输入流)和 OutputStream (字节输出流),下面我们来了解一下它们的间接子类---DataInputStream (数据输入流)和 DataOutputStream(数据输出流)。

    DataOutputStream(数据输出流)

    DataOutputStream 是 FilterOutputStream 的直接子类,而 FilterOutputStream 又是 OutputStream 的直接子类,所以 DataOutputStream 是 OutputStream 的间接子类。该流允许应用程序以与机器无关的方式将 Java 基本数据类型写到底层输出流。

    DataOutputStream 的构造方法

    下表中是它的构造方法:

    构造方法说明
    DataOutputStream(OutputStream out)使用底层输出流创建 DataOutputStream 对象

    构造方法使用示例:

    1. public static void main(String[] args) throws IOException {
    2. // 通过文件字节输出流创建DataOutputStream对象
    3. DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("C:\\Users\\yy\\Desktop\\d.txt"));
    4. }

    DataOutputStream 的常用方法

    下表是它的常用方法:

    方法说明
    write(byte[] w,int off,int len)把字节数组中偏移量从 off 开始的 len 个字节写入此输出流
    write(byte [] b)将字节数组写入此输出流
    writeBooolean()、writeByte()、writeShort()、writeInt()将指定的基本数据类型以字节的方式写入到输出流
    flush()刷新此输出流并强制写出所有缓冲的输出字节
    writeUTF(String s)将字符串格式化顺序写入底层的输出流

    常用方法使用示例:

    1. public static void main(String[] args) throws IOException {
    2. byte b[]={69,70,71,72};
    3. try(
    4. // 通过文件字节输出流创建DataOutputStream对象
    5. DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("C:\\Users\\yy\\Desktop\\d.txt"));) {
    6. // 将基本数据类型写入到输出流
    7. dataOutputStream.writeChar('a');
    8. dataOutputStream.writeInt(69);
    9. dataOutputStream.writeUTF("hello");
    10. // 将字节数组写入输出流
    11. dataOutputStream.write(b);
    12. }
    13. }

    执行结果(在 d.txt 文件中写入了如下内容):

    1. a E helloEFGH

    从以上代码中可以看出,DataOutputStream 不仅可以将像其它字节流一样把字节数组写入输出流,还可以将 Java 基本数据类型写入输出流。

    DataInputStream (数据输入流)

    DataInputStream 是 FilterInputStream 的直接子类,而 FilterInputStream 又是 InputStream 的直接子类,所以 DataInputStream 是 InputStream 的间接子类。该流允许应用程序以与机器无关的方式从底层输入流中读取基本 Java 数据类型。

    DataInputStream 的构造方法

    下表中是它的构造方法:

    构造方法说明
    DataInputStream(InputStream in)使用底层输入流创建一个DataInputStream 对象

    构造方法使用示例:

    1. public static void main(String[] args) throws IOException {
    2. // 通过文件字节输入流创建DataInputStream对象
    3. DataInputStream dataInputStream = new DataInputStream(new FileInputStream("C:\\Users\\yy\\Desktop\\d.txt"));
    4. }

    DataInputStream 的常用方法

    下表是它的常用方法:

    方法说明
    read(byte[] r, int off, int len)从流中读入字节数据到缓冲区数组中指定位置,off 为数组偏移量,len 为写入长度。
    read(byte [] b)从流中读入字节数据到缓冲区数组中
    readBooolean()、readByte()、readShort()、readInt()从输入流中读取基本数据类型
    readUTF()按照格式化顺序读底层的输入流

    常用方法使用示例:

    1. public static void main(String[] args) throws IOException {
    2. try (
    3. // 通过文件字节输出流创建DataOutputStream对象
    4. DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("C:\\Users\\yy\\Desktop\\d.txt"));
    5. // 通过文件字节输入流创建DataInputStream对象
    6. DataInputStream dataInputStream = new DataInputStream(new FileInputStream("C:\\Users\\yy\\Desktop\\d.txt"));) {
    7. // 向文件顺序写出整数、boolean值、字符串
    8. dataOutputStream.writeInt(69);
    9. dataOutputStream.writeBoolean(true);
    10. dataOutputStream.writeUTF("java");
    11. // 按顺序读入数据
    12. int i = dataInputStream.readInt();
    13. Boolean bool=dataInputStream.readBoolean();
    14. String s = dataInputStream.readUTF();
    15. System.out.print("读入的整数:"+i+"。读入的boolean值:"+bool+"。读入的字符串:"+s);
    16. }
    17. }

    执行结果:

    1. 读入的整数:69。读入的boolean值:true。读入的字符串:java

    需要注意的是,要用 DataInputStream 读取一个文件,这个文件必须是由 DataOutputStream 写出的,否则会出现 EOFException 异常,因为 DataOutputStream 在写出的时候会做一些特殊标记,只有 DataInputStream 才能成功的读取。

    1. import java.io.*;
    2. import java.util.Arrays;
    3. import java.util.Scanner;
    4. public class FileTest {
    5. public static void main(String[] args) throws IOException {
    6. // 接收给定的数据
    7. Scanner scanner = new Scanner(System.in);
    8. String filedir = scanner.next();
    9. int num1 = scanner.nextInt();
    10. int num2 = scanner.nextInt();
    11. int num3 = scanner.nextInt();
    12. // 请在此编写代码
    13. /********** Begin **********/
    14. // 将数字写入文件中
    15. try (
    16. // 通过文件字节输出流创建DataOutputStream对象
    17. DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(filedir));
    18. DataInputStream dataInputStream = new DataInputStream(new FileInputStream(filedir));
    19. ){
    20. dataOutputStream.writeInt(num1);
    21. dataOutputStream.writeInt(num2);
    22. dataOutputStream.writeInt(num3);
    23. // 从文件中读取数字,并输出结果
    24. int i = 0;
    25. while (i < 3){
    26. System.out.println("读取的数字为:" + dataInputStream.readInt());
    27. i ++;
    28. }
    29. }
    30. /********** End **********/
    31. }
    32. }

     

  • 相关阅读:
    Vuex的使用
    ubuntu16.04 ros realsense 配置 2022.11.15
    libvirt 使用UEFI 设置 edk2-ovmf
    【攻破css系列——第八天】盒子模型
    MySQL存储过程入门了解
    87、一文带你了解网络操作系统,除了windows、linux,还有你没听过的
    pycharm在重新分配内存后报错jvm找不到
    昇思MindSpore时序AI SIG,共同提高序列大数据分析能力
    每日五道java面试题之spring篇(五)
    python简单练习案例-石头剪刀布小游戏
  • 原文地址:https://blog.csdn.net/weixin_46075438/article/details/128165471