IO ——字节流

什么是流?

概念:内存与存储设备之间传输数据的通道。程序运行后保存在内存,文件一般在硬盘中,在程序中读写文件,需要在内存和存储设备中建立通道。数据借助流传输

流的分类:

   按流向:

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

   按单位:

  • 字节流:以字节为单位,可以读写所有数据。因为所有数据都是以字节的方式来存储的
  • 字符流:以字符为单位,只能读写文本数据。

 按功能:

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

 

字节流:

  • 字节输入流: InputStream类

    方法:

      int availble()  //返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字数

      void close() //关闭此输入流并释放与该流关联的所有系统资源

      void mark(int readlimit)  //在此输入流中标记当前位置

      abstract int read()  //从输入流中读取数据的下一个字节

      int read(byte[] b)  //从输入流中读取一定数量的字节,并将其存储在缓存区数组b中

      int read(byte[] b, int off, int len)  //在指定位置将输入流中最多len个数据字节读入b数组

      void reset() //将此流重新定位到最后一次对此输入流调用mark方法时的位置

        long skip(long n)  //跳过和丢弃此输入流中数据的n个字节                                                                                                                                                                                                                                                                     

  • 字节输出流:OutputStream类

     方法:

      void close()   //关闭此输出流并释放与该流关联的所有系统资源 

      void flush()   // 刷新此输出流并强制写出所有缓冲的输出字节

      void write(byte[] b)  //将b.length个字节从指定的byte数组写入此输出流

      void write(byte[] b, int off, int len) //将指定byte数组中从偏移量off开始的len个字节写入此输出流

      abstract void wite(int b)  //将指定的字节写入此输出流

 

InputStream类和OutputStream类都是抽象类,不能实例化,应该用其子类,可用FileInputStream和FileOutputStream。

FileInputStream:

  构造方法:FileInputStream(File file)

       FileInputStream(String name)   //name指文件路径

         FileInputStream(FileDescriptor fdObj)

  方法:

    protected void finalize()   //确保文件不再引用文件输入流时调用close方法

FileOutputStream:

  构造方法:FileOutputStream(String name)  //每次写入都会覆盖原有的数据

         FileOutputStream(String name, boolean append)  //不覆盖原有数据

         FileOutputStream(File file)

         FileOutputStream(File file, boolean append)

       FileOutputStream(FileDescriptor fdObj)

       FileOutputStream(FileDescriptor fdObj, boolean isFdOwner)

 

package com.java.leetcode.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

/*
演示FileInputStream(文件字节输入流)
演示FileOutputStream(文件字节输出流)

 */
public class Stream01 {
    public static void main(String[] args) throws IOException {
        //1.创建FileInputStream,文件可能没有,需要抛出异常
        FileInputStream fis = new FileInputStream("D:\\stream01.txt");
        //读取数据  单个字节fis.read() 效率低下
//        int data;
//        while ((data = fis.read()) != -1){  //fis.read()返回下一个字节,如果读到结尾返回-1
//            System.out.print((char)data);
//        }
        byte[] buffer = new byte[3];
        //比较拉垮,不采用,直接用循环读
//        int count =  fis.read(buffer); //该方法返回实际返回的个数
//        System.out.println(new String(buffer)+"读取的字节数"+count); //hel只读了3个
//        int count1 = fis.read(buffer);  //接着读
//        System.out.println(new String(buffer)+"读取的字节数"+count1); //lo 读取了三个
//        int count2 = fis.read(buffer);  //接着读
//        System.out.println(new String(buffer)+"读取的字节数"+count2);//io读取了2个
        int count = 0;
        while ((count = fis.read(buffer)) != -1){
            System.out.println(new String(buffer)+"读取的字节数"+count);
        }
        //2.创建FileOutputStream
        //FileOutputStream fos = new FileOutputStream("D:\\stream01.txt");//该构造方法为每次写入的数据都覆盖原来的
        FileOutputStream fos = new FileOutputStream("D:\\stream01.txt",true); //为不覆盖
        fos.write(97);
        fos.write('a');
        fos.write('c');
        System.out.println("执行完毕");
        String str = "helloword"; 
        fos.write(str.getBytes());
    }
}

 

 

运行结果:

文件内容:

 

 

注意:代码的顺序是先读取再写入进去。

 

字节流复制文件

package com.java.leetcode.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*
使用文件字节流实现文件的复制
 */
public class Stream02 {
    public static void main(String[] args) throws IOException {
        //文件字节输入流
        FileInputStream fis = new FileInputStream("E:\\face01.jpg"); //抛出异常,文件可能不存在
        //文件字节输出流
        FileOutputStream fos = new FileOutputStream("E:\\face001.jpg");  //未复制前并不存在该文件。将face01复制,复制后的图片放在E盘下,明明为face001。jpg
        //一边读,一边写
        byte[] buffer = new byte[1024]; //每次读1k
        int count = 0;
        while ((count = fis.read(buffer))!=-1) {
            fos.write(buffer);
        }
        //关闭
        fis.close();
        fos.close();
        System.out.println("复制完毕!");
    }
}

 

posted @ 2022-04-06 20:33  虞美人体重90  阅读(62)  评论(0编辑  收藏  举报