JAVA IO流 (一) InputStream的read方法


在Java8中,InputStream被定义为一个抽象类,相应的,该类下的read()方法也是一个抽象方法,这也就意味着必须有一个类继承InputStream并且实现这个read方法。
查阅Java8 API,我们可以看到,在InputStream中定义了三个重载的read()方法:
这里写图片描述
但是在这三个方法中,只有参数列表为空的read方法定义为抽象方法,这也就意味着在直接继承自InputStream的所有子类中,必须重写这个方法.

read()

首先我们来看这个没有参数的read方法,从(来源)输入流中(读取的内容)读取数据的下一个字节到(去处)java程序内部中,返回值为0到255的int类型的值,返回值为字符的ASCII值(如a就返回97,n就返回110).如果没有可用的字节,因为已经到达流的末尾, -1返回的值,运行一次只读一个字节,所以经常与while((len = inputstream.read()) != -1)一起使用.

read(byte [] b )

从(来源)输入流中(读取内容)读取的一定数量字节数,并将它们存储到(去处)缓冲区数组b中,返回值为实际读取的字节数,运行一次读取一定的数量的字节数.java会尽可能的读取b个字节,但也有可能读取少于b的字节数.至少读取一个字节第一个字节存储读入元素b[0],下一个b[1],等等。读取的字节数是最多等于b的长度.如果没有可用的字节,因为已经到达流的末尾, -1返回的值 ,如果b.length==0,则返回0.

read( byte [] b , int off , int len)

读取 len字节的数据从输入流到一个字节数组。试图读取多达 len字节,但可能读取到少于len字节。返回实际读取的字节数为整数。 第一个字节存储读入元素b[off],下一个b[off+1],等等。读取的字节数是最多等于len。k被读取的字节数,这些字节将存储在元素通过b[off+k-1]b[off],离开元素通过b[off+len-1]b[off+k]未受影响。read(byte[]b)就是相当于read(byte [] b , 0 , b.length).所以两者差不多.性质一样.

代码示例

package com.yiibai;

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

public class InputStreamDemo {
   public static void main(String[] args) throws Exception {
      
      InputStream is = null;
      byte[] buffer=new byte[5];
      char c;
      
      try{
         // 文本内容为 ABCDE
         is = new FileInputStream("C://test.txt");
         // 这个2指的是数据偏移 不是流偏移 将读取的字节添加到字节数组buffer中
         is.read(buffer, 2, 3);
         // 循环字节数据
         for(byte b:buffer){
            if(b==0)
               // 因为偏移了2个单位,又因为数组默认值为0,所以前面2个单位是没有的
               c='-';
            else
               // 这里是读到的字节
               c=(char)b;
            System.out.print(c);
         }
      }catch(Exception e){
         e.printStackTrace();
      }finally{
         if(is!=null)
            is.close();
      }
   }
}

为什么read()无参方法读取一个字节,返回的是一个int类型,而不是一个byte类型?

因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,一个字节是8个二进制,也就是说我们实际read完后得到的是这样的东西(11111110,00001010),如果每次读取都返回byte,有可能在读到中间的时候遇到111111111(文件的底层按补码来存储的),那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型

  • 17
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,可以了解到Java IO流分为字节流和字符流两种类型。其中字节流以字节为单位进行读写,而字符流以字符为单位进行读写。下面是Java IO字节流的构造方法和使用方法: 1. InputStream类是所有字节输入流的父类,常用方法有: - read():从输入流中读取一个字节的数据。 - read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。 - skip(long n):跳过并丢弃输入流中的n个字节数据。 - available():返回输入流中可以被读取的字节数。 2. FileInputStream类是InputStream类的子类,常用方法有: - FileInputStream(String name):创建一个文件输入流,以读取具有指定名称的文件。 - read():从输入流中读取一个字节的数据。 - read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。 - skip(long n):跳过并丢弃输入流中的n个字节数据。 - available():返回输入流中可以被读取的字节数。 3. FileOutputStream类是OutputStream类的子类,常用方法有: - FileOutputStream(String name):创建一个文件输出流,以写入具有指定名称的文件。 - write(int b):将指定的字节写入此文件输出流。 - write(byte[] b):将b.length个字节从指定的字节数组写入此文件输出流中。 - flush():刷新此输出流并强制任何缓冲的输出字节被写出。 下面是一个Java IO字节流复制文件的示例代码: ```java public static void main(String[] args) { try { // 创建要复制文件的字节输入流 InputStream inp = new FileInputStream("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.pdf"); // 创建目标路径的字节输出流 OutputStream oup = new FileOutputStream("/Users/chenyq/Documents/newtest.pdf"); // 使用文件输入流获取要复制文件的全部数据的字节数组 byte[] arr = inp.readAllBytes(); // 使用文件输出流将字节数组写入目标文件 oup.write(arr); System.out.println("复制成功!"); // 释放资源 inp.close(); oup.close(); } catch (IOException e) { e.printStackTrace(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值