• Java进阶核心之InputStream流


    Java进阶核心之InputStream流

    Java核心包 java.io包介绍

    • IO: Input / Ouput 即输入输出
      • 输出流:程序(内存) —>外界设备
      • 输入流:外界设备—>程序(内存)
    • 处理理数据类型分类
      • 字符流:处理字符相关,如处理文本数据(如txt文件), Reader/Writer
      • 字节流: 处理字节相关,如声音或者图片等二进制,InputStream/OutputStream
    • 两者区别:
      • 字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节
      • 字节流可以处理几乎所有文件,字符流只能处理字符类型的数据
    • 功能不同,但是具有共性内容,通过不断抽象形成4个抽象类,抽象类下面有很多子类是具体的实现
      • 字符流 Reader/Writer
      • 字节流 InputStream/OutputStream
    • IO流相关类体系概览
      在这里插入图片描述

    Java输入流Inputstream讲解

    • InputStream是输入字节流的父类,它是一个抽象类(一般用他的子类)

      int read()
      讲解:从输?入流中读取单个字节,返回0到255范围内的int字节值,字节数据可直接转换为int类
      型, 如果已经到达流末尾?而没有可?用的字节,则返回- 1
      int read(byte[] buf)
      讲解:从输?入流中读取?一定数量量的字节,并将其存储在缓冲区数组buf中, 返回实际读取的字节
      数,如果已经到达流末尾?而没有可?用的字节,则返回- 1
      long skip(long n)
      讲解:从输?入流中跳过并丢弃 n 个字节的数据。
      int available()
      讲解:返回这个流中有多少个字节数,可以把buf数组?长度定为这个
      void close() throws IOException
      讲解:关闭输?入流并释放与该流关联的系统资源

    • 常见子类

      • FilelnputStream
        • 抽象类InputStream用来具体实现类的创建对象,文件字节输入流,对文件数据以字节的形式进行读取操作
        • 常用构造函数

      //传?入?文件所在地址
      public FileInputStream(String name) throws FileNotFoundException
      //传?入?文件对象
      public FileInputStream(File file) throws FileNotFoundException

    例如:

    package domee.chapter10_2;
    
    import java.io.*;
    
    public class Main {
    
        public static void main(String[] args)throws IOException {
    
            String dir = "C:\Users\阮相歌\Desktop\test";
    
            String name = "a.txt";
    
            File file = new File(dir,name);
    
            InputStream inputStream = new FileInputStream(file);
    
            testRead(inputStream);
            testSkip(inputStream);
            testReadByteArr(inputStream);
        }
    
    
    
        public static void testReadByteArr(InputStream inputStream)throws IOException{
    
            //如果buf的长度为0,则不读取任何字节并返回0;每次读取的字节数最多等于buf的长度
            //byte[] buf = new byte[1024];
            byte[] buf = new byte[inputStream.available()];
    
            int length;
    
            //循环读取文件内容,输入流中将最多的buf.length
            // 个字节数据读入一个buf数组中,返回类型是读取到的字节数
            //如果这个缓冲区没有满的话,则返回真实的字节数
            while ((length = inputStream.read(buf))!= -1){
    
    
                //中文乱码问题,换成GBK,或者UTF-8
                System.out.print(new String(buf,0,length));
                System.out.print(new String(buf,0,length,"UTF-8"));
                System.out.println(new String(buf,0,length));
            }
        }
        public static void testRead(InputStream inputStream)throws IOException{
    
            //对于汉字等 unicode中的字符不能正常读取,只能以乱码的形式显示
            int read = inputStream.read();
            System.out.println(read);
            System.out.println((char)read);
        }
        public static void testSkip(InputStream inputStream)throws IOException{
    
            long skipSize = inputStream.skip(2);
            System.out.println(skipSize);
    
            int read = inputStream.read();
            System.out.println(read);
            System.out.println((char)read);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 编码小知识(节省空间)
      • 操作的中文内容多则推荐GBK:
        • GBK中英文也是两个字节,用GBK节省了空间,UTF-8编码的中文使用了三个字节
      • o如果是英文内容多则推荐UFT-8:
        • 因为UFT-8里面英文只占一个字节
        • UTF-8编码的中文使用了三个字节

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    双十二哪些数码好物值得入手?盘点双十二最值得入手的数码好物
    自主专利和转让专利的区别
    Erlang 入门——从普通tcp到OTP框架通信
    深入理解Python中的布尔值:真与假
    “双新”背景下需家校社协同培养孩子核心素养
    【React】React组件生命周期以及触发顺序(部分与vue做比较)
    基于Java毕业设计养老机构管理信息系统源码+系统+mysql+lw文档+部署软件
    论文发表需要的重复率是多少?
    开源DMS文档管理系统 Nuxeo Vs Alfresco对比及 API 使用概述
    漏洞检测与EPSS评分
  • 原文地址:https://blog.csdn.net/m0_67392273/article/details/126109024