[进阶]Java:IO流分类、文件字节输入流、读取字节数据、避免乱码问题

news2024/11/15 13:58:26

IO流概述

  • I表示intput,是数据从硬盘文件读入到内存的过程,称之输入,负责读。
  • O表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出,负责写。

IO流的分类

  • 按流的方向分
  •  
  •  按流中的数据最小单位分为

 

总结流的四大类:

  • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。
  • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
  • 宇符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
  • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。

文件输入流:FileInputStream

作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。

每次读取一个字节

代码演示如下:

public class FileInputStreamDemo01 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        InputStream is = new FileInputStream("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/data.txt");

        //2.读取一个字节返回(每次读取一滴水)
        int b1 = is.read();
        System.out.println((char) b1); // a

        int b2 = is.read();
        System.out.println((char) b2); // b

        int b3 = is.read();
        System.out.println((char) b3); // 1

        int b4 = is.read(); // 读取完毕返回-1
        System.out.println(b4);

        //3.使用循环改进
        int b;
        while ((b = is.read()) != -1){
            System.out.print((char) b);
        }
    }
}

每次读取一个字节数组存在什么问题?

  • 性能较慢
  • 读取中文字符输出无法避免乱码问题

每次读取一个字节数组

代码演示如下:

public class FileInputStreamDemo02 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        InputStream is = new FileInputStream("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/data02.txt");
        //2.定义一个字节数组,用于读取字节数组
//        byte[] buffer = new byte[3]; //3B ----> 每次装三个字节
//        int len = is.read(buffer);
//        System.out.println("读取了几个字节:" + len);
//        String rs = new String(buffer);
//        System.out.println(rs);
//
//        int len1 = is.read(buffer);
//        System.out.println("读取了几个字节:" + len1);
//        String rs1 = new String(buffer);
//        System.out.println(rs1);
//
//        int len2 = is.read(buffer);
//        System.out.println("读取了几个字节" + len2);
//        // 读取多少倒出多少
//        String rs2 = new String(buffer,0,len2);
//        System.out.println(rs2);
//
//        int len3 = is.read(buffer);
//        System.out.println("读取了几个字节" + len3); // 读取完毕返回-1

        //3.改进使用循环,每次读取一个字节数组
        byte[] buffer = new byte[3];
        int len; // 记录每次读取的字节数
        while ((len = is.read(buffer)) != -1){
            //读取多少倒出多少
            System.out.print(new String(buffer,0,len));
        }
    }

每次读取一个字节数组存在什么问题?

  • 读写的性能得到了提升
  • 读取中文字符输出无法避免乱码问题

1、如何使用字节输入流读取中文内容输出不乱码呢?

  • 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。

2、直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

  • 如果文件过大,字节数组可能引起内存溢出。

 代码演示如下:

public class FileInputStreamDemo03 {
    public static void main(String[] args) throws Exception {
        //1.创建一个文件字节输入流管道与源文件接通
        File f = new File("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/data02.txt");
        InputStream is = new FileInputStream(f);

        //2.定义一个字节数组与文件的大小刚刚好一样大
//        byte[] buffer = new byte[(int) f.length()];
//        int len = is.read(buffer);
//        System.out.println("读取了多少个字节:" + len);
//        System.out.println("文件大小:" + f.length());
//        System.out.println(new String(buffer));

        //读取全部字节数组
        byte[] buffer = is.readAllBytes();
        System.out.println(new String(buffer));
    }
}

1.如何使用字节输入流读取中文内容输出不乱码呢?

  • 一次性读取完全部字节。
  • 可以定义与文件一样大的字节数组读取,也可以使用官方APl•

2.直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

  • 如果文件过大,定义的字节数组可能引起内存溢出。

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

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

相关文章

树状数组(入门附模板)

声明:本篇文章图片非原创 目录 简介 lowbit函数 结构分析 单点修改,区间查询 区间修改,单点查询 区间修改,区间查询 模板题 树状数组1–单点修改,区间查询 题目描述 输入格式 输出格式 输入输出样例 输入 #1 输出 #1 说明/提示 分析 代码 树状数…

移动机器人路径优化:基于Q-learning算法的移动机器人路径优化(提供MATLAB代码)

一、Q-learning算法 Q-learning算法是强化学习算法中的一种,该算法主要包含:Agent、状态、动作、环境、回报和惩罚。Q-learning算法通过机器人与环境不断地交换信息,来实现自我学习。Q-learning算法中的Q表是机器人与环境交互后的结果&#…

哈工大计算机网络课程网络层协议详解之:CIDR与路由聚集

哈工大计算机网络课程网络层协议详解之:CIDR与路由聚集 文章目录 哈工大计算机网络课程网络层协议详解之:CIDR与路由聚集CIDR与路由聚集CIDR路由聚集 CIDR与路由聚集 CIDR CIDR:无类域间路由(CIDR:Classless InterDo…

2.4C++派生类的函数

C 派生类的构造函数 在C中派生类的构造函数,必须调用基类的构造函数,来初始化从基类继承的数据成员。 具体有两种形式: 1、默认构造函数 2、带参数的构造函数 上面的我写的代码中,DerivedClass 构造函数的初始化列表中调用了 …

前缀和以及map混用,打开思路

补一个坑 目录 以力扣560为例: 力扣1248,优美子数组 力扣974 和可被 K 整除的子数组 力扣523.连续的子数组和 浅谈一下前缀和: 我们通过前缀和数组保存前 n 位的和,presum[1]保存的就是 nums 数组中前 1 位的和,也…

王道考研数据结构--3.双链表

目录 1.前言 2.代码难点 2.1双链表的插入和删除 3.代码函数 3.1双链表结构体定义 3.2双链表初始化函数 3.3双链表插入 3.4双链表节点删除 3.5双链表的遍历 4.全部代码 1.前言 日期:2023.6.21 书籍:2024年数据结构考研复习指导(王道…

【计算机视觉】CVPR 23 | 视觉 Transformer 全新学习范式!用长尾数据提升ViT性能

文章目录 一、导读二、介绍三、方法四、总结 一、导读 论文地址: https://arxiv.org/abs/2212.02015代码链接: https://github.com/XuZhengzhuo/LiVT二、介绍 在机器学习领域中,学习不平衡的标注数据一直是一个常见而具有挑战性的任务。近…

JDK自带的构建线程池的方式之newScheduleThreadPool

顾名思义newScheduleThreadPool是一个定时任务的线程池,这个线程池可以定时一定周期去执行任务,也可以实现延迟多久去执行任务一次。 newScheduleThreadPool方法实现展示 基于查看这个方法不难发现,该方法是基于ScheduledThreadPoolExecutor…

基于 Flink CDC 构建 MySQL 到 Databend 的 实时数据同步

这篇教程将展示如何基于 Flink CDC 快速构建 MySQL 到 Databend 的实时数据同步。本教程的演示都将在 Flink SQL CLI 中进行,只涉及 SQL,无需一行 Java/Scala 代码,也无需安装 IDE。 假设我们有电子商务业务,商品的数据存储在 My…

【深度学习】5-5 与学习相关的技巧 - 超参数的验证

超参数指的是,比如各层的神经元数量、batch大小、参数更新时的学习率或权值衰减等。如果这些超参数没有设置合适的值,模型的性能就会很差。 那么如何能够高效地寻找超参数的值的方法 验证数据 之前我们使用的数据集分成了训练数据和测试数据&#xff0c…

WorkPlus AI助理正式上线!为企业打造定制化的AI私有助理

毋庸置疑,ChatGPT的应用充满无限的想象空间。但对于企业来说,使用时面临的最核心的问题就是“存在回答准确性不足”的弊端。那企业都想要通过GPT构建内容生态,在数字化时代保持行业领先地位。 企业都想要结合行业属性、业务需求等自身特点打…

【Flutter】Flutter 数据存储 Hive 的简要使用说明

文章目录 一、前言二、Hive 包的版本号三、Hive 简介1. Hive 是什么?2. Hive 的特点 四、Hive 的基本使用1. Hive 的安装2. Hive 的初始化3. 创建和打开 Hive 数据库4. 数据的存储和读取5. 数据的删除 五、总结 一、前言 🎉想要精通 Flutter&#xff0c…

是时候扔掉cmder, 换上Windows Terminal

作为一个Windows的长期用户,一直没有给款好用的终端,知道遇到了 cmder,它拯救一个习惯用Windows敲shell命令的人。 不用跟我安利macOS真香!公司上班一直用macOS,一方面确实更加习惯windows下面学习, 另一方面是上课需要…

Phantomjs实现后端将URL转换为图片

PhantomJS简介 PhantomJS is a command-line tool. – 其实就是一个命令行工具 PhantomJS的下载地址: Windows:phantomjs-2.1.1-windows.zip Linux:phantomjs-2.1.1-linux-x86_64.tar.bz2;phantomjs-2.1.1-linux-i686.tar.bz2 MacOS:phantomjs-2.1.1-macosx.zip…

西门子Mendix 入门 2

今天还是一直下载失败,就算成功了,速度也只有几K,于是使用翻墙软件,最终下载成功 下载成功后重新点击edit in studio pro 出现如下页面 首先先关闭安全性 进行添加任务和管理任务 点击上方绿色箭头后点击View App 出现如下页面…

ESP32-WROOM-32 UDP单播透传AT指令例程

ESP32-WROOM-32 AT指令配置TCP通讯 ESP32-WROOM-32前言固件烧录测试AT指令UDP单播通讯\透传ESP32配置SoftAPESP32与手机间的UDP通讯与透传普通传输模式演示UDP透传演示 ESP32-WROOM-32 前言 上次演示了ESP32与手机的三种TCP连接与数据传输方法,现在接着上一篇“ESP…

第二章 数据结构(一)——链表,栈和队列与kmp

文章目录 链表栈和队列表达式运算 单调栈单调队列kmp链表练习题826. 单链表827. 双链表 栈和队列练习题828. 模拟栈3302. 表达式求值829. 模拟队列830. 单调栈154. 滑动窗口 kmp练习题831. KMP字符串 kmp虐我一下午 链表 若用链式结构实现链表,效率低,因…

软件开发流程

目录 软件软件开发流程的演变 瀑布模型敏捷模型 XPSCRUMDevOps 1.软件 与计算机系统操作有关的计算机程序、可能有的文件、文档及数据。 软件可以分为两种主要类型: 独立软件:独立软件是一种完整的应用程序,可以直接在计算机或移动设备上…

Android系统安全 — 6.2 Ethernet安卓架构

1. Android Ethernet架构介绍 整个Ethernet系统架构如下图所示: 以太网服务(EthernetService)的启动与注册流程;应用层调用使能ethernet功能的方法流程来分析,从应用层如何将指令一步一步传到底层kernel;…

SAAS-HRM系统概述与搭建环境

SAAS-HRM系统概述与搭建环境 学习目标: 理解SaaS的基本概念 了解SAAS-HRM的基本需求和开发方式掌握Power Designer的用例图 完成SAAS-HRM父模块及公共模块的环境搭建完成企业微服务中企业CRUD功能 初识SaaS 云服务的三种模式 IaaS(基础设施即服务…