IO流---字节流

618 阅读3分钟

1: IO流概述

在研究字节流前,我们先来了解一下什么是IO流

流:流的本质是对数据有方向的一个传输,字节的一个集合;其作用就是在数据源和程序之间建立一个通道。

IO流则用来处理设备之间的数据传输。

IO分类:

1:按流分类:输入流,输出流。

2: 按处理单元分:字节流,字符流。

3:按流的角色分:节点流,处理流。

2:字节流概述

字节流,是IO流中以处理数据单位分类的两种类别之一(另一种为字符流)。

字节流一般用来处理图像,视频,音频,PPT等类型的文件。

3: 字节流的使用---FileInputStream,FileOutputStream

    public static void main(String[] args) throws IOException {
//        创建字节输出流对象
//         FileOutStream,创建文件输出流以指定的名称写入文件
     FileOutputStream fos=new FileOutputStream("D:\file\javaop.txt");

//将指定文件写入文件输出流
        fos.write(Integer.parseInt("97"));

//      释放资源
//       关闭文件输出流并释放与此流相关联的任何系统资源
        fos.close();
    }

public static void main(String[] args) throws IOException {
//        创建字节输入流对象
        FileInputStream fis=new FileInputStream("D:\op.txt");
//        调用字节输入流对象的数据方法
//        第一次读取数据

//        int red = fis.read();
//        System.out.println(red);
//        强制转换
//        System.out.println((char)red);
//         red = fis.read();
//        System.out.println(red);
//        强制转换
//        System.out.println((char)red);
//        如果文件里没有数据后再单次读取,则返回-1;
//
//        循环改进读取数据
//        int r = fis.read();
//            while (r!=-1){
//                System.out.print((char)r);
//                r = fis.read();
//                优化上面的程序
        int by;
        while ((by=fis.read())!=-1){
            System.out.println((char)by);

            }
    }

事实上,这两种方法读取大文件的效率太低了,为了解决这一问题,我们需要引入缓冲字节流

4:缓冲字节流

缓冲字节流是为了高效率而设计的,但是真正的读写还是要靠FileOutStream和FileInputStream,所以靠他们来实例化。

   public static void main(String[] args) throws IOException {
//        创建字节缓冲输出流
        FileOutputStream fos = new FileOutputStream("D:\opp.txt");
        BufferedOutputStream bus = new BufferedOutputStream(fos);
//        写数据
        bus.write("hello".getBytes());
        bus.write("world".getBytes());
//释放资源
        bus.close();

//    字节缓冲输入流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\OPP.TXT"));
//    读数据
//    一次读取一个字节数据
        int bye;
        while ((bye = bis.read()) != -1) {
            System.out.println((char) bye);
        }
//        一次读取一个字节数组的数据
        byte[] by=new byte[1024];
        int len;
        while ((len=bis.read(by))!=-1){
            System.out.println(new String(by,0,len));
        }
        bis.close();
        字节流读写数据的方法已经包含在上诉例子中,所以我不再过多赘述。

通俗点来说,缓冲流减少了读写的次数,进而提高了效率。

5:字节流写数据的两个小问题

1:不同系统的换行符是不同的,因此数据读入的时候,可能会导致字节错位。

2:追加写入

    public static void main(String[] args) throws IOException {
//        创建字节输出字节流对象
//        FileOutputStream ll=new FileOutputStream("D:\op.txt");
//        写数据
//        for (int i = 0; i <10 ; i++) {
//            ll.write("hello".getBytes());
////            换行符,不同系统之间的换行符不同
//            ll.write("\n".getBytes());
//            追加写入
//            如果第二个参数为true,则字节将写入文件的末尾而不是开头
            FileOutputStream ll=new FileOutputStream("D:\op.txt",true);

//            写数据
            for (int i = 0; i <10 ; i++) {
                ll.write("hello".getBytes());
//            换行符,不同系统之间的换行符不同
                ll.write("\n".getBytes());
        }
//        释放资源
        ll.close();
    }