io流,字节流概述

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));
          */


    }
}
相关推荐
我命由我1234535 分钟前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康3 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
YuTaoShao5 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw6 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨6 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4046 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空7 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643147 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0017 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
誰能久伴不乏8 小时前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端