数据输入输出流(I/O)

文章目录


前言

        数据输入输出流也是将文件输入输出流打包后使用的对象。相比于文件输入输出流,数据输入输出流提供了简单易用的方法去操作不同类型的数据;自身采用缓冲区机制,提高运行效率。

        数据输入输出流适用于对内存中的数据进行读写操作,简单易用,而文件输入输出流适用于对文件进行读写操作,具有更好的性能和对大文件的支持。


一、数据输入输出流是什么?

        数据输入输出流是用于在程序中读取和写入数据的基本机制。它们是一种操作数据的方式,允许程序与外部设备(如文件、网络、键盘、屏幕等)进行交互。(需要导入java.io包)

        数据输入流(DataInputStream)用于从外部设备读取数据,并将其转化为程序可以处理的数据格式。常见的数据输入流包括输入文件流(FileInputStream)、输入字符流(FileReader)和标准输入流(System.in)等。

        数据输出流(DataOutputStream)用于将程序中的数据写入到外部设备。常见的数据输出流包括输出文件流(FileOutputStream)、输出字符流(FileWriter)和标准输出流(System.out)等。

二、使用方法

1.DataInputStream类

构造方法:

new DataInputStream(InputStream in);
//in参数为被包装的字节输入流
DataInputStream类的特有方法
方法 功能描述
readByte() 从输入流中读取一个字节,并将其作为有符号的byte值返回
 readUnsignedByte() 从输入流中读取一个字节,并将其作为无符号的byte值返回
readChar() 从输入流中读取两个字节,并将其作为char值返回
 readShort() 从输入流中读取两个字节,并将其作为有符号的short值返回
readUnsignedShort() 从输入流中读取两个字节,并将其作为无符号的short值返回
readInt() 从输入流中读取四个字节,并将其作为有符号的int值返回
 readLong() 从输入流中读取八个字节,并将其作为有符号的long值返回
readFloat() 从输入流中读取四个字节,并将其作为float值返回
readDouble() 从输入流中读取八个字节,并将其作为double值返回
readUTF() 从输入流中读取一个UTF-8编码的字符串,并将其作为String对象返回

2.DataOutputStream类

构造方法:

new DataOutputStream(OutputStream out);
//out参数为被包装的字节输出流
DateOutputStream类的特有方法
方法 功能描述
writeUTF(String s) 将一个UTF-8编码的字符串写入此流
writeBoolean(boolean b) 将一个boolean值写入此流
writeByte(int v) 将一个字节写入此流
writeBytes(String s) 将字节串写入此流
writeShort(int s) 将一个short值写入此流
writeChar(int v) 将一个字节写入此流
 writeChars(String s) 将字符串写入此流
writeInt(int i) 将一个int值写入此流
writeFloat(float f) 将一个float值写入此流
writeLong(long l) 将一个long值写入此流
writeDouble(double d) 将一个double值写入此流

3.实操展示

        项目:使用数据输入输出流,向show.txt文件输入内容,同时将其输入完后的show.txt文件内容返回至控制台中。 

import java.io.*;
public class DataStream {
    public static void main(String[] args) {
        File file = new File("show.txt");
        FileOutputStream out = null;
        DataOutputStream out2 = null;

        FileInputStream in = null;
        DataInputStream in2 =null;
        try {
            out = new FileOutputStream(file);
            out2 = new DataOutputStream(out);
            
            out2.writeUTF("一生二,二生三,三生万物");
            out2.writeInt(1024);

            in = new FileInputStream(file);
            in2 = new DataInputStream(in);
      
            System.out.println(in2.readUTF());
            System.out.println(in2.readInt());
            

        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(out!=null){
                try {
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(out!=null){
                try {
                    out2.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(out!=null){
                try {
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if(out!=null){
                try {
                    in2.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 运行结果:

保存在文件中的信息

返回终端的信息

如图所示,show.txt文件有乱码生成。在Java中,writeUTF()方法用于将字符串按照UTF-8编码格式写入文件。如果写入的文件中出现乱码,可能是因为以下几个原因:

  1. 文件的字符编码与读取文件时使用的字符编码不一致。当你使用writeUTF()写入文件时,文件的编码应该是UTF-8。然而,当你读取文件时,也需要使用UTF-8编码格式来正确读取文件中的内容。

  2. 文件可能包含了非UTF-8编码的字符。writeUTF()只能写入符合UTF-8编码的字符,如果你尝试写入非UTF-8编码的字符,则可能引发乱码问题。

  3. 文件可能被其他程序以不同的编码格式写入。如果你在读取文件时使用了错误的字符编码,那么读取文件内容时就会出现乱码。

 为了解决乱码问题,你可以尝试以下几个步骤:

  1. 确保文件的编码和读取文件时使用的编码一致。例如,当你使用BufferedReader读取文件时,可以指定字符编码如下:
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
    
  2. 确保文件中只包含UTF-8编码的字符。

  3. 如果文件确实包含非UTF-8编码的字符,你可以尝试使用其他编码格式来读取文件。


总结

        以上就是数据输入输出流的简单使用,输入输出流提供的方法可以使我们快速便捷地将数据写入文件或读取文件信息。

相关推荐

  1. C++IO类,输入输出缓冲区,状态

    2024-04-21 18:28:05       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 18:28:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 18:28:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 18:28:05       87 阅读
  4. Python语言-面向对象

    2024-04-21 18:28:05       96 阅读

热门阅读

  1. C#基础|StringBuilder字符串如何高效处理。

    2024-04-21 18:28:05       41 阅读
  2. 36-5 Python 编写poc基础

    2024-04-21 18:28:05       40 阅读
  3. 运维前端vue部署

    2024-04-21 18:28:05       38 阅读
  4. Android开发如何从入门进阶到架构

    2024-04-21 18:28:05       38 阅读
  5. linux下安装mysql和主从搭建_亲测成功

    2024-04-21 18:28:05       35 阅读
  6. 蓝桥杯第859题——旅行

    2024-04-21 18:28:05       38 阅读
  7. 【k8s】(四)kubernetes1.29.4离线部署之-组件安装

    2024-04-21 18:28:05       35 阅读
  8. ElasticSearchDSL

    2024-04-21 18:28:05       36 阅读
  9. 深度学习框架比较:TensorFlow vs PyTorch

    2024-04-21 18:28:05       40 阅读
  10. Flask、Django和Tornado怎么选

    2024-04-21 18:28:05       38 阅读
  11. ollama 开源大语言模型平台

    2024-04-21 18:28:05       38 阅读
  12. 嵌入式学习——C语言基础——day4

    2024-04-21 18:28:05       36 阅读
  13. MapReduce分区机制(Hadoop)

    2024-04-21 18:28:05       37 阅读
  14. 如何在SpringBoot中集成MyBatis?

    2024-04-21 18:28:05       39 阅读