FileInputStream文件字节输入流

news2024/12/24 9:05:02

一.概念

以内存为基准,把磁盘文件中的数据以字节形式读入内存中

二.构造器

public FileInputStream(File file)

public FileInputStream(String pathname)

这两个都是创建字节输入流管道与源文件接通

三.方法

public int read() :每次读取一个字节返回,如果发现没有数据可读,返回-1。

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

四.执行

方法一:一个一个字节读

1.代码
package org.example;

import java.io.*;

public class day05 {
    public static void main(String[] args) throws IOException {
        //1.创建文件字节输入流管道与源文件接通:两种方法都行
        InputStream f1 = new FileInputStream(new File("D:\\temp\\day05\\a.txt"));
        InputStream f2 = new FileInputStream("D:\\temp\\day05\\a.txt");
        //2.读取文件的字节数据
        int b1 = f1.read();
        System.out.println(b1);
        System.out.println((char) b1);
        int b2 = f1.read();
        System.out.println(b2);
        System.out.println((char) b2);
        int b3 = f1.read();
        System.out.println(b3);
    }
}
2.结果

 

上面代码一个一个字节读太麻烦了,而且读取汉字会乱码,下面进行优化

方法二:循环读

1.代码
package org.example;

import java.io.*;

public class day05 {
    public static void main(String[] args) throws IOException {

        InputStream f1 = new FileInputStream("D:\\temp\\day05\\b.txt");
        int b; //用于记住读取的字节
        while((b = f1.read()) != -1){
            System.out.print((char)b);
        }
        f1.close();
    }
}

上面代码读取性能很差,且读取汉字会乱码,需要进一步改进 ;流使用完必须要关闭,释放系统资源。

2.结果

方法三:每次读取多个字节

1.代码
package org.example;

import java.io.*;

public class day05 {
    public static void main(String[] args) throws IOException {
        //b.txt内容:abcdefg
        InputStream f1 = new FileInputStream("D:\\temp\\day05\\b.txt");
        //开始读取文件中的字节数据,每次读取多个字节
         byte[] buffer = new byte[4];
         int len = f1.read(buffer);
         String s = new String(buffer);
        System.out.println(s);
        System.out.println("读取的字节数"+len);
        int len2 = f1.read(buffer);
        String s2 = new String(buffer);
        System.out.println(s2);
        System.out.println("读取的字节数"+len2);
        f1.close();
    }
}
2.结果

正常情况下,第二次读取的结果应该是efg而不是efgd

3.改进
package org.example;

import java.io.*;

public class day05 {
    public static void main(String[] args) throws IOException {
        //b.txt内容:abcdefg
        InputStream f1 = new FileInputStream("D:\\temp\\day05\\b.txt");
        //开始读取文件中的字节数据,每次读取多个字节
         byte[] buffer = new byte[4];
         int len = f1.read(buffer);
         String s = new String(buffer);
        System.out.println(s);
        System.out.println("读取的字节数"+len);
        int len2 = f1.read(buffer);
        String s2 = new String(buffer,0,len2);
        System.out.println(s2);
        System.out.println("读取的字节数"+len2);
        f1.close();
    }
}
4.结果 

这个代码有待优化,用循环进一步优化

 方法四:循环读取

1.代码
package org.example;

import java.io.*;

public class day05 {
    public static void main(String[] args) throws IOException {
        //b.txt内容:abcdefg
        InputStream f1 = new FileInputStream("D:\\temp\\day05\\b.txt");
        //开始读取文件中的字节数据,每次读取多个字节
        byte[] buffer = new byte[4];
        int len;
        while ((len = f1.read(buffer)) != -1) {
            String s = new String(buffer, 0, len);
            System.out.print(s);
        }
        f1.close();
    }
}
2.结果

 

五.问题 

上面代码读取性能提升了,但依旧在读取汉字上会产生乱码

解决方案一:定义一个与文件一样大的字节数组,一次性读取完文件的全部字节(不推荐)

 方法1

1.代码
package org.example;

import java.io.*;

public class day05 {
    public static void main(String[] args) throws IOException {
        //c.txt内容:我们在一起abcd
        InputStream f1 = new FileInputStream("D:\\temp\\day05\\c.txt");
        //这里的19可以用f1.length()获取
        byte[] buffer = new byte[19];
        int len;
        while ((len = f1.read(buffer)) != -1) {
            String s = new String(buffer, 0, len);
            System.out.print(s);
        }
        f1.close();
    }
}
2.结果

 

 方法2

1.代码
package org.example;

import java.io.*;

public class day05 {
    public static void main(String[] args) throws IOException {
        //c.txt内容:我们在一起abcd
        InputStream f1 = new FileInputStream("D:\\temp\\day05\\c.txt");
        final byte[] bytes = f1.readAllBytes();
        System.out.println(new String(bytes));
    }
}
2.结果

上面代码还有待优化,万一文件特别大,用readAllBytes()会抛出异常。

 

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

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

相关文章

设计模式:原型模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《访问者模式》 下一篇《享元模式》 简介: 原型模式,它是一种创建型设计模式,它允许通过复制原型对象来创建新的对象,而无需知道创建的细节。其工作原…

安装Spring Tool Suite 4的一些问题

1、安装lombok.jar (1)把lombok.jar放到Spring Tool Suite 4的根目录下,java -jar lombok.jar,选择Spring Tool Suite 4,安装。然后SpringToolSuite4.ini里面会自动写入一行 sts4需要额外配置一行参数【-javaagent:lo…

springboot+mybatis-plus实现读写分离

shigen坚持日更的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考,不断沉淀和成长。 最近shigen加班也比较严重,很多天文章没有更新了,各位读者和伙伴见…

2023/10/28 JAVA学习

导入模块 找到模块路径后,复制到上面,注意导入的是这个 还需要注意,这样导入的话,可能模块不在同一个工程文件里,如果不小心删除这个模块,就不能使用了,所以建议,把原本模块先复制到工程文件中,然后再找模块路径,进行上面操作 还有一种方式新创一个模块,然后把想要导入的模块代…

不一样的网络协议-------KCP协议

1、kcp 的协议特点 1.1、RTO 不翻倍 RTO(Retransmission TimeOut),重传超时时间。tcp x 2,kcp x 1.5,提高传输速度 1.2、选择重传 TCP丢包时会全部重传从该包开始以后的数据,而KCP选择性重传,只重传真正丢失的数据包…

『力扣刷题本』:移除链表元素

一、题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2: 输入&a…

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab实现ARIMA-LSTM差…

开源B2B网站电子商务平台源码下载搭建 实现高效交易的桥梁

随着互联网的普及和电子商务的快速发展,B2B(Business-to-Business)网站电子商务平台在商业领域中发挥着越来越重要的作用。通过开源B2B网站电子商务平台源码搭建,企业可以构建自己的电子商务平台,实现高效交易的桥梁。…

Claim Proof Bug——Aztec最大的45万美金bug bounty

1. 引言 近期,Aztec Labs通过其Immunefi bug bounty program,发出了其有史以来最大的bug bounty——45万美金,给白帽独立安全研究员lucash-dev,以感谢其所发现的Aztec Connect Claim Proof Bug,基本时间轴为&#xff…

EASEX绘制卡通头像

#include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #define PI 3.14 // 1PI 180度 2PI 360度int main() {// 创建1024*1024的窗体initgraph(1024, 1024);// 将背景颜色设施为白色setbkcolor(WHITE);cleardevice();// to…

Leetcode刷题详解——不同路径

1. 题目链接&#xff1a;62. 不同路径 2. 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”…

【python练习】python斐波那契数列超时问题

计算斐波那契数列第n项的数字 Description计算斐波那契数列第n项的数字&#xff0c;其中f(1)f(2)1,f(n)f(n-1)f(n-2)&#xff0c;如1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5,......Input 正整数n(n<100)Output 一个整数f(n)Sample Input 1 8 Sample Output 1…

【数据结构实战项目】C语言实现数据结构顺序表万字详解(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个顺序表: 该顺序表使用动态内存分配,可以用来存储任意数量的同类型数据. 顺序表需要包含三个要素:存储数据的数组arr,顺序表…

Pandas透视表

Pandas使用pivot_table()方法和crosstab()方法实现透视表。 pivot_table()方法及参数 pivot_table()方法的语法格式如下&#xff1a; pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameA…

10月份程序员书单推荐

新书书单 1、C程序设计教程&#xff08;第9版&#xff09; 1.广受认可的《C程序设计教程》系列的第9版&#xff08;个别版本也译作《C语言大学教程》&#xff09;&#xff0c;秉承了该系列一贯的丰富而详细的风格。该系列一些版本因封面画有蚂蚁形象而被称为“C语言蚂蚁书”。…

有一个带头结点的单链表L,设计一个算法使其元素递增有序

有一个带头结点的单链表L&#xff0c;设计一个算法使其元素递增有序 代码思路&#xff1a; 我这里懒得搞那个指针了&#xff0c;直接遍历一遍链表&#xff0c;把链表的元素复制到数组arr里面 对数组A进行一下排序&#xff0c;排完之后再把元素复制到L里面。 至于排序你用啥算…

构建外卖小程序:技术要点和实际代码

1. 前端开发 前端开发涉及用户界面设计和用户交互。HTML、CSS 和 JavaScript 是构建外卖小程序界面的主要技术。 <!-- HTML 结构示例 --> <header><h1>外卖小程序</h1><!-- 其他导航元素 --> </header> <main><!-- 菜单显示 -…

Capacitor 打包 h5 到 Android 应用,uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED

Capacitor 打包 h5 到 Android 应用&#xff0c;uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED capacitor 官网&#xff1a; https://capacitorjs.com/docs/ 项目上需要做一个 app&#xff0c;而这个 app 是用 uniapp 做的&#xff0c;里面用到了一个依赖 dom 的库&…

winscp显示隐藏文件

当前目录下有被隐藏的文件时&#xff0c;会在右下角看到 “已隐藏” 的字样&#xff0c;双击这个字样&#xff0c;就会显示被隐藏的文件和文件夹