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

news2024/11/17 1:48:08

文章目录

  • 前言
  • 一、数据输入输出流是什么?
  • 二、使用方法
    • 1.DataInputStream类
    • 2.DataOutoutStream类
    • 3.实操展示
  • 总结

前言

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

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


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

        数据输入输出流是用于在程序中读取和写入数据的基本机制。它们是一种操作数据的方式,允许程序与外部设备(如文件、网络、键盘、屏幕等)进行交互。(需要导入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编码的字符,你可以尝试使用其他编码格式来读取文件。


总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统架构师】-案例考点(一)

1、软件架构设计 主要考点: 质量属性、软件架构风格、软件架构评估、MVC架构、面向服务的SOA架构、 DSSA、ABSD 1.1、质量属性 1、性能:指系统的响应能力,即要经过多长时间才能对某个事件做出响应,或者在某段时间内系统所能处理的事件的…

不同版本vue安装vue-router

vue-router 是vue官网发布的一个插件库,单页面路由。vue 和 vue-router 之间版本也需要对应。 vue2.x版本使用vue-router3.x版本,vue3.x使用vue-router4.x版本,根据自己的需要选择合适的版本 1、可以在安装前查看vue-router版本,…

K8S哲学 - probe 探针

探针分类: liveness probe readiness probe startup probe Liveness Probe:用于检查容器是否还在运行。如果 Liveness Probe 失败,Kubernetes 会杀死容器,然后根据你的重启策略来决定是否重新启动容器。常见的做法是使用与 Readin…

深度学习:Pytorch分布式训练

深度学习:Pytorch分布式训练 简介模型并行数据并行参考文献 简介 在深度学习领域,模型越来越庞大、数据量不断增加,训练这些大型模型越来越耗时。通过在多个GPU或多个节点上并行地训练模型,我们可以显著减少训练时间。此外&#…

Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用

植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于…

安装Hexo上传插件时,使用hexo d 报错“Spawn Failed”

问题如下: 解决方案: 找到deploy的配置文件 将配置文件增加 [user]email xxxx你git的邮箱地址name 你git的用户名 然后执行hexo clean清除一下后,执行hexo d,会弹出让你登录git的账号和密码,登录后就上传成功了。 …

Java 判断两个Date类型的时间是否大于6天

判断两个Date类型的时间是否大于6天 new Date().toInstant() 是获取当前时间,并转换成Instant对象 cardDeviceTrajectoryInfo.getGpstime().toInstant() 是表中最后一条数据的时间,并转换成Instant对象 // 计算两个时间的间隔 long daysBetween ChronoU…

【基础IO】谈谈动静态库(怒肝7000字)

文章目录 前言实验代码样例静态库生成一个静态库归档工具ar静态库的链接 动态库创建动态库加载动态库 动静态链接静态链接动态链接动静态链接的优缺点 前言 在软件开发中,库(Library)是一种方式,可以将代码打包成可重用的格式&…

隧道代理的优势与劣势分析

“随着互联网的快速发展,网络安全已经成为一个重要的议题。为了保护个人和组织的数据,隧道代理技术逐渐成为网络安全的重要工具。隧道代理通过在客户端和服务器之间建立安全通道,加密和保护数据的传输,有效地防止黑客入侵和信息泄…

docker安装并跑通QQ机器人实践(4)-bs-cqhttp搭建

go-cqhttp,基于 Mirai 以及 MiraiGo 的 OneBot Golang 原生实现,只需简单的配置, 就可以基于 go-cqhttp 使用框架开发,具有轻量, 原生, 高并发, 低占用, 跨平台等特点。 1 go-cqhttp 官网及可执行文件下载链接 go-cqhttp 官网:ht…

如何通过MSTSC连接Ubuntu的远程桌面?

正文共:666 字 12 图,预估阅读时间:1 分钟 前面我们介绍了如何通过VNC连接Ubuntu 18.04的远程桌面(Ubuntu 18.04开启远程桌面连接),非常简单。但是有小伙伴咨询如何使用微软的远程桌面连接MSTSC&#xff08…

二维码门楼牌管理应用平台建设:取保候审的智能化监管

文章目录 前言一、取保候审的传统监管困境二、二维码门楼牌管理应用平台的优势三、取保候审备案信息的智能化处理四、保障居民合法权益五、展望未来 前言 随着信息技术的飞速发展,二维码门楼牌管理应用平台已成为现代社区治理的重要工具。本文重点探讨如何借助该平…

保姆级教程!QRCNN-BiLSTM一键实现多变量回归区间预测!区间预测全家桶再更新!

​ 声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 今天对我们之前推出的区间预测全家桶进行…

最邻近插值和线性插值

最邻近插值 在图像分割任务中:原图的缩放一般采用双线性插值,用于上采样或下采样;而标注图像的缩放有特定的规则,需使用最临近插值,不用于上采样或下采样。 自定义函数 这个是通过输入原始图像和一个缩放因子来对图像…

JVM类加载基本流程及双亲委派模型

1.JVM内存区域划分 一个运行起来的Java进程就是一个JVM虚拟机,这就需要从操作系统中申请一片内存区域。JVM申请到内存之后,会把这个内存划分为几个区域,每个区域都有各自的作用。 一般会把内存划分为四个区域:方法区(也称 "…

力扣287. 寻找重复数

Problem: 287. 寻找重复数 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 利用二分查找搜索1 ~ n中重复的元素,我们每次取出当前二分查找的区间的中间元素mid并在元始的数组nums中统计小于mid的元素的个数count: 若count > mid则说明重复的…

大数据学习的第三天

文章目录 学习大数据命令的方式查看文件拷贝文件的方式添加数据的方式 出现了问题移动文件 hadoop工作流程和工作机制的方式namenodedatanodesecondarynamenode(主节点) 学习大数据命令的方式 查看文件 hadoop fs -cat /test/2.txt下载文件 hadoop fs -get -f /test/2.txt-f …

通俗说字解词:什么是道理?常说讲道理,李秘书讲写作这节就给你讲“道理”!

通俗说字解词:什么是道理?常说讲道理,李秘书讲写作这节就给你讲“道理”! 说到“道理”,这可真是个有意思的词。它由“道”和“理”两个部分组成,就像一碗好吃的面,有汤有料,缺一不可…

xilinx cpri ip 开发记录

CPRI是无线通信里的一个标准协议,连接REC和RE的通信。 Xilinx有提供CPRI IP核。 区别于其它通信协议,如以太网等,CPRI是一个同步系统。 这就意味着两端的Master和Slave应当是同源时钟的,两边不存在频差,并且内部延时…

ikigai极简3p模型:想、能、有

ikigai模型简化为3p模型: - passion 想要、想做 - professional 能要、能做 - profit 有益、有利 根据三角形不可能定律,三者满足两个就很不容易了。又想做又能做的未必有钱,又能做又有钱的未必想做,又想做又有钱的未必能做。 要实…