基本知识储备
InputStream
就是Java标准库提供的最基本的输入流。它位于java.io
这个包里。java.io
包提供了所有同步IO的功能。
要特别注意的一点是,InputStream
并不是一个接口,而是一个抽象类,它是所有输入流的超类。
首先,我们先来弄明白这么两个方法:
-
InputStream.read()
-
作用:一个字节一个字节的读取 输入流 中的数据
-
参数:无
-
返回值:返回读取到的当前字节数据对应的Ascall码 -
1表示没有数据可读
-
-
InputStream.available()
-
作用:查看当前输入流中还存在多少可读数据,read()一次就要少一个
-
参数:无
-
返回值:当前输入流中可读数据字节长度
0表示没有啦
下面我们进入代码演示
-
package test;
-
-
import java.io.FileInputStream;
-
import java.io.IOException;
-
import java.io.InputStream;
-
-
public
class changeData {
-
-
private
static InputStream mIn;
-
-
public static void main(String[] args) {
-
try {
-
//第一步,获取文件输入流 FileInputStream 是 InputStream 的子类
-
mIn =
new FileInputStream(
"src/test.txt");
-
for (;;){
//循环读取数据
-
//第二步:一个字节一个字节的读
-
int n = mIn.read();
-
//第三步:数据读完后 n值为-1 跳出循环
-
if (n == -
1)
break;
-
//打印日志 观察结果
-
System.out.println(
"读到的数据是 ->" + n +
" 剩余数据字节长度 ->" + mIn.available());
-
}
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
finally {
-
try {
-
//关闭 输入流 避免不必要的资源开销
-
mIn.close();
-
}
catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
}
test.txt文本内容及打印结果
缓冲
爱思考的同学肯定已经想到了,一个字节一个字节的读,读取速度很慢,所以下面我们讲一下 read()的两种重载方法。
-
InputStream.read(
byte[] b):
-
作用:根据参数b的大小来读取数据
-
参数一:读取若干字节并填充到
byte[]数组,
-
返回值:读取的字节数 返回 -
1 表示没数据可读了
-
-
InputStream.read(
byte[] b,
int off,
int len):
-
作用:根据参数b的大小来读取数据
-
参数一:偏移量 , 这个偏移量是对数组b来说的 即从数组b的第几个位置开始装数据
-
参数二:最大填充数 , 这个参数也是针对数组b来说的 即一口气装多少 , 也就是不管 b数组有多大,偏移量和最大填充数已经决定了 怎么装,装多少
-
返回值:读取的字节数 返回 -
1 表示没数据可读了
-
package test;
-
-
import java.io.FileInputStream;
-
import java.io.IOException;
-
import java.io.InputStream;
-
-
public
class changeData {
-
-
private
static InputStream mIn;
-
-
public static void main(String[] args) {
-
try {
-
//规定缓冲区大小
-
byte[] buffer =
new
byte[
4];
-
//第一步,获取文件输入流 FileInputStream 是 InputStream 的子类
-
mIn =
new FileInputStream(
"src/test.txt");
-
for (;;){
//循环读取数据
-
//第二步,转入buffer中 从1号位置开始装,一口气装3个数据
-
int n = mIn.read(buffer,
1,
3);
-
// 第三步:数据读完后 n值为-1 跳出循环
-
if (n == -
1)
break;
-
//打印日志 观察结果 所以对应第二步,你不能取 buffer 的0号位置数据,如果你执意要取,我只能告诉你那个值是默认的0,;因为从1号位置开始装,所以得从1号位置取
-
System.out.println(
"读了" + n +
"数据是 ->" +
" 剩余数据字节长度 ->" + mIn.available() +
" 读到的是 ->" + buffer[
1] + buffer[
2]);
-
}
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
finally {
-
try {
-
//关闭 输入流 避免不必要的资源开销
-
mIn.close();
-
}
catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
}
这里,我们就只演示三个参数的read,一个参数的read大家自己下去试试,很简单的
阻塞
在调用InputStream
的read()
方法读取数据时,我们说read()
方法是阻塞(Blocking)的。它的意思是,对于下面的代码:
-
int n;
-
n = input.read();
// 必须等待read()方法返回才能执行下一行代码
-
int m = n;
执行到第二行代码时,必须等read()
方法返回后才能继续。因为读取IO流相比执行普通代码,速度会慢很多,因此,无法确定read()
方法调用到底要花费多长时间。
实际应用
经典蓝牙数据的获取
转载:https://blog.csdn.net/qq_41885673/article/details/117131466
查看评论