InputStream当中read()、read(byte[] b)、read(byte[] b、int off 、int len)的使用

本文详细解析了InputStream类中read()、read(byte[])、read(byte[],int,int)三个方法的使用方式及区别,并通过复制txt文本的实例进行代码演示,帮助开发者理解和掌握这些方法的高效应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面就说说InputStream当中read()read(byte[]  b)read(byte[] bint off int len)的使用以及区别(txt文本的复制为例通过代码以及注释说明)
一、read()方法:
public static void inputStreamRead1() {
      try{
            //构造一个输入流对象(读数据)test.txt文本的内容为:我爱你中国
            InputStream is = new FileInputStream(“E:\\test.txt”);
            //构造一个输出流对象(写数据)
            OutputStream os = new FileOutputStream(“E:\\ctest.txt”);
            int len;//表示读入的数据(十进制的形式表示)
            //FileInputStream可以使用read()方法一次读取一个字节,读入的数据以int类型返回,所以,你要是使用System.out.println()将数据显示出来的时候是以10进制的方式显示
            while((len = is.read())!=-1){
                 System.out.println(“len=”+len);
                 os.write(len);
           }
           os.close();
           is.close();
     }catch(Exception e){
            e.printStackTrace();
     }
}
运行以上程序,则控制台的输出为:
如图片1
说明:我爱你中国为5个汉字,5个汉字则为10个字节,而read()方法为一个字节一个字节的读,所以读取10次,而后len的值则为汉字的10进制表示
2、read(byte[] b)方法:
public static void inputStreamRead2(){
     try{
           //构造输入流对象(读数据)test.txt文本的内容为多个我爱你中国
           InputStream is = new FileInputStream(“E:\\test.txt”);
           //构造输出流对象(写数据)
           OutputStream os = new FileOutputStream(“E:\\ctest.txt”);
           //创建一个长度为1024byte数组
           byte[] b = new byte[1024];
           //int len;表示成功读取的字节数的个数
           //FileInputStream可以使用read(byte[] b )每次读取多个(b.length)字节数据(每次最多读取多少个)到byte数组当中
           while((len = is.read(b))!=-1){
               System.out.println(“len=”+len);
               os.write(b);
           }
           os.close();
           is.close();
      }catch(Exception e){
           e.printStackTrace();
      }
}
运行上面的程序则控制台的输出为:
如图片2
说明:每次最多读取1024个字节,很明显使用这种方式的效率要高于read()读取的效率,开发的过程当中也见识使用此方式进行读取;
3、read(byte[] b,int off,intlen):
1public static void inputStreamRead3(){
          try{
                //构建输入流对象(读文件)
                InputStream is = new FileInputStream(“E:\\test.txt”);
                //构建输出流对象(写文件)
                OutputStream os = new FileOutputStream(“E:\\ctest.txt”);
               //声明一个大小为输入流大小的数组
                byte[] b = new byte[is.available()];
                int len = 0;//表示成功读取的字节数的个数
                while(len<is.available()){
                     //read(byte[] b,int off, int len)表示从输入流当中最多将len个字节的数据读取到一个byte数组当中
                     len+=is.read(b, len, is.available() - len);
                     os.write(b);
                }
                os.close();
                is.close();
           }catch{
                   e.printStackTrace();
           }
}
运行上面的程序控制台的输出为:
如图片3
说明:则一次性读取完成
2public static void inputStreamRead3(){
          try{
                //构建输入流对象(读文件)
                InputStream is = new FileInputStream(“E:\\test.txt”);
               //构建输出流对象(写文件)
                OutputStream os = new FileOutputStream(“E:\\ctest.txt”);
               //声明一个大小为输入流大小的数组
                byte[] b = new byte[1024];
                int len = 0;//表示成功读取的字节数的个数
                while((len=is.read(b,len,1024))!=-1){
                      System.out.println(“len=”+len);
                      os.write(b);
                }
                os.close();
                is.close();
           }catch{
               e.printStackTrace();
           }
}
原文:http://www.apkbus.com/android-124993-1-1.html
在 Java 中,`InputStream` 是一个抽象类,用于表示从流中读取字节数据的输入源。`read()` 方法是其核心方法之一,用于从输入流中读取单个字节或字节数组。以下是关于 `InputStream` 的 `read()` 方法的使用方式及其常见问题的详细说明。 ### `read()` 方法的使用方式 1. **基本形式:`int read()`** - 从输入流中读取一个字节的数据。 - 返回值为 0 到 255 的 `int` 类型(表示一个字节),如果到达流的末尾,则返回 -1。 - 示例: ```java int data; while ((data = inputStream.read()) != -1) { System.out.print((char) data); } ``` 2. **批量读取:`int read(byte[] b)`** - 从输入流中读取最多 `b.length` 个字节,并将它们存储到字节数组 `b` 中。 - 返回实际读取的字节数,如果到达流的末尾,则返回 -1。 - 示例: ```java byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { System.out.write(buffer, 0, bytesRead); } ``` 3. **带偏移量和长度的读取:`int read(byte[] b, int off, int len)`** - 从输入流中读取最多 `len` 个字节,并将它们存储到字节数组 `b` 中,起始位置为 `off`。 - 返回实际读取的字节数,如果到达流的末尾,则返回 -1。 - 示例: ```java byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer, 0, buffer.length)) != -1) { System.out.write(buffer, 0, bytesRead); } ``` ### 常见问题与解决方案 1. **未正确处理返回值** - 如果未检查 `read()` 的返回值,可能会导致数据丢失或错误处理流的结束。 - 解决方案:始终检查返回值是否为 -1,以判断是否到达流的末尾。 2. **未关闭输入流** - 如果未正确关闭 `InputStream`,可能导致资源泄漏。 - 解决方案:使用 `try-with-resources` 语句确保流在使用后被关闭。 ```java try (InputStream inputStream = new FileInputStream("file.txt")) { // 读取流的操作 } catch (IOException e) { e.printStackTrace(); } ``` 3. **未指定字符编码** - 当从字节流转换为字符流时,如果没有明确指定字符集,可能会导致平台依赖性问题[^1]。 - 解决方案:使用 `InputStreamReader` 时明确指定字符集,例如 UTF-8。 ```java InputStreamReader isr = new InputStreamReader(new FileInputStream("file.txt"), "UTF-8"); ``` 4. **性能问题** - 使用 `read()` 方法一次读取一个字节可能会导致性能低下。 - 解决方案:使用缓冲区(如 `BufferedInputStream`)或批量读取方法 `read(byte[] b)` 提高性能。 ```java try (InputStream bufferedStream = new BufferedInputStream(new FileInputStream("file.txt"))) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = bufferedStream.read(buffer)) != -1) { // 处理数据 } } ``` 5. **异常处理不当** - 如果未正确处理 `IOException`,可能会导致程序崩溃或数据不完整。 - 解决方案:使用 `try-catch` 块捕获并处理异常,确保程序的健壮性。 ```java try { // 读取流的操作 } catch (IOException e) { System.err.println("读取流时发生错误: " + e.getMessage()); } ``` 6. **阻塞问题** - 某些 `InputStream` 实现(如网络流)可能会在 `read()` 调用时阻塞,导致程序挂起。 - 解决方案:使用超时机制或在单独的线程中处理阻塞操作。 ### 代码示例 以下是一个完整的示例,展示如何使用 `InputStream` 和 `BufferedInputStream` 来高效读取文件内容: ```java import java.io.*; public class InputStreamExample { public static void main(String[] args) { String filePath = "file.txt"; try (InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath))) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { System.out.write(buffer, 0, bytesRead); } } catch (IOException e) { System.err.println("读取文件时发生错误: " + e.getMessage()); } } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值