Java-IO之字节流(FileInputStream,FileOutputStream)

目录

  • 1.字节流写数据
    • 1.2 字节流写数据的三种方式
    • 1.3 字节流写数据的两个小问题
      • 1.3.1 字节流写数据如何实现换行
      • 1.3.2 字节流写数据如何实现追加写入
  • 2.字节流读数据
    • 2.1 一次读一个字节数据
    • 2.1 一次读一个字节数组数据
  • 3.字节流复制文本文件
  • 4.字节流复制图片

使用场景:

  • 如果操作的是纯文本文件,优先使用字符流
  • 如果操作的是图片、视频、音频等二进制文件。优先使用字节流
  • 如果不确定文件类型,优先使用字节流。字节流是万能的流

1.字节流写数据

  • 字节输出流
    FileOutputStream(String name):创建文件输出流以指定的名称写入文件
  • 使用字节输出流写数据的步骤
    1.创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
    2.调用字节输出流对象的写数据方法
    3.释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)

示例代码:

public void demo1(){
        //创建字节输出流对象
        //FileOutputStream(String name):创建文件输出流以指定的名称写入文件
        try (FileOutputStream fos = new FileOutputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\fos.txt"
        /*A:调用系统功能创建了文件
          B:创建了字节输出流对
          C:让字节输出流对象指向创建好的文件*/
        )){
            fos.write(97);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1.2 字节流写数据的三种方式

  • 写数据的方法分类
方法名 说明
void write(int b) 将指定的字节写入此文件输出流 一次写一个字节数
void write(byte[] b) 将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组 数据
void write(byte[] b, int off, int len) 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一 次写一个字节数组的部分数据

示例代码:

public void demo2(){
        try(FileOutputStream fos = new FileOutputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\fos.txt")){
//            fos.write(97);
//            fos.write(98);
//            fos.write(99);
//            fos.write(100);
//            byte[] bytes = {97,98,99,100,101};
//            fos.write(bytes);
            byte[] bytes1 = "abcdef".getBytes();
//            fos.write(bytes1);
            fos.write(bytes1,1,3);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

1.3.1 字节流写数据如何实现换行

  • windows:\r\n
  • linux:\n
  • mac:\r

示例代码:

public void demo3(){
        try(FileOutputStream fos = new FileOutputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\fos.txt")){
            byte[] bytes = "a\r\nbcdef".getBytes();
            fos.write(bytes);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1.3.2 字节流写数据如何实现追加写入

方法名 说明
public FileOutputStream(String name,boolean append) 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头

示例代码:

public void demo4(){
        try(FileOutputStream fos = new FileOutputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\fos.txt",true)){
            byte[] bytes = "a\r\nbcdef".getBytes();
            fos.write(bytes);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.字节流读数据

2.1 一次读一个字节数据

  • 字节输入流
    FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream ,该文件由文 件系统中的路径名name命名
  • 字节输入流读取数据的步骤
    1.创建字节输入流对象
    2.调用字节输入流对象的读数据方法
    3.释放资源

示例代码:

public void demo1(){
        //创建字节输入流对象
        try(FileInputStream fis = new FileInputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\fos.txt")){
            int by;
            /*fis.read():读数据
            by=fis.read():把读取到的数据赋值给by
            by != -1:判断读取到的数据是否是-1*/
            while ((by=fis.read()) != -1){
                System.out.println((char)by);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

2.1 一次读一个字节数组数据

  • 一次读一个字节数组的方法
    public int read(byte[] b):从输入流读取最多b.length个字节的数据
    返回的是读入缓冲区的总字节数,也就是实际的读取字节个数

示例代码

public void demo2(){
        //创建字节输入流对象
        try(FileInputStream fis = new FileInputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\fos.txt")){
            byte[] bys = new byte[1024];
            int len;
            /*hello\r\n
            world\r\n

            第一次:hello
            第二次:\r\nwor
            第三次:ld\r\nr*/
            while ((len = fis.read(bys)) != -1){
                System.out.println(new String(bys,0,len));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.字节流复制文本文件

  • 案例需求
    把“D:\project\study_project\javase\src\test\java\com\zhangzemin\io\fos.txt”复制到模块目录下的“D:\project\study_project\javase\src\test\java\com\zhangzemin\io\byte_straem\fos.txt”
  • 实现步骤
    1.复制文本文件,其实就把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目 的地)
    2.数据源: D:\project\study_project\javase\src\test\java\com\zhangzemin\io\fos.txt — 读数据 — InputStream — FileInputStream
    3.目的地:D:\project\study_project\javase\src\test\java\com\zhangzemin\io\byte_straem\fos.tx — 写数据 — OutputStream — FileOutputStream

示例代码:

public void demo3(){
        try(FileInputStream fis = new FileInputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\fos.txt");
            FileOutputStream fos = new FileOutputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\byte_straem\\fos.txt")){
            int b;
            while ((b = fis.read()) != -1){
                fos.write(b);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4.字节流复制图片

  • 案例需求
    把“D:\project\study_project\javase\src\test\java\com\zhangzemin\io\mn.jpg”复制到模块目录下的“D:\project\study_project\javase\src\test\java\com\zhangzemin\io\byte_straem\mn.jpg”
  • 实现步骤
    1.根据数据源创建字节输入流对象
    2.根据目的地创建字节输出流对象
    3.读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
    4.释放资源

示例代码:

public void demo4() {
        try (
                //根据数据源创建字节输入流对象
                FileInputStream fis = new FileInputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\mn.jpg");
                //根据目的地创建字节输出流对象
                FileOutputStream fos = new FileOutputStream("D:\\project\\study_project\\javase\\src\\test\\java\\com\\zhangzemin\\io\\byte_straem\\mn.jpg")) {

            //读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
            byte[] bys = new byte[1024];
            int len;
            while ((len = fis.read(bys)) != -1) {
                fos.write(bys, 0, len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

你可能感兴趣的:(javase)