java IO流二:字节流 FileInputStream & FileOutputstream

本文深入讲解Java中的FileInputStream和FileOutputStream,包括它们的基本用法、读写操作、字节流的复制,以及如何处理异常。通过实例演示了如何读取和写入文件,展示了高效的字节读取和文件复制技巧。

在这里插入图片描述

FileInputStream:文件字节输入流

package com.company01.IO;
/*
    java.io.InputStream;
        java.io.FileInputStream; 文件字节输入流

        按照字节方式读取文件
*/
import java.io.*;
public class FileInputStreamTest01 {
    public static void main(String[] args) {

        FileInputStream fis = null;

        try{
            // 1.要读取某文件,先与这个文件创建一个“输入流”
            // 文件路径
            //String filePath = "test.txt";  // 相对路径&绝对路径  绝对路径注意由于转义字符的存在,采用双斜杠"\\"
            // 在IDEA中与相对路径起始位置默认是在Moudel文件下,与src文件夹同一级别。
            String filePath = "E:\\mydemo\\Java\\IDEA\\test\\day02\\src\\com\\company01\\IO\\test.txt";
            // 由于在windows路径中 / 和 \ 是一样的,并且 \ 也能规避转义字符,所以也能写成下面这样
            //String filePath = "E:/mydemo/Java/IDEA/test/day02/src/com/company01/IO/test.txt";

            fis = new FileInputStream(filePath);

            // 2.开始读
            int i1 = fis.read(); // 以字节的方式读取,一个字母占一个字节,一个汉字占两个字节,每次读取一半
            int i2 = fis.read();
            int i3 = fis.read();

            int i4 = fis.read();
            int i5 = fis.read();

            int i6 = fis.read();  // 文件中只有“abc我”

            System.out.println(i1);  // 输出a的ASIIC码 97
            System.out.println(i2);  // 98
            System.out.println(i3);  // 99

            System.out.println(i4);  // 206
            System.out.println(i5);  // 210

            System.out.println(i6);  // -1  // 如果已经读取到文件的末尾。就会返回-1

        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){   // IOException比FileNotFoundException 更加宽泛,必须写在后面
            e.printStackTrace();
        }finally{

            //为了保证流一定会释放,所以在finally语句块中执行
            if(fis != null){
                try{
                    fis.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }

        }
    }
}

package com.company01.IO;

import java.io.FileInputStream;

public class FileInputStreamTest02 {
    public static void main(String[] args) throws Exception {

        // 1.创建流
        FileInputStream fis = new FileInputStream("test01");

        // 2.开始读
        /*
        while(true){
            int temp = fis.read();
            if(temp == -1) break;

            System.out.println(temp);
        }
        */
        // 升级循环
        int temp = 0;
        while((temp = fis.read()) != -1){
            System.out.println(temp);
        }

        // 3.关闭流
        fis.close();
    }
}

package com.company01.IO;

import java.io.FileInputStream;

/*
    int read(byte[] bytes);
    读取之前在内存中准备一个byte数组,每次读取多个字节存储到byte数组中。
    一次读取多个字节,不是单字节读取了。

    效率高
*/
public class FileInputStreamTest03 {
    public static void main(String[] args) throws Exception{

        // 1.创建输入流

        FileInputStream fis = new FileInputStream("test01");

        // 2.开始读
        // 准备一个byte数组
        byte[] bytes = new byte[3];  // 每次最多读取3个字节

        // int read(byte[] bytes);  该方法返回的int类型的值代表的是:这次读取了多少个字节
        int i1 = fis.read(bytes);   // 3

        // 将byte数组转换成字符串
        System.out.println(new String(bytes));  // abc

        int i2 = fis.read(bytes);   // 3

        System.out.println(new String(bytes));  // def

        int i3 = fis.read(bytes);   // 1

        System.out.println(new String(bytes));  // gef   新读取到的就一个g,只会对d进行覆盖,bytes数组剩余的2个位置元素不变
        // 如果只想要获得g
        System.out.println(new String(bytes, 0, i3));  // g

        int i4 = fis.read(bytes);  // -1 已经到达文件的末尾,返回-1

        System.out.println(i1);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println(i4);
        // 关闭
        fis.close();

    }
}

package com.company01.IO;

import java.io.FileInputStream;

/*
    循环读取
*/
public class FileInputStreamTest04 {
    public static void main(String[] args) throws Exception {

        FileInputStream fis = new FileInputStream("test01");

        // 循环取出
        byte[] bytes = new byte[1024];  //每次读取1KB

        /*
        while(true){
            int temp = fis.read(bytes);

            if(temp==-1) break;

            // 将数组中的有效数据转换成字符串
            System.out.print(new String(bytes, 0, temp));
        }

        */


        // 升级循环
        int temp = 0;
        while(((temp=fis.read(bytes)))!= -1){
            System.out.print(new String(bytes, 0, temp));
        }
        fis.close();
    }
}

package com.company01.IO;

import java.io.*;

public class FileInputStreamTest05 {
    public static void main(String[] args) throws IOException{


        FileInputStream fis = new FileInputStream("test01");

        System.out.println(fis.available());  // 7
        System.out.println(fis.read()); // 97

        // int available(); 返回流中剩余的估计字节数。
        System.out.println(fis.available());  // 6  读取一个之后减一了

        // 跳过2个字节
        fis.skip(2);
        System.out.println(fis.available());  // 4

        fis.close();
    }
}

FileOutputStream:文件字节输出流

package com.company01.IO;

import java.io.FileOutputStream;

/*
    java.io.OutputStream;
        java.io.FileOutputStream;  文件字节输出流

        将计算机内存中的数据写入硬盘文件中
*/
public class FileOutputStreamTest01 {
    public static void main(String[] args) {

        FileOutputStream fos = null;
        //String str = "E:/mydemo/Java/IDEA/test/day02/src/com/company01/IO/test.txt";

        try{
            // 1.创建文件字节输出流
            // fos = new FileOutputStream("test01");  //改文件不存在则自动创建  【注】这种方式不是在后面添加,而是覆盖重写

            // 【注】以追加的方式写入
            fos = new FileOutputStream("test01", true);  // 在后面追加

            // 2.开始写
            String msg = "Hello World! ";

            // 将String转换成byte数组
            byte[] bytes = msg.getBytes();

            // 将byte数组中所有的数据全部写入
            fos.write(bytes);

            // 将byte数组中的部分数据写入
            fos.write(bytes, 0,3);   // 0表示起始位置,3表示长度

            // 推荐最后的时候为了保证数据完全写入硬盘,所以要刷新
            fos.flush();  // 强制写入

        }catch(Exception e){
            e.printStackTrace();
        }finally{

            // 关闭
            if(fos!=null){
                try{
                   fos.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }

    }
}

使用FileInputStream & FileOutputStream 实现文件复制

注:FileInputStream & FileOutputStream 实现文件复制,该文件只能是文本文件。

package com.company01.IO;
/*
    关于文件复制粘贴
*/
import java.io.*;

public class CopyTest01 {
    public static void main(String[] args) throws Exception{

        // 创建输入流
        FileInputStream fis = new FileInputStream("test01");

        // 创建输入流
        FileOutputStream fos = new FileOutputStream("test02");

        // 一边读,一边写
        byte[] bytes = new byte[1024];  // 1KB
        int temp = 0;
        while((temp = fis.read(bytes)) != -1){

            // 将byte数组中内容直接写入
            fos.write(bytes, 0 , temp);
        }
        // 刷新
        fos.flush();

        // 关闭流
        fis.close();
        fos.close();
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值