字节流/节点流 ( FileOutputStream、FileIntputStream )

FileInputStream 流以Stream结尾是字节流,Input表示输入流,直接从文件中读取数据是节点流;

FileOutputStream 是字节流,输出流,节点流。

----------------------------------------------------------

FileOutputStream ( extends OutputStream )

1.构造方法

  • FileOutputStream(File file)            创建一个向指定 File 对象表示的文件中写入数据的文件输出流
  • FileOutputStream(String name)    创建一个向具有指定名称的文件中写入数据的输出文件流(更常用)

  下两个构造方法中,append 如果为 true,则将字节写入文件末尾处,而不是写入文件开始处(即在原内容上进行续写操作)

  • FileOutputStream(File file, boolean append)    创建一个向指定 File 对象表示的文件中写入数据的文件输出流
  • FileOutputStream(String name, boolean append)     创建一个向具有指定 name 的文件中写入数据的输出文件流

2.成员方法

  • void write(int b)           将指定字节写入此文件输出流。
  • void write(byte[] b)      将 b.length 个字节从指定 byte 数组写入此文件输出流中。
  • void write(byte[] b, int off, int len)      写出一个字节数组的一部分
  • close()
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class FileOutputStreamTest01 {
    public static void main(String[] args) throws IOException {
        //1.创建一个字节输出流对象,用于向指定的文件输出字节的(1.创建流对象2.让内存指向目的地文件3.如果目的地文件不存在,则创建该文件)
        // FileOutputStream fos = new FileOutputStream(new File("day09\\a.txt"));
        FileOutputStream fos = new FileOutputStream("day09\\a.txt"); // 这种创建方法更常用

        //2.向目的地文件写入数据 write(int b)
        fos.write(97); // a
        fos.write(57); // 9
        fos.write(55); // 7

        byte[] bytes = "我爱Java".getBytes();
        System.out.println(Arrays.toString(bytes));// [-26, -120, -111, -25, -120, -79, 74, 97, 118, 97]
        // 0~2,三个字节组成汉字 ’
        fos.write(bytes[0]);
        fos.write(bytes[1]);
        fos.write(bytes[2]);

        // void write(byte[] b)方法
        fos.write(bytes); // 我爱Java

fos.write("\n".getBytes()); // 换行操作
// void write(byte[] b, int off, int len) 方法,下标off开始,len个长度 fos.write(bytes,0,6); // 我爱 //3.释放资源 fos.close(); } }
执行代码后生成 a.txt 文件,并写入了以下数据:

------------------------------------------------

字节流的异常处理(捕获处理)

import java.io.FileOutputStream;
import java.io.IOException;

/*
try{
}catch(异常类型 变量){ 异常操作 }finally{ 无论是否产生异常,都会执行的代码块 } 以后开发中需要对于异常进行 捕获处理,你需要这么写 但是我们学习过程中,如果每次都这样写,你的关注点就被分散到异常处理上,代码结构看起来也不是很清晰 因此,平时学习中,抛出处理 就行了
*/ public class FileOutputStreamTest04 { public static void main(String[] args) { FileOutputStream fos = null; try { fos = new FileOutputStream("day09\\d.txt"); fos.write(97); }catch (IOException e){ e.printStackTrace(); }finally { try { if (fos != null){ fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } }

--------------------------------------------

FileInputStream(extends InputStream)

1.构造方法

  • FileInputStream(File file)  通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定
  • FileInputStream(String name)  通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定

2.成员方法

  • 读取方法
  • int read()    从此输入流中读取一个数据字节。返回下一个数据字节;如果已到达文件末尾,则返回 -1
  • int read(byte[] b)    从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
  • int read(byte[] b, int off, int len)    从此输入流中将最多 len 个字节的数据读入一个 byte 数组中
  • close()
  • 跳过方法
  • long skip(long n)    从输入流中跳过并丢弃 n 个字节的数据。返回实际跳过的字节数

import java.io.FileInputStream;
import java.io.IOException;
// int read()  从此输入流中读取一个数据字节
public class FileInputStreamTest01 {
    public static void main(String[] args) throws IOException {
        // 创建流对象 (b.txt 文件必须已存在,否则报错)
        FileInputStream fis = new FileInputStream("day09\\b.txt");

        // 循环读取每一个字节
        int by;
        while ((by = fis.read()) != -1){
            System.out.println(by);
        }

        fis.close();
    }
}
/* 循环输出结果:
  97
  98
  99
*/
import java.io.FileInputStream;
import java.io.IOException;
// int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
public class FileInputStreamTest01 {
    public static void main(String[] args) throws IOException {
        // 创建流对象 (b.txt 文件必须已存在,否则报错)
        FileInputStream fis = new FileInputStream("day09\\b.txt");

  //(1)返回结果是读取到的有效个数,如果文件中没有数据了,则返回-1
  //(2)每次读取到的字节数,往数组中进行赋值,从第一个元素开始进行赋值
/*
        byte[] bytes = new byte[2];
        System.out.println(Arrays.toString(bytes));  // [0,0]

        int num = fis.read(bytes);
        System.out.println("第一次读取返回结果:" + num);  // 2
        System.out.println("第一次读取后,数组中的内容:" + Arrays.toString(bytes));  // [97,98]

        int num2 = fis.read(bytes);
        System.out.println("第二次读取返回结果:" + num2);  // 1
        System.out.println("第二次读取后,数组中的内容:" + Arrays.toString(bytes));  // [99,98]

        int num3 = fis.read(bytes);
        System.out.println("第三次读取返回结果:" + num3);  // -1
        System.out.println("第三次读取后,数组中的内容:" + Arrays.toString(bytes));  // [99,98]
*/

        // 调用read(byte[] b)从文件中读取若干字节,把读取到的字节保存到字节数组中,返回本次从文件中读到的字节数
        byte[] bytes = new byte[2];
        int len;
        while ((len = fis.read(bytes)) != -1){
            // String(byte[] bytes, int offset, int length)
            System.out.println(new String(bytes,0,len));
        }
     // 释放资源 fis.close(); } }
/* 循环输出结果:   ab   c */
import java.io.FileInputStream;
import java.io.IOException;
/*
skip方法可以跳过某些字节不读,读取后面的
 long skip(long n)  从输入流中跳过并丢弃 n 个字节的数据
 */
public class FileInputStreamTest02 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("day09\\b.txt");
        int by = fis.read();
        System.out.println(by);  // 97
        fis.skip(1); // 这里,跳过了 1 位字节(98)
        int by2 = fis.read();
        System.out.println(by2);  // 99
     // 释放资源
        fis.close();
    }
}
/* 输出结果:
  97
  99
*/

-------------------------------------------------------

整合( FileOutputStream、FileIntputStream )

案例:将图片( C:\\Users\\Lenovo\\Desktop\\图day09.png)复制到指定位置( day09\\123.png)

当然,复制文件、软件都行,操作一样!

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
1.字节输入流(读取的文件的路径)
2.字节输出流(将读取到的字节数据,输出到指定的位置)
3.按照读取一个字节,写出一个字节来完成文件复制
   按照读取一个字节数组,写出一个字节数组形式完成复制
4.释放资源
*/
public class Test01 {
    public static void main(String[] args) throws IOException {
        // 读取一张图片的路径
        FileInputStream fis = new FileInputStream("C:\\Users\\Lenovo\\Desktop\\图day09.png");
        // 复制到指定位置(包括文件重命名)
        FileOutputStream fos = new FileOutputStream("day09\\123.png"); 
        //方式一:一次读写一个字节完成复制
        int by;
        while ((by = fis.read()) != -1){
            fos.write(by);
        }

        //方式二:一次读写一个字节数组(推荐!效率更高)
        // write(byte[] b, int off, int len) 方法能保证最后一次刚好写够
        /* 
        int len;
        byte[] bytes = new byte[1024]; // 比如一次1024个字节
        while ((len = fis.read(bytes)) != -1){  // 1.每次读1024字节到数组中
            fos.write(bytes,0,len);  // 2.再把数组写入到新图片里
        }*/

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

    }
}
// 执行代码后,图片就会被复制过来:

 

posted @ 2022-05-06 17:12  鹿先森JIAN  阅读(238)  评论(0编辑  收藏  举报