小言_互联网的博客

java教程——InputStream(经典蓝牙实战)

269人阅读  评论(0)

基本知识储备

InputStream 就是Java标准库提供的最基本的输入流。它位于java.io这个包里。java.io包提供了所有同步IO的功能。

要特别注意的一点是,InputStream 并不是一个接口,而是一个抽象类,它是所有输入流的超类。

首先,我们先来弄明白这么两个方法:


  
  1. InputStream.read()
  2. 作用:一个字节一个字节的读取 输入流 中的数据
  3. 参数:无
  4. 返回值:返回读取到的当前字节数据对应的Ascall码 - 1表示没有数据可读
  5. InputStream.available()
  6. 作用:查看当前输入流中还存在多少可读数据,read()一次就要少一个
  7. 参数:无
  8. 返回值:当前输入流中可读数据字节长度 0表示没有啦

下面我们进入代码演示


  
  1. package test;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. public class changeData {
  6. private static InputStream mIn;
  7. public static void main(String[] args) {
  8. try {
  9. //第一步,获取文件输入流 FileInputStream 是 InputStream 的子类
  10. mIn = new FileInputStream( "src/test.txt");
  11. for (;;){ //循环读取数据
  12. //第二步:一个字节一个字节的读
  13. int n = mIn.read();
  14. //第三步:数据读完后 n值为-1 跳出循环
  15. if (n == - 1) break;
  16. //打印日志 观察结果
  17. System.out.println( "读到的数据是 ->" + n + " 剩余数据字节长度 ->" + mIn.available());
  18. }
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. } finally {
  22. try {
  23. //关闭 输入流 避免不必要的资源开销
  24. mIn.close();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30. }

test.txt文本内容及打印结果

缓冲

爱思考的同学肯定已经想到了,一个字节一个字节的读,读取速度很慢,所以下面我们讲一下 read()的两种重载方法。


  
  1. InputStream.read( byte[] b):
  2. 作用:根据参数b的大小来读取数据
  3. 参数一:读取若干字节并填充到 byte[]数组,
  4. 返回值:读取的字节数 返回 - 1 表示没数据可读了
  5. InputStream.read( byte[] b, int off, int len):
  6. 作用:根据参数b的大小来读取数据
  7. 参数一:偏移量 , 这个偏移量是对数组b来说的 即从数组b的第几个位置开始装数据
  8. 参数二:最大填充数 , 这个参数也是针对数组b来说的 即一口气装多少 , 也就是不管 b数组有多大,偏移量和最大填充数已经决定了 怎么装,装多少
  9. 返回值:读取的字节数 返回 - 1 表示没数据可读了

  
  1. package test;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. public class changeData {
  6. private static InputStream mIn;
  7. public static void main(String[] args) {
  8. try {
  9. //规定缓冲区大小
  10. byte[] buffer = new byte[ 4];
  11. //第一步,获取文件输入流 FileInputStream 是 InputStream 的子类
  12. mIn = new FileInputStream( "src/test.txt");
  13. for (;;){ //循环读取数据
  14. //第二步,转入buffer中 从1号位置开始装,一口气装3个数据
  15. int n = mIn.read(buffer, 1, 3);
  16. // 第三步:数据读完后 n值为-1 跳出循环
  17. if (n == - 1) break;
  18. //打印日志 观察结果 所以对应第二步,你不能取 buffer 的0号位置数据,如果你执意要取,我只能告诉你那个值是默认的0,;因为从1号位置开始装,所以得从1号位置取
  19. System.out.println( "读了" + n + "数据是 ->" + " 剩余数据字节长度 ->" + mIn.available() + " 读到的是 ->" + buffer[ 1] + buffer[ 2]);
  20. }
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. } finally {
  24. try {
  25. //关闭 输入流 避免不必要的资源开销
  26. mIn.close();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32. }

这里,我们就只演示三个参数的read,一个参数的read大家自己下去试试,很简单的

阻塞

在调用InputStreamread()方法读取数据时,我们说read()方法是阻塞(Blocking)的。它的意思是,对于下面的代码:


  
  1. int n;
  2. n = input.read(); // 必须等待read()方法返回才能执行下一行代码
  3. int m = n;

执行到第二行代码时,必须等read()方法返回后才能继续。因为读取IO流相比执行普通代码,速度会慢很多,因此,无法确定read()方法调用到底要花费多长时间。

实际应用

经典蓝牙数据的获取


转载:https://blog.csdn.net/qq_41885673/article/details/117131466
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场