IO框架(二)字节流

IO框架(二)字节流

字节流内容

字节流的父类

  • InputStream:字节输入流

    • 方法

      • int available(); //返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数
        
      • void close(); //关闭此输入流并释放与该流关联的所有资源(用完流别忘了关闭)
        
      • void mark(int readlimit); // 在此输入流中标记当前的位置
        
      • boolean markSupported(); //测试此输入流是否支持mark和reset方法
        
      • abstract int read(); //从输入流中读取数据的下一个字节
        
      • int read(byte[] b); //从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中,读不到元素返回为-1
        
      • int read(byte[] b,int off,int len); //将输入流中最多len个数据字节读入byte数组
        /*
        b -- 读取字节数组数据。
        off -- 开始在目标数组b的偏移。
        len -- 要读取的最大字节数
        */
        
      • 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 write(int b); //将指定的字节写入此输出流
        

文件字节流

  • 文件字节流是字节流的子类

  • FileInputStream:

    • public int read(byte[] b); //从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件的尾部,则返回-1
      
  • FileOutputStream:

    • public void write(byte[] b); //一次写多个字节,将b数组中所有字节,写入输出流
      
FileInputStream
  • 要先有文件才能再读文件
//输入1,2,3为用3种方式读数据,输入4代表退出
public class Demo01 {
    public static void main(String[] args) throws Exception{
        int flag=1;
        Scanner a = new Scanner(System.in);
        while (flag!=4) {
            flag = Integer.parseInt(a.next());
            if(flag==1) {
                //创建文件字节输入流
                //new FileInputStream中要写入文件路径
                FileInputStream fis = new FileInputStream("D:\\aaa.txt");
                System.out.println("--------------使用read()读单个字节---------------");
                //read()读取单个字节
                //通过循环读取全部字节
                //通过read读取完之后的返回值为-1
                //读完之后光标在最后面,不能再继续读了
                int data = 0;
                data = fis.read();
                while (data != -1) {
                    //直接读是ascll编码,要做强转换
                    System.out.println((char) data);
                    data = fis.read();
                }
                fis.close();//读完别忘了关闭
                System.out.println("------------读取完毕----------------");
            }else if(flag==2) {
                //创建文件字节输入流
                //new FileInputStream中要写入文件路径
                FileInputStream fis = new FileInputStream("D:\\aaa.txt");
                System.out.println("--------------使用read()读单个字节---------------");
                System.out.println("--------------使用read(b)读多个字节---------------");
                System.out.println("--------------方式1---------------");
                byte[] b = new byte[3];
                System.out.println("读第一次");
                //read(b)将输入流的元素存入b中同时返回读取到的元素个数
                int count = fis.read(b);
                //通过String()将内容转换为字符串
                System.out.println(new String(b));
                System.out.println("元素个数:" + count);
                System.out.println("读第二次");
                //read(b)将输入流的元素存入b中同时返回b的元素个数
                //从刚才读的光标停止的位置继续往后读
                int count2 = fis.read(b);
                //通过String()将内容转换为字符串
                System.out.println(new String(b));
                System.out.println("元素个数:" + count2);
                fis.close();//读完别忘了关闭
                System.out.println("------------读取完毕----------------");
            }else if(flag==3) {
                //创建文件字节输入流
                //new FileInputStream中要写入文件路径
                FileInputStream fis = new FileInputStream("D:\\aaa.txt");
                System.out.println("--------------使用read()读单个字节---------------");
                System.out.println("--------------方式2 使用循环---------------");
                byte[] b2 = new byte[3];
                int count3 = 0;
                //count3返回读取到的元素个数
                while ((count3 = fis.read(b2)) != -1) {
                    System.out.println(new String(b2, 0, count3));//count3代表从b2中实际读取的字符个数
                }
                fis.close();//读完别忘了关闭
                System.out.println("------------读取完毕----------------");
            }
        }
        a.close();
        System.out.println("退出成功");
    }
}
//输出:
1
--------------使用read()读单个字节---------------
a
b
c
d
e
f
g
------------读取完毕----------------
2
--------------使用read()读单个字节---------------
--------------使用read(b)读多个字节---------------
--------------方式1---------------
读第一次
abc
元素个数:3
读第二次
def
元素个数:3
------------读取完毕----------------
3
--------------使用read()读单个字节---------------
--------------方式2 使用循环---------------
abc
def
g
------------读取完毕----------------
4
退出成功
FileOutputStream
  • 如果没有文件则写的时候会自己创建一个文件
public class Demo02 {
    public static void main(String[] args) throws Exception{
        //创建文件字节输出流
        //new FileOutputStream中要写入文件路径
        FileOutputStream fis = new FileOutputStream("D:\\bbb.txt");
        //下面代码方式1和方式2只能单独执行一个,因为执行完一个之后输出流就关闭了
        //方式1
        System.out.println("--------------使用write()写单个字节---------------");
        fis.write(97);//97代表a
        fis.write('b');
        fis.write('c');
        fis.close();
        //方式2
        System.out.println("--------------使用write()写多个字节---------------");
        String s = "hello";
        fis.write(s.getBytes());//将字节返回
        fis.close();
        System.out.println("退出成功");
    }
}

字节流复制文件

public class Demo03 {
    public static void main(String[] args) throws Exception{
        //将aaa.txt复制到bbb.txt
        //输入流
        FileInputStream fis = new FileInputStream("D:\\aaa.txt");
        //输出流
        FileOutputStream fos = new FileOutputStream("D:\\bbb.txt");
        //边读边写
        byte[] bytes = new byte[1024];//一个byte是一个字节,1024个byte是1KB
        int count = 0;
        //读第一遍fis.read返回读到的元素个数,读第二遍因为光标已经在最后面所以读不到元素,返回为-1
        while ((count=fis.read(bytes))!=-1){
            fos.write(bytes,0,count);//将bytes中的数据从偏移0开始的count个字节写入fos中
        }
    }
}
posted @ 2022-02-10 11:37  史小鹏  阅读(33)  评论(0)    收藏  举报