源码里面是使用装饰模式,封装流,然后把每次读取的字节放入一个byte数组中,通过管理该数组实现下面的方法的
测试文件 1
12345678
q
123
iuyweqgahsd
1. 第一个方法 read()
public static void main(String[] args) throws Exception{
File file = new File("E:\\workspace\\flink_demo\\data\\1");
FileInputStream fis = new FileInputStream(file);
int data = fis.read();
// 读取单个byte 返回的是是-1 到 255 的字节值,这里对应的是ansi值对应的编码值
System.out.println(data);
// 然后转化为char,就是原字符
System.out.println((char)data);
}
运行结果是:
97 是asci对应值
a 是原值
2. read(byte[])
public static void main(String[] args) throws Exception{
File file = new File("E:\\workspace\\flink_demo\\data\\1");
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[5];
int num ;
String s ;
// 返回的值是读取了几个字节
num = fis.read(b);
// 此时 byte数组 已经被字节填充,所以只要把它转化
s = new String(b);
System.out.println(s);
System.out.println(num);
}
结果是
12345 是读取的原值
5 返回的是都去了几个字节
3. mark和reset
public static void main(String[] args) throws Exception {
File file = new File("E:\\workspace\\flink_demo\\data\\1");
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));
int num;
num = fis.read();
System.out.println((char)num);
num = fis.read();
System.out.println((char)num);
/**
* make 标记失效前,能读取的最大字节数
* 如果大于等于这个数字,那么即使调用reset方法,数据也不会从mark位置读取,
* 而是顺着顺序继续读下去
* 以读取最大数是3 举例子
* >= 3 mark失效,无法回到mark标记的位置
* <3 mark reset 配合使用 就可以回到mark标记的位置
*
*/
fis.mark(3);
num = fis.read();
System.out.println((char)num);
num = fis.read();
System.out.println((char)num);
fis.reset(); // 回到 mark标记的字节位置位置
num = fis.read();
System.out.println((char)num);
num = fis.read();
System.out.println((char)num);
num = fis.read();
System.out.println((char)num);
}
结果是:
1
2 // mark标记下标位置是2,下标2对应的数据是3
3
4
3 // reset 之后从下表2读取数据
4
5