Java IO流中偏移量是什么意思

背景

在使用Java的 IO过程中,肯定遇到过偏移量这个概念。在 FileInputStream 中的public int read(byte b[], int off, int len)方法中第二个参数,int off 就是偏移量的意思。

示例

前置条件

先在 F:\FilesExample\A.txt 文件中加入待读取的内容

ABCDEFG

使用 FileInputStream 流读取内容

public static void main(String[] args) {

    String filePath = "F:\\FilesExample\\A.txt";

    // 创建字节输入流
    try ( FileInputStream fis = new FileInputStream(filePath)){

        // 创建装数据的数组
        byte[] bytes = new byte[10];
        
		// 调用read方法读取数据
        fis.read(bytes, 2, 3);

		// 打印读出来的数据
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(bytes[i]);
        }
        
    } catch (IOException e) {
        e.printStackTrace();
    }
}

注意这句代码

fis.read(bytes, 2, 3);

注意这里的参数

  • 第一个参数是存放即将读出来的数据的字节数组。
  • 第二个参数是偏移量,这里先传个2。
  • 第三个参数是要读取的长度。

参数详解

第一个参数不用过多解释,就是存放数据的数组。

第二个参数代表偏移量,就是有歧义的地方。

网上的错误解释

偏移量的意思就是,读数据的时候从上一次读的最后位置接着往下读,比如第一次读了1024个字节,那么下一次就从1025开始读

这句话哪里错了?
这句话的意思是说,偏移量是数据流的偏移量。在上一次读到某个位置后,偏移量就记录下那个位置的坐标,下一次读取的时候,接着往后读。

如果按照这个意思来读取的话,我们传入的参数是2,也就是数据流的偏移量是2,那就该从下表为2的地方开始读,那应该跳过“A”,“B”两个字节,读取结果应该是”C“,”D“,”E“三个数据。

我们来运行一下,结果显示:

0
0
65
66
67
0
0
0
0
0

这里有两个地方需要注意一下

读取的字节都是ASCII码。 65代表大写字母”A“ ,66代表大写字母”B“,67代表大写字母”C“
字节数组空的位置会初始化成0。
结果和预想的完全不一样。

正确的解释
其实偏移量 真正指的是这个存放数据的数组的偏移量(第一个参数)。

使用这个解释去理解一下这个示例。

读取3个字节(第三个参数)的数据,存放在bytes数组中(第一个参数),存放在数组中的什么位置呢?那就得看偏移量了,这里偏移量是2(第二个参数),就表示存放在数组中下标为2的位置开始,数据依次往后展开。也就是说,假设读取了两个字节的数据,就放在数组的3、4号坑(数组是从0开始的),假设读取了3个字节的数据,就放在数组的3、4、5号坑…

总结
Java IO流中的偏移量是指接收数据的数组(或叫缓冲区)的偏移量,并不是数据流的偏移量。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
java字节输入和输出是用于读写字节信息的。java.io.OutputStream是字节输出的抽象类,它是表示所有字节输出类的父类,用于将指定的字节信息写出到目的地。常用的子类包括FileOutputStream,用于将字节写入到文件java.io.InputStream是字节输入的抽象类,它是表示所有字节输入类的父类,用于将字节信息读取到内存。常用的子类包括FileInputStream,用于从文件读取字节。 对于字节输出,常用的写入方法有: 1. write(byte[] b):将b.length个字节从指定的byte数组写入到此输出。 2. write(byte[] b, int off, int len):将指定的byte数组从偏移off开始到len个字节写入到此输出。 3. write(int b):将指定字节写入到此输出。 以下是一个示例代码,演示了如何使用字节输出将字符串写入到文件: ```java import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Example { public static void main(String[] args) { File file = new File("D:/path/to/file.txt"); FileOutputStream fo = null; try { fo = new FileOutputStream(file); String str = "Hello, Java!"; byte[] bytes = str.getBytes(); fo.write(bytes); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fo != null) { try { fo.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值