InputStream--使用详解

锦通  论坛元老 | 2022-11-11 18:48:23 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1018|帖子 1018|积分 3054

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本篇可以号称是市面最全面的InputStream的用法详解,如下所示
在java中InputStream是字节输入流,用来将文件中的数据读取到java程序中。
InputStream是所有字节输入流的顶层父类,是一个抽象类。如果要用,需要使用子类。
最常用的子类:FileInputStream。
构造方法:
FileInputStream​(File file): 传递一个File类型的文件
FileInputStream​(String name): 传递一个String类型的文件路径
其他方法:
int read​(): 从文件中读取一个字节数的数据。并返回读取到的这个字节。 如果读取结束,返回的是-1.
int read​(byte[] b): 一次读取一个字节数组,输入流会把读取到的内容放入到这个字节数组中,并返回读取到的个数, 如果读取结束返回-1.
void close​()
使用步骤:
1. 创建一个FileInputStream流对象,绑定一个数据源文件。
2. 调用read方法读取数据。
3. 释放资源
注意: 这种方式不能读取中文,一个中文占多个字节,此时一次读取一个字节会把中文拆开读。
*/
  1. public class Demo01InputStream {
  2.     public static void main(String[] args) throws IOException {
  3.         //创建一个FileinputStream对象,并绑定一个数据源文件
  4.         // 如果文件不存在,则会抛出异常(File not fount excep)
  5.         FileInputStream fis = new FileInputStream("E:\\test\\java265.txt");
  6.         //调用read方法读取数据
  7.         // int read​(): 从文件中读取一个字节数的数据。并返回读取到的这个字节。 如果读取结束,返回的是-1.
  8.         int i;
  9.         while ((i = fis.read()) != -1) {
  10.            /*
  11.                 条件做了下面的事情
  12.                 1. 通过fis输入流调用read方法,读取一个字节。
  13.                 2. 把读取到的这个字节赋值给变量i。
  14.                 3. 判断i是否不等于-1,如果不是-1表示读取到了内容,就在循环中对读取到的内容进行处理。
  15.                 读取到的内容在i里面保存*/
  16.             System.out.print((char) i);
  17.         }
  18.         //释放资源demo02_inputsteam
  19.     }
  20. }
复制代码
 
使用字节输入流一次读取一个字节数组。
int read​(byte[] b): 一次读取一个字节数组,
输入流会把读取到的内容放入到这个字节数组中,并返回读取到的个数, 如果读取结束返回-1.
这种读取方式效率高
*/
  1. public class Demo02InputStream {
  2.     public static void main(String[] args) throws IOException {
  3.         //创建Fileinptstream 流对象,并绑定源文件
  4.         FileInputStream fis=new FileInputStream("E:\\Test\\java265.txt");
  5.         //调用read方法读取数据.
  6.         //        // int read​(byte[] b): 一次读取一个字节数组
  7.         // 会将数据读取到字节数组里面。 字节数组长度是几,那么就最多一次读取几个。 并
  8.         // 且返回读取到的个数,读取结束,返回-1
  9.         //
  10.         //        //使用循环,一次读取一个字节数组
  11.         //        //定义一个字节数组,用来保存读取到的数据。
  12.         byte arr[]=new byte[3];
  13.         //定义一个变量来保存读到的个数
  14.         int len;//返回读取到的个数
  15.         //使用循环开始读取
  16.         while((len=fis.read(arr))!=-1){
  17.             /*
  18.             上面条件作了下面的事情:
  19.             1. 通过字节输入流fis调用read方法,将数据读取到Arr这个字节数组中
  20.             2. 将读取到的有效个数返回,赋值给len。
  21.             3. 判断len是否不等于-1,如果不等于-1,表示读取到了内容,就就在循环中进行处理.
  22.                     读取出来的数组在bArr数组中放着
  23.                     */
  24.             //最后一次读取可能会有上次残留的数据,所以不能把字节数组的整体都转成String
  25.             //System.out.println(new String(bArr));
  26.             //读取到了几个内容,就把字节数组的几个元素转成字符串,并且打印
  27.             System.out.println(new String(arr,0,len));
  28.         }
  29.     }
  30. }
复制代码
 
文件复制。
文件复制其实就是一边读,一边写,每读取一次就把读取到的内容写到文件中。
为了保证复制效率,我们采用一次读取一个字节数组的方式进行复制
思路:
1. 创建字节输入流对象,用来读取
2. 创建字节输出流对象,用来写入。
3. 开始读取,一次读取一个字节数组。
4. 把读取到的字节数组的内容写入到目的地文件
5. 循环 第3步 和 第4步
6. 释放资源
*/
  1. public class FileCopy {
  2.     public static void main(String[] args) throws IOException {
  3.         //1. 创建字节输入流对象,用来读取
  4.         FileInputStream fis = new FileInputStream("E:\\test\\java265.jpg");
  5.         //2创建字节输出流对象,用来写入//没有会创建
  6.         FileOutputStream fs = new FileOutputStream("java25.com");
  7.         //3创建一个数组用来读取
  8.         byte arr[] = new byte[1024 * 8];
  9.         int len;//用来计数
  10.         while ((len = fis.read(arr)) != -1) {
  11.             //从文件中用字节数组读取数组,存储到字节数组中
  12. //            每读取到一个内容,就把读取到的内容写入到目的地文件
  13.             fs.write(arr,0,len);
  14.         }
  15.         //释放资源
  16.         fs.close();
  17.         fis.close();
  18.     }
  19. }
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表