字节流_FileInputStream类读取

来源:互联网 发布:淘宝拍衣服的要求 编辑:程序博客网 时间:2024/05/16 12:58
File类:用于描述一个文件或者文件夹的。
通过File对象我们可以读取文件或者文件夹的属性数据,如果我们需要读取文件的内容数据,那么我们需要使用IO流数技术。
IO流(Input Output)
IO技术主要的作用是用于解决设备与设备之间的数据传输问题。比如:硬盘-->内存          内存的数据-->硬盘上         把键盘的数据-->内存中
IO流分类:
    如果我们按照数据的流向划分:
        输入流:
        
        输出流:
    如果按照处理的单位划分:
        字节流:字节流读取的都是文件中的二进制数据,读取到的二进制数据不会经过任何的处理。
        
        字符流:字符流读取的数据是以字符为单位的。字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能识别的字符。
            字符流 = 字节流 + 解码
        
判断使用输入流还是输出流的依据:    
    以当前程序作为参照物,观察数据是流入还是流出,如果流出则使用输出流,如果流入则使用输入流。
输入字节流:
-------------| InputStream 此抽象类是表示字节输入流的所有类的超类。 
------------------| FileInputStream 从文件系统中的某个文件中获得输入字节。
使用FileInputStream读取文件数据的步骤:
    1.找到目标文件
    2.建立数据的输入通道
    3.读取文件中的数据
    4.关闭资源,实际上就是释放资源
推荐使用方式4读取:使用缓冲数组 + 循环 配合读取。

注意事项:
    1.资源文件一旦使用完毕,应该立即释放资源文件
    2.读取文件时,循环读取时,缓冲数组每次都是覆盖,并不是先清空再读取。所以应该采用new String(buff, 0, length)方法而不是new String(buff)  
  1. package com.cn.input;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. /**
  7. * Author:Liu Zhiyong(QQ:1012421396)
  8. * Version:Version_1
  9. * Date:2016年7月24日16:49:24
  10. * Desc:
  11. File类:用于描述一个文件或者文件夹的。
  12. 通过File对象我们可以读取文件或者文件夹的属性数据,如果我们需要读取文件的内容数据,那么我们需要使用IO流数技术。
  13. IO流(Input Output)
  14. IO技术主要的作用是用于解决设备与设备之间的数据传输问题。比如:硬盘-->内存 内存的数据-->硬盘上 把键盘的数据-->内存中
  15. IO流分类:
  16. 如果我们按照数据的流向划分:
  17. 输入流:
  18. 输出流:
  19. 如果按照处理的单位划分:
  20. 字节流:字节流读取的都是文件中的二进制数据,读取到的二进制数据不会经过任何的处理。
  21. 字符流:字符流读取的数据是以字符为单位的。字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能识别的字符。
  22. 字符流 = 字节流 + 解码
  23. 判断使用输入流还是输出流的依据:
  24. 以当前程序作为参照物,观察数据是流入还是流出,如果流出则使用输出流,如果流入则使用输入流。
  25. 输入字节流:
  26. -------------| InputStream 此抽象类是表示字节输入流的所有类的超类。
  27. ------------------| FileInputStream 从文件系统中的某个文件中获得输入字节。
  28. 使用FileInputStream读取文件数据的步骤:
  29. 1.找到目标文件
  30. 2.建立数据的输入通道
  31. 3.读取文件中的数据
  32. 4.关闭资源,实际上就是释放资源
  33. 推荐使用方式4读取:使用缓冲数组 + 循环 配合读取。
  34. */
  35. public class Demo1 {
  36. public static void main(String[] args) throws IOException {
  37. //readTest1();
  38. //readTest2();
  39. //readTest3();
  40. readTest4();
  41. }
  42. //方式1:一次读一个字节
  43. public static void readTest1() throws IOException{
  44. //1.找到目标文件
  45. File file = new File("f:/a.txt");
  46. //2.建立数据的输入通道
  47. FileInputStream fileInputStream = new FileInputStream(file);
  48. //3.读取文件中的数据
  49. int i = fileInputStream.read();
  50. System.out.println((char)i);
  51. //4.关闭资源,实际上就是释放资源
  52. fileInputStream.close();
  53. }
  54. //不使用缓冲数组,一次一个字节循环读取
  55. public static void readTest2() throws IOException{
  56. long startTime = System.currentTimeMillis();
  57. //1.找到目标文件
  58. //File file = new File("f:/a.txt");
  59. File file = new File("f:/cool.png");
  60. //2.建立数据的输入通道
  61. FileInputStream fileInputStream = new FileInputStream(file);
  62. //3.读取文件的数据
  63. int content = 0;
  64. while((content = fileInputStream.read()) != -1){
  65. System.out.print((char)content);
  66. }
  67. //4.关闭资源,实际上就是释放资源
  68. fileInputStream.close();
  69. long stopTime = System.currentTimeMillis();
  70. System.out.println("方式2读取总共耗时:" + (stopTime-startTime) + "ms"); //480毫秒
  71. }
  72. //方式3:使用缓冲数组读取。 缺点:无法读取完整一个文件的数据。 缓冲不能太大,因为假如读取12G电影,得分配很多内存,不可行。
  73. public static void readTest3() throws IOException{
  74. //1.找到目标文件
  75. File file = new File("f:/a.txt");
  76. //2.建立数据的输入通道
  77. FileInputStream fileInputStream = new FileInputStream(file);
  78. //3.读取文件的数据
  79. //Long l = file.length();
  80. //byte[] buff = new byte[l.intValue()];//缓冲不能太大,因为假如读取12G电影,得分配很多内存,不可行。
  81. byte[] buff = new byte[40];//相当于超市里面的购物车,从此输入流中将最多 buff.length 个字节的数据读入一个 byte 数组中
  82. int length = fileInputStream.read(buff);//如果使用read读取数据传入字节数组,那么数据是存储到字节数组中的,而这时候read()方法的返回值是本次读取了几个字节数据到字节数组byte[]中
  83. System.out.println(new String(buff) + "前面有空白");
  84. System.out.println(new String(buff, 0, length) + "前面没有空白");
  85. //4.关闭资源,实际上就是释放资源
  86. fileInputStream.close();
  87. }
  88. //方式4:使用缓冲数组 + 循环 配合读取。
  89. public static void readTest4() throws IOException{
  90. ////1.找到目标文件
  91. //File file = new File("f:/a.txt");
  92. long startTime = System.currentTimeMillis();
  93. //1.找到目标文件
  94. //File file = new File("f:/a.txt");
  95. File file = new File("f:/cool.png");
  96. //2.建立数据的输入通道
  97. FileInputStream fileInputStream = new FileInputStream(file);
  98. //3.建立缓冲数组配合循环读取文件的数据
  99. byte[] buff = new byte[1024];//用来存储每次读取到的数据,缓冲数组的长度一般是1024的倍数,因为与计算机的处理单位有关。理论上缓冲数组越大效率越高。
  100. int length = 0;//保存每次都去到的字节个数。
  101. int count = 1;//读取的次数
  102. while((length = fileInputStream.read(buff)) != -1){//读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。
  103. System.out.print("读的第" + count++ + "次:" + new String(buff, 0, length));
  104. }
  105. //4.关闭资源,实际上就是释放资源
  106. fileInputStream.close();
  107. long stopTime = System.currentTimeMillis();
  108. System.out.println("方式4读取总共耗时:" + (stopTime-startTime) + "ms"); //32ms
  109. }
  110. }
FileInputStream读取时要注意的细节:

0 0