Java——IO流(一)-(6/8):字节流-FileInputStream 每次读取多个字节(示例演示)、一次读取完全部字节(方式一、方式二,注意事项)

news2024/11/27 2:37:15

目录

文件字节输入流:每次读取多个字节

实例演示

注意事项

文件字节输入流:一次读取完全部字节

方式一

方式二

注意事项


文件字节输入流:每次读取多个字节

用到之前介绍过的常用方法:

实例演示

需求:用每次读取多个字节的方法读出File文件的内容

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class FileInputStreamTest2 {
    public static void main(String[] args) throws Exception {
        //1.创建一个字节输入流对象代表字节输入流管道与源文件接通。
        InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");

        //2.开始读取文件中的字节数据:每次读取多个字节。
        //public int read(byte b[]) throws IoException
        //每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1
        byte[] buffer = new byte[3];
        int len = is.read(buffer);
        String rs = new String(buffer);
        System.out.println(rs);
        System.out.println("当前读取的字节数量:" + len);

        //目标文件有5个字节,需要再读取一次
        //注意:读取多少,倒出多少
        int len2 = is.read(buffer);
        String rs2 = new String(buffer,0,len2);
        System.out.println(rs2);
        System.out.println("当前读取的字节数量:" + len2);

        int len3 = is.read(buffer);
        System.out.println(len3);   //-1

        is.close(); //关闭流
    }
}

运行结果:

使用循环改造一下

package user.IOTestOne;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class FileInputStreamTest2 {
    public static void main(String[] args) throws Exception {
        //1.创建一个字节输入流对象代表字节输入流管道与源文件接通。
        InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");

        //使用循环
        byte[] buffer = new byte[3];
        int len;    //记住每次读取了多少个字节
        while((len = is.read(buffer)) != -1){
            //注意:读取多少,倒出多少
            String rs = new String(buffer,0,len);
            System.out.println(rs);
        }
        //性能得到了明显的提升
        //但是这种方案也不能避免读取汉字输出乱码的问题
        is.close(); //关闭流
    }
}

运行结果:

注意事项

  • 使用FilelnputStream每次读取多个字节,读取性能得到了提升,但读取汉字输出还是会乱码。

使用字节流读取中文,如何保证输出不乱码,怎么解决?

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

文件字节输入流:一次读取完全部字节

方式一

自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节。

方法名称说明
public int read(byte[] buffer)每次用一个字节数组去读取,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1.

注意:文件存于硬盘中,硬盘的大小是极大的,文件的大小也可能会很大;但是我们定义的数组实际上存储于内存中,内存是很小的,无法给数组定义很大的长度;因此,这个方法只适合读取不那么大的文件。

选取案例还是那个File文件

package user.IOTestOne;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class FileInputStreamTest3 {
    public static void main(String[] args) throws Exception{
        //1.创建一个字节输入流管道与源文件接通
        InputStream is = new FileInputStream("HelloWorld/src/file.txt");

        //2.准备一个字节数组,大小与文件的大小正好一样大。
        File f = new File("HelloWorld/src/file.txt");
        long size = f.length();
        byte[] buffer = new byte[(int) size];

        int len = is.read(buffer);
        System.out.println(new String(buffer));

        System.out.println("文件大小:" + size + "字节");
        System.out.println(len);

        is.close();
    }
}

运行结果:

方式二

  • Java官方为lnputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。
方法名称说明
public byte[] readAllBytes()throws IOException直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class FileInputStreamTest3 {
    public static void main(String[] args) throws Exception{
        //1.创建一个字节输入流管道与源文件接通
        InputStream is = new FileInputStream("HelloWorld/src/file.txt");

        byte[] buffer = is.readAllBytes();  //JDK8 之后新增的方法
        System.out.println(new String(buffer));

        is.close();
    }
}

运行结果:

注意事项

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

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

其实,读写文本内容本适合用字符流

字节流适合做数据的转移,如:文件复制等。

下篇就开始介绍字符流。


END


学习自:黑马程序员——Java课程

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

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

相关文章

Linux测试服务器端口是否打开

前言 服务器端口在计算机网络通信中扮演着至关重要的角色,其作用可以归纳如下: 区分不同的应用程序或服务: 服务器端口用于标识和定位不同应用程序或服务在服务器上的通信入口。 通过不同的端口号,服务器可以同时运行多个应用程…

为何人类需重复学习与记忆?人工智能与人类认知机制的融合 —— 生物体AI

零、 AI 与人的认知背景知识 人作为一种生物智能体,学习和记忆的过程往往需要重复与实践。这是因为人的大脑并非一次性就能完美地吸收和储存信息,而是通过反复的认知加工,将短期记忆转化为长期记忆,并通过深度理解、归纳总结以及…

【Research】Model Stealing

What is Model Stealing? Extract an approximation that of the target model that “closely matches” the original Accuracy? Fidelity? Funtional equivalence? Threat Models API Access Model extraction using: Prediction Vectors Labels Only Model Access …

Git 和 TortoiseGit 安装和配置(图文详解)

使用git,需要在Windows上需要安装两个软件:1)Git 2)TortoiseGit 若需要,可以下载TortoiseGit汉化语言包。 注意:tortoiseGit是在安装了Git的基础上运行的,所以需要先安装Git,后安装…

Java多线程基础知识-3

ReentrantLock: condition.await()方法之前必须调用lock.lock()代码获取同步监视器。类比: Object类中的wait()相当于Condition类中的await()Object类中wait(long timeout)相当于Condition类中await(long time, TimeUnit unit)方法Object类中notify()相…

QT基础 - 文件目录操作

目录 零. 简介 一. QDir 二. QFileSystemWatcher 三. 总结 零. 简介 在 QT 中,文件目录操作主要涉及到QDir类和QFileInfo类。 QDir类具有存取目录结构和内容的能力,可以操作目录、存取目录或文件信息、操作底层文件系统,还可以存取 Qt 的…

公司名称含有关商标名称可能涉及侵权!

有个朋友找到普推商标知产老杨,说有个人给他打电话,说他的公司名称侵权另一家的商标名称,让他要改下公司名称,不改就要告侵权,此前看到过许多,在一些省市注册公司时,如果公司名称与已注册商标相…

不懂就问,开通小程序地理位置接口有那么难吗?

小程序地理位置接口有什么功能? 若提审后被驳回,理由是“当前提审小程序代码包中地理位置相关接口( chooseAddress、getLocation )暂未开通,建议完成接口开通后或移除接口相关内容后再进行后续版本提审”,那么遇到这种情况&#x…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《含氢综合能源系统多目标最优折中分布鲁棒低碳调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

MLP多层感知器:AI人工智能神经网络的基石

MLP 是指多层感知器(Multilayer Perceptron),是一种基础人工神经网络模型(ANN,Artificial Neural Network)。MLP 的核心是通过深度学习从大量数据中学习特征和模式,并训练参数。通过参数与激活函…

高精度乘法的实现

这是C算法基础-基础算法专栏的第九篇文章,专栏详情请见此处。 引入 上次我们学习了高精度加法的实现,这次我们要学习高精度减法的实现。 高精度乘法与高精度加法的定义、前置过程都是大致相同的,如果想了解具体内容,可以移步至我的…

10.2 JavaEE——Spring MVC入门程序

要求在浏览器发起请求,由Spring MVC接收请求并响应,具体实现步骤如下。 一、创建项目 在IDEA中,创建一个名称为chapter10的Maven Web项目。 (一)手动设置webapp文件夹 1、单击IDEA工具栏中的File→“Project Structu…

【linux】shell脚本中设置字体颜色,背景颜色详细攻略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

通过开放解析智能分块提高 RAG 性能

如果要使用大型语言模型 ()LLMs 实现生成式 AI 解决方案,则应考虑使用检索增强生成 (RAG) 的策略来生成上下文感知提示LLM。在启用 LLM RAG 的预生产管道中发生的一个重要过程是删除文档文本,以便仅将文档中…

JupyterLab使用指南(八):更改JupterLab左侧默认打开目录

在JupyterLab中,默认打开路径通常是由其配置文件中的root_dir设置决定的。如果你没有特意设置这个配置项,JupyterLab可能会使用当前用户的主目录或者上一次关闭时的路径作为默认打开路径。 更改JupyterLab默认路径的操作在不同操作系统下大体相似&…

Apache Arrow 和数据的未来:开放标准推动人工智能发展

Apache Arrow 是一种开源列式内存格式,适用于平面数据和分层数据。在现代数据湖中,开放数据格式(如 Apache Arrow)位于现代对象存储的存储层中。这些格式成为对象存储中的对象。 在最新版本中,Apache Arrow 宣布计划从…

第二十七篇——通信趋势:5G和IOT的商机在哪里?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 借势的重要性,但是要做到借势,得先看到&#xff0…

WPF文本绑定显示格式StringFormat设置-特殊格式时间日期和多数据绑定

WPF文本绑定显示格式StringFormat设置 特殊格式设置日期/时间使用系统默认样式自定义格式: 绑定多个属性(多重绑定)多重绑定中的特殊字符示例: 特殊格式设置 在Textblock等文本控件中,我们经常要显示一些日期和时间&a…

Android (已解决)Execution failed for task ‘:app:lint‘

文章目录 一、错误原因二、解决方法 一、错误原因 这个错误信息表示在执行 Lint 检查时发现了错误,导致构建过程被中断。Lint 是一个用于检测 Android 项目中潜在问题的工具,比如性能、安全性、可用性等方面的问题。当Lint检查到严重错误时,…

碳钢酸洗线送酸槽蒸汽冷凝水PH计测量装置改进方法

碳钢酸洗线送酸槽蒸汽冷凝水PH计测量装置改进方法 一、项目提出前状况 1)立项背景 轧钢退火酸洗生产线的酸洗过程需要使用大量的硫酸、盐酸、硝酸、氢氟酸等酸液对钢带的表面进行清洗,酸洗过后产生较多的酸洗废水,酸洗废水需要经过处理达到污水排放标准后才能排放。其中酸…