io流,字节流概述

news2024/11/20 20:35:36

io流概述

io流:输入输出流读写数据的
i 指Input,称为输入流:负责把数据读到内存中去
o指Output,称为输出流:负责写数据出去

io流的分类

按流的方向分为: 

输入流和输出流。

按流中数据的最小单位,

分为:字节流(适合操作所有类型的文件,eg:比如:音频、视频、图片文本文件的复制,转移等。)和字符流(只适合操作纯文本文件,eg:读写txt、java文件等)

总结流的四大类: 


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

IO流的体系

JAVA.io包下

FileInputStream:文件字节输入流

作用:以内存为基准,可以把文件磁盘中的内容以字节的形式读入到内存中去

构造器说明
public FileInputStream(File file) 创建字节输入流管道与源文件接通
public FileInputStream(String pathname)创建字节输入流管道与源文件接通
方法名称说明
public int read() 每次读取一个字节返回,如果发现没有数据可读会返回-1. 
public int read(byte[ ]buffer) 

每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,
如果发现没有数据可读会

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

public class InputStream1 {
    //掌握文件字节输入流,每次读取一个字节
    public static void main(String[] args) throws Exception {
        //创建文件字节输入流管道
       //InputStream is=new FileInputStream(new File("D:\\code\\weilai1\\src\\itheima.txt"));
       InputStream is=new FileInputStream("D:\\code\\weilai1\\src\\itheima.txt");
       //开始读取文件的字节数据
        //public int read() 	每次读取一个字节返回,如果发现没有数据可读会返回-1.
        int b1=is.read();
        System.out.println(b1);
        int b2=is.read();
        System.out.println(b2);
        //使用循环改造上方代码
        int b;
        while ((b=is.read())!=-1){
            System.out.print((char) b);
        }
        //读取数据的性能非常差,读取汉字输出会乱码!不可避免
        //流使用完毕之后,必须关闭,否则会浪费系统资源
        is.close();
    }
}
使用FileInputStream每次读取多个字节
import java.io.*;

public class InputStream2 {
    //目标:掌握使用FileInputStream每次读取多个字节
    public static void main(String[] args) throws IOException {
    //1、创建一个字节输入流对象代表字节输入流管道与源文件接通
        InputStream is=new  FileInputStream("D:\\code\\weilai1\\src\\itheima.txt");
        //2、开始读取文件中的字节数据,每次读取多个字节
        /*
        byte[]buffer=new byte[3];
        int len =is.read(buffer);
       String rs= new String (buffer);
        System.out.println(len);
        System.out.println(rs);
        int len1 =is.read(buffer);
        String rs1= new String (buffer,0,len1);
        System.out.println(len1);
        System.out.println(rs1);
        int len2 =is.read(buffer);
        System.out.println(len2);//-1

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

    }
}

使用字节流输入中文,如何保证不乱码?

定义 一个与文件大小一样大的字节数组,一次性读完文件的所有字节

import java.io.*;

public class InputStream3 {
    //目标:使用文件字节输入流一次读取文件的全部字符
    public static void main(String[] args) throws IOException {
        //1、一次性读取完文件的全部字节到一个字节数组中去
        //创建一个字节输入流对象代表字节输入流管道与源文件接通
        InputStream is=new FileInputStream("D:\\code\\weilai1\\src\\itheima.txt");
        //准备一个字节数组,大小与文件的大小正好一样大
        File file=new File("D:\\code\\weilai1\\src\\itheima.txt");
      long size=file.length();
      byte[]bytes=new byte[(int)size];
            int len=is.read(bytes);
        System.out.println(new String(bytes));
        System.out.println(size);
        System.out.println(len);
    }
}

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

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

 
方式二:Java官方为InputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。

方法名称说明
public byte[]readAllBytes() throws IOException直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
import java.io.*;

public class InputStream3 {
    //目标:使用文件字节输入流一次读取文件的全部字符
    public static void main(String[] args) throws IOException {
        //1、一次性读取完文件的全部字节到一个字节数组中去
        //创建一个字节输入流对象代表字节输入流管道与源文件接通
        InputStream is=new FileInputStream("D:\\code\\weilai1\\src\\itheima.txt");
        //准备一个字节数组,大小与文件的大小正好一样大
        File file=new File("D:\\code\\weilai1\\src\\itheima.txt");

      long size=file.length();
      byte[]bytes=new byte[(int)size];
            int len=is.read(bytes);
        System.out.println(new String(bytes));
        System.out.println(size);
        System.out.println(len);
         /*
        byte[]bytes=is.readAllBytes();
        System.out.println(new String(bytes));
          */


    }
}

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

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

相关文章

LWIP+TCP客户端

一、TCP API函数 其中tcp_poll()函数的第三个参数表示隔几秒调用一次这个周期性函数 二、修改服务器的IP 三、TCP客户端编程思路 申请套接字绑定服务器IP和端口号等待客户端连接 进入连接回调函数在连接回调函数中 配置一些回调函数,如接收回调函数,周期…

C++必修:类与对象(三)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. 隐式类型转换 在学习C语言时我们就明白,当我们进行赋值时&#xf…

智慧旅游引领旅游行业创新发展:借助智能科技的力量,实现旅游资源的优化配置和高效利用,推动旅游行业的转型升级和可持续发展

目录 一、引言 二、智慧旅游的定义与特点 1、信息化程度高 2、智能化服务丰富 3、互动性强 4、个性化服务突出 5、可持续性发展 三、智慧旅游在旅游行业创新发展中的作用 (一)优化旅游资源配置 (二)提升旅游服务质量 &…

vue3 jspdf,element table 导出excel、pdf,横板竖版分页

多个表格需要,pdf需要的格式与原本展示的表格样式不同 1.创建一个新的表格,设置pdf需要的样式,用vue的h函数放入dom中 2.excel用xlxs插件直接传入新建el-table的dom,直接导出 3.pdf导出类似excel黑色边框白底黑字的文件,把el-t…

开源版本管理系统的搭建一:SVN服务端安装

作者:私语茶馆 1.Windows搭建SVN版本管理系统 点评:SVN本身非常简洁易用,VisualSVN文档支撑非常好,客户端TortoiseSVN非常专业。5星好评。 1.1.SVN概要和组成 背景介绍 Svn是一个开源版本管理系统,由CollabNet公司…

ffmpeg 推流

参考 【windows&&linux环境下实现ffmpeg&&vlc rtsp本地视频、摄像头推流,VLC推拉流】 本地视频 推流 localhost 下载 mediamtx 服务器 https://github.com/bluenviron/mediamtx/releases 下载 ffmpeg https://github.com/BtbN/FFmpeg-Builds/rel…

基于vmware虚拟机中yum源的配置

1.首先需确保虚拟机中已经连接了光盘映像(如图在虚拟机右下方从左往右第二个) 2.在虚拟机中找到光盘映像文件(默认在/dev的sr0) 3.将光盘文件挂载(挂载后才可读取) 为方便每一次开机之后自动挂载&#xff…

jQuery 笔记13 JavaScript的好帮手

相关内容:下载jQuery网址、jQuery的使用、表格排序软件(tablesorter)、行事历软件(FullCalendar)、…… jQuery是一套开放性源代码的JavaScript函数库(Library),jQuery是JavaScript函数库,简化了…

《21天学通C++》(第十二章)运算符类型与运算符重载

1.为什么要重载运算符&#xff1f; 通过重载运算符&#xff0c;可以将复杂的操作封装成简单的运算符形式&#xff0c;简化代码&#xff0c;提高可读性下面举一个简单的例子 计算两个点的坐标之和。 1.不重载运算符 #include <iostream> using namespace std; class P…

JavaScript基础(四)

逻辑运算符 && 与 : 多个条件同时满足 ΙΙ 或 : 多个条件满足一个 &#xff01; 非 : 否定某个条件 例: <script> //&多个条件同时满足&#xff0c;才返回true //任意一个为false&#xff0c;就返回false var a 10; var b 20; …

【linux】重定向

重定向 什么是重定向如何实现一个简单的重定向关于重定向的系统调用接口 注意&#xff1a;在看这篇博客之前&#xff0c;最好是要对文件在系统中是如何被打开的以及操作系统是如何管理文件有一个初步了解&#xff0c;如果不了解的话&#xff0c;可以看看这篇博客《初步认识文件…

stm32之hal库spi驱动封装(实现阻塞,中断,dma三种方式)

前言 配置功能参考rt-thread驱动代码将中断配置和dma配置单独分开管理 代码 中断管理 头文件 /** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2024-5-3 shchl first version*/#ifnd…

【AIGC】本地部署 ollama + open-webui

在之前的篇章《【AIGC】本地部署 ollama(gguf) 与项目整合》中我们已经使用 ollama 部署了一个基于预量化&#xff08;gguf&#xff09;的 Qwen1.5 模型&#xff0c;这个模型除了提供研发使用外&#xff0c;我还想提供给公司内部使用&#xff0c;因此还需要一个 ui 交互界面。 …

2003-2022年各省对外直接投资存量/省对外直接投资流量/省OFDI流量/省OFDI存量数据

2003-2022年各省对外直接投资存量、省对外直接投资流量、省OFDI流量、省OFDI存量数据 1、时间&#xff1a;2003-2022年 2、来源&#xff1a;对外直接投资公报 3、范围&#xff1a;31省 4、指标&#xff1a;省对外直接投资流量/OFDI流量、省对外直接投资存量/OFDI存量 5、指…

OpenCV(三)—— 车牌筛选

本篇文章要介绍如何对从候选车牌中选出最终进行字符识别的车牌。 无论是通过 Sobel 还是 HSV 计算出的候选车牌都可能不止一个&#xff0c;需要对它们进行评分&#xff0c;选出最终要进行识别的车牌。这个过程中会用到两个理论知识&#xff1a;支持向量机和 HOG 特征。 1、支…

爬虫自动化之drissionpage实现随时切换代理ip

目录 一、视频二、dp首次启动设置代理三、dp利用插件随时切换代理一、视频 视频直接点击学习SwitchyOmega插件使用其它二、dp首次启动设置代理 from DrissionPage import ChromiumPage, ChromiumOptions from loguru

MySQL与金蝶云星空对接集成执行查询语句-v2打通销售退货新增V1

MySQL与金蝶云星空对接集成执行查询语句-v2打通销售退货新增V1 数据源系统:MySQL mysql是一个关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;所谓的关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;借助于集合代数等数学概念和方法来处理数…

深度解析 Spring 源码:探寻Bean的生命周期

文章目录 一、 Bean生命周期概述二、Bean生命周期流程图三、Bean生命周期验证3.1 代码案例3.2 执行结果 四、Bean生命周期源码4.1 setBeanName()4.2 setBeanFactory()4.3 setApplicationContext()4.4 postProcessBeforeInitialization()4.5 afterPropertiesSet()4.6 postProces…

npm安装依赖报错解决办法

项目场景&#xff1a; 安装gitee上的开源vue3TS项目&#xff0c;npm安装依赖报错 问题描述 克隆项目到VSCode之后&#xff0c;使用npm install安装依赖&#xff0c;报错 npm install npm ERR! code ENOENT npm ERR! syscall open npm ERR! path Y:\WebStudyBlog\MovieWeb/p…

【Linux】学习笔记

文章目录 [toc]第一章&#xff1a;基础篇01|课程介绍02|内容综述03|什么是Linux04|Linux的内核版本及常见发行版内核版本发行版本Red Hat Enterprise LinuxFedoraCentOSDebianUbuntu 05|安装VirtualBox虚拟机VirtualBox下载url 06|在虚拟机中安装Linux系统Linux安装镜像下载 07…