Java学习日志(十八): 字节输出流,字节输入流

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

字节流

概述

在这里插入图片描述

OutputStream(字节输出流)

java.io.OutputStream
此抽象类是表示输出字节流的所有的超类,里边定义了所有字节输出流共性的成员方法

  • void write(int b) 写一个字节
  • void write​(byte[] b) 写一个字节数组
  • void write​(byte[] b, int off, int len) 写字节数组的一部分,off数组的开始索引,len写的字节个数
  • void flush() 刷新此输出流并强制写出任何缓冲的输出字节。
  • void close() 关闭此输出流并释放与此流关联的所有系统资源。

FileOutputStream

java.io.FileOutputStream extends OutputStream(文件字节输出流)

FileOutputStream的构造方法:
FileOutputStream​(File file) 创建文件输出流以写入由指定的 File对象表示的文件
FileOutputStream​(String name) 创建文件输出流以写入具有指定名称的文件
参数:输出的目的地

  • String name:目的地是一个文件的路径
  • File file:目的地是一个文件

FileOutputStream的构造方法的作用:

  1. 会根据参数传递的目的地,创建一个文件。如果文件存在,则会覆盖
  2. 会创建一个FileOutputStream对象
  3. 会把FileOutputStream对象指向创建好的文件

写入数据到文件底层原理

java程序-->JVM-->操作系统(os)-->调用系统的方法-->把数据写入到目的地

字节输出流的使用步骤:

  1. 创建FileOutputStream对象,构造方法中绑定输出的目的地
  2. 使用FileOutputStream对象中的方法write,把数据写入到目的地中去
  3. 释放资源

注意:若找不到文件路径,则会出现异常java.io.FileNotFoundException: w:day09\1.txt (系统找不到指定的路径。)

示例: void write(int b) 写一个字节

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //1.创建FileOutputStream对象,构造方法中绑定输出的目的地
        FileOutputStream fos = new FileOutputStream("day09\\1.txt");
        //2.使用FileOutputStream对象中的方法write,把数据写入到目的地中去
        fos.write(97);
        //3.释放资源
        fos.close();
    }
}

结果:记事本中显示的数据为a
为什么写入文件之后,记事本中会出现a
在这里插入图片描述

示例:字节输出流中写多个字节的方法
void write​(byte[] b) 写一个字节数组
void write​(byte[] b, int off, int len) 写字节数组的一部分,off数组的开始索引,len写的字节个数

public class Demo02 {
    public static void main(String[] args) throws IOException {
        //1.创建FileOutputStream对象,构造方法中绑定输出的目的地
        FileOutputStream fos = new FileOutputStream(new File("day09\\2.txt"));
        // 2.使用FileOutputStream对象中的方法write,把数据写入到目的地中去
        //面试题:在文件中显示100
        //fos.write(100);//d
        fos.write(49);//1
        fos.write(48);//0
        fos.write(48);//0

        /*
        void write​(byte[] b)   写一个字节数组
        了解:
            写多个字节的时候,第一个字节是整数,那么查询文件的时候,会查询ASCII表
            写多个字节的时候,第一个字节是负数,那么第一个字节会和第二个字节/第二个字节或者第二三个字节组成一个中文
            那么查询文件的时候,会查询系统码表(GBK)

         */
        byte[] bytes = {65,66,67,68,69};//ABCDE
        //byte[] bytes = {-65,-66,-67,68,69};//ABCDE

        fos.write(bytes);
        //void write​(byte[] b, int off, int len) 写字节数组的一部分,off数组的开始索引,len写的字节个数
        fos.write(bytes,1,2);//BC
        /*
            便捷写字符的方法
            String类有一个方法
            byte[] getBytes() 把字符串转化为字节数组
         */

        fos.write("你好".getBytes());//使用UTF-8转换
        //释放资源
        fos.close();
    }
}

便捷写字符的方法:String类有一个方法
byte[] getBytes() 把字符串转化为字节数组

fos.write("你好".getBytes());//使用UTF-8转换

续写
FileOutputStream​(File file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream​(String name, boolean append) 创建文件输出流以写入具有指定名称的文件。

参数

  • File file,String name:写入数据的目的地
  • boolean append:续写的开关
    true:创建对象不会覆盖之前的文件,写数据会在文件末尾继续写
    false:创建对象会创建一个新文件覆盖之前的文件,不写默认为false

换行:可以使用换行符号
windows系统:\r \n
Linux: /n
mac: /r

示例:续写与换行

public class Demo03 {
    public static void main(String[] args) throws IOException {
        //创建FileOutputStream对象
        FileOutputStream fos = new FileOutputStream("day09\\3.txt", true);
        //调用write方法
        for (int i = 0; i < 10; i++) {
            fos.write("hello".getBytes());
            //换行符
            fos.write("\r\n".getBytes());
        }
        //释放资源
        fos.close();
    }
}

InputStream(字节输入流)

java.io.InputStream:字节输入流
此抽象类是表示输入字节流的所有类的超类。
里边定义了所有字节输入流中共性的成员方法
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 读取一个字节,并返回
public int read(byte[] b) : 读取多个字节,存储到数组中返回

FileInputStream

java.io.FileInputStream extends InputStream
文件字节输入流

作用:把文件中的数据,以字节的方式读取到内存中

构造方法

  • FileInputStream​(File file)
  • FileInputStream​(String name)
    参数:读取的数据源
    File file:数据源是一个文件
    String name:数据源是一个文件路径

构造方法作用

  1. 创建一个FileInputStream对象
  2. 会把FileInputStream对象指向要读取的第一个字节

读取数据的底层原理

java程序-->JVM-->OS-->OS读取数据的方法-->读取文件

字节输入流的使用步骤

  1. 创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
  2. 使用FileInputStream中的方法read,读取文件
  3. 释放资源

注意:构造方法中指定的文件不存在,会抛出文件找不到异常
java.io.FileNotFoundException: day10\1.txt (系统找不到指定的文件。)

一、使用字节输入流,一次读取一个字节

示例public abstract int read() 使用字节输入流,一次读取一个字节

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //1.创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("day10\\1.txt");//abc
        //2.使用FileInputStream中的方法read,读取文件
        //public abstract int read() : 读取一个字节,并返回
        int len = fis.read();
        System.out.println(len);//97 a

        len = fis.read();
        System.out.println(len);//98 b

        len = fis.read();
        System.out.println(len);//99 c

        len = fis.read();
        System.out.println(len);//-1

        len = fis.read();
        System.out.println(len);//-1

        fis.close();


    }
}

读取文件的过程是一个重复的过程,所以使用循环优化
使用While循环,循环结束条件:read方法返回-1

While循环的布尔表达式

  1. fis.read:读取一个字节
  2. len = fis.read():把读取到的字节赋值给变量len
  3. (len = fis.read()) != -1:判断变量len是否为-1

示例:循环优化输入

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //1.创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("day10\\1.txt");//abc
        //2.使用FileInputStream中的方法read,读取文件
        //public abstract int read() : 读取一个字节,并返回
//        int len = fis.read();
//        System.out.println(len);//97 a
//
//        len = fis.read();
//        System.out.println(len);//98 b
//
//        len = fis.read();
//        System.out.println(len);//99 c
//
//        len = fis.read();
//        System.out.println(len);//-1
//
//        len = fis.read();
//        System.out.println(len);//-1

        /*
            读取文件的过程是一个重复的过程
            循环优化
            使用While循环,循环结束条件:read方法返回-1

            While循环的布尔表达式
                1.fis.read:读取一个字节
                2.len = fis.read():把读取到的字节赋值给变量len
                3.(len = fis.read()) != -1:判断变量len是否为-1

         */
        int len = 0;
        while ((len = fis.read()) != -1) {
            System.out.println(len);
        }


        fis.close();


    }
}

二、使用字节输入流一次读取多个字节

String类中的构造方法
String(byte[] bytes) 把字节数组转化为字符串
String(byte[] bytes, int offset, int length) 把字节数组的一部分转化为字符串,offset:数组的开始索引,length:转换的字节数

两件事情

  1. read方法的参数byte[]作用:起缓冲作用,可以把多次读取到的字节存储到数组中,数组长度一般定义为1024(1kb),或1024的整数倍
  2. read方法的返回值int:每次读取到的有效字节个数

示例public int read(byte[] b) 读取多个字节,存储到数组中返回

public class Demo02 {
    public static void main(String[] args) throws IOException {
        //1.创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("day10\\2.txt");//ABCDE
        //2.调用FileInputStream对象中的方法read,读取文件
        byte[] bytes = new byte[2];
        int len = fis.read(bytes);
        System.out.println(len);//2
        System.out.println(new String(bytes));//AB

        len = fis.read(bytes);
        System.out.println(len);//2
        System.out.println(new String(bytes));//CD

        len = fis.read(bytes);
        System.out.println(len);//1
        System.out.println(new String(bytes));//ED

        len = fis.read(bytes);
        System.out.println(len);//-1
        System.out.println(new String(bytes));//ED

        //释放资源
        fis.close();

    }
}

示例:循环优化

public class Demo02 {
    public static void main(String[] args) throws IOException {
        //1.创建字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
        FileInputStream fis = new FileInputStream("day10\\2.txt");//ABCDE
        //2.调用FileInputStream对象中的方法read,读取文件
//        byte[] bytes = new byte[2];
//        int len = fis.read(bytes);
//        System.out.println(len);//2
//        System.out.println(new String(bytes));//AB
//
//        len = fis.read(bytes);
//        System.out.println(len);//2
//        System.out.println(new String(bytes));//CD
//
//        len = fis.read(bytes);
//        System.out.println(len);//1
//        System.out.println(new String(bytes));//ED
//
//        len = fis.read(bytes);
//        System.out.println(len);//-1
//        System.out.println(new String(bytes));//ED

        /*
            循环优化
         */
        byte[] bytes = new byte[1024];
        int len = 0;
        while((len = fis.read(bytes))!=-1){
            //只把有效的字节个数转换为字符串
            System.out.println(new String(bytes,0,len));
        }

        //释放资源
        fis.close();

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值