欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IO流(一):概念,字节流,InputStream,OutputStream,FileInputStream,FileOutputStream

程序员文章站 2022-04-03 16:46:17
...

概念

I/O(Input/Output)流:内存于存储设备(硬盘等)之间传输数据的通道,程序允许通过流的方式于输入输出设备进行数据传输。流位于 java.io 包下

按方向分类:

  • 输入流:将<存储设备>中的内容读入到<内存>中
  • 输出流:将<内存>中的内容写入到<存储设备>中

按传输数据的单位分类:

  • 字节流:以字节为单位,可以读写所有数据
  • 字符流:以字符为单位,只能读写文本数据

按功能分类:

  • 节点流:具有实际传输数据的读写功能
  • 过滤流:在节点流的基础之上增强功能

IO流(一):概念,字节流,InputStream,OutputStream,FileInputStream,FileOutputStream

字节流

在 jdk 中,提供了两个抽象类 InputStreamOutputStream ,它们是字节流的*父类。

InputStream的常用方法

方法声明 功能描述
int read() 从输入流读取一个8位字节,转换为0~255之间的整数,并返回这一整数,当没有可用字节时,返回-1
int read(byte[] b) 从输入流读取若干字节,保存在参数b指定的字节数组中,返回的整数表示读取字节的数目
int read(byte[] b,int off,int len) 从输入流读取若干字节,保存在参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目
void close() 关闭此输入流并释放该流关联的所有系统资源

OutputStream的常用方法

方法声明 功能描述
void write(int b) 将指定的字节写入此输出流
void write(byte[] b) 把参数b指定的字节数组的所有字节写到输出流
void write(byte[] b,int off,int len) 将指定byte数组中从偏移量off开始的len个字节写入输出流
void flush() 刷新此输出流并强制写出所有缓冲的输出字节
void close() 关闭此输出流并释放该流关联的所有系统资源

面向文件的读写操作

  • FileOutputStream

    构造方法:

    FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。 参数可以写称盘符,例如 “F:\\a.txt” 不需要指明往哪个文件写入,每刷新一次,将首先覆盖原来的数据,再写入

    FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。第二个参数是布尔类型的参数,意思是,是否追加, 如果为true,在原始数据后面写入,如果为false或者不写,即为不追加,任然是覆盖原来的数据再写入

    • public void write(byte[] b) 一次写多个字节,将b数组中所有字节,写入输出流

      public static void main(String[] args) throws Exception {
              //字节输出流,如果里面没有此盘符,会出错
              //但是,如果在此盘符下没有此文件,他会先创建文件,再写入
      
              /*
              * 绝对路径:D:\\Development\\IdeaProjects\\IO\\Files\\a.txt
              * 相对路径:Files\\a.txt 相对于此项目的位置,与上一种形式等价
              * */
              FileOutputStream fileOutputStream = new FileOutputStream("Files\\a.txt",true);
              fileOutputStream.write(65);//一次输出一个字节
              fileOutputStream.write(66);
              fileOutputStream.write('C');
          
          	byte[] bytes = new byte[]{65,66,67,68,69};
              fileOutputStream.write(bytes);//一次输出一组字节
          
          	//输出一组字节,从下标1开始,输出3个
          	fileOutputStream.write(bytes,1,3);
          }
      --------------------------------------------------
      但是,F:\\a.txt 这个路径是个绝对路径,属于硬编码,不符合实际,
      所以我们使用相对路径,就是相对于程序本身项目的位置,项目的根,
      "a.txt" 就使用这种方式
      
  • FileInputStream

    • public void read(byte[] b) 从流中读取多个字节,将读到的内容存入b数组,返回实际读到的字节数

      public static void main(String[] args) throws IOException {
              //字节输入流
              FileInputStream fis = new FileInputStream("Files\\a.txt");
      
              //先写一个死循环,在里面读,再判断,因为没有可用字节时
              //返回 -1 所以里面判断,当返回的整数为 -1 时,就跳出循环,
              //实际上就是读取完成
              while (true) {
                  //一次读取一个字节
                  int read = fis.read();
                  if(read == -1) {
                      break;
                  }
                  System.out.println((char) read);
              }
      
          }
      但是这种方式也不好,每读取一个字节,就要读一次磁盘,对于硬盘也是有损伤的
      -------------------------------------
          //一次读取一组字节
              //创建一个长度为4的数组,作为读取时的缓存
          	//也可以写成 1024 * 1024
              byte[] bytes = new byte[4];
              while (true) {
                  //每读取一次,填满数组,最后一次可能填不满
                  int i = fis.read(bytes);
                  if(i == -1) {
                      break;
                  }
                  //根据读取字节的个数,决定打印次数
                  for (int j = 0; j < i; j++) {
                      System.out.print((char) bytes[j] + "\t");
                  }
                  System.out.println();
              }
      
          }
      这种方式可以减少访问硬盘的次数
      
相关标签: IO流