Java IO流

引言

在Java编程中,IO流是处理数据输入输出的核心机制。IO流分为字节流和字符流两大类。字节流以字节为单位处理数据,适用于所有文件类型;字符流以字符为单位处理数据,适用于文本文件。

Java IO流核心概念

 字节流与字符流的区别

特性字节流字符流
数据单位字节(8 bit)字符字符(16 bit Unicode)
处理场景所有文件(图片,视频,文本文件等)文本文件(如.txt,.java.py等)
核心类InputStream/OutputStreamReader/Writer
编码处理不自动处理编码自动处理编码

Demo.txt

1234567
Hello world
Hello Java

字符输入

 FileReader示例

代码

    public static void DemoFileReader(){
        try {
            FileReader fr = new FileReader("src\\DailyTest\\_250220\\Demo.txt");
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char)data);
            }
            fr.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

解析

在这部分代码中,创建一个FileReade对象,然后读取数据,通过.read()函数读取一个字节,读取成功则返回他的ASCII码,如果没内容,则返回-1,然后输出通过强转成char类型。整段代码在try代码块中,可能会报文件找不到的错误。

输出

1234567
Hello world
Hello Java

BufferReader示例

代码

    public static void DemoBufferReader(){
        try {
            BufferedReader br = new BufferedReader(new FileReader("src\\DailyTest\\_250220\\Demo.txt"));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

解析

基本同上,创建的对象为BufferReader(),调用函数readLine()进行读取,然后返回的是字符串。

输出

1234567
Hello world
Hello Java

字节出输入

InputStreamReader示例

代码

    public static void DemoFileInputStream(){
        try {
            FileInputStream fin = new FileInputStream("src\\DailyTest\\_250220\\Demo.txt");
            InputStreamReader in = new InputStreamReader(fin, "UTF-8");
            int data;
            while((data = in.read()) != -1){
                System.out.print((char)data);
            }
        }
        catch (Exception e){

        }

    }

解析

类为InputStreamReader类,读取数据方式为.read()

输出

1234567
Hello world
Hello Java

字符输出

BufferWriter示例

代码

    public static void DemoBufferWriter(){
        try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("out1.txt"));) {
            bufferedWriter.write("hello world\n");


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

    }

解析

打开文件,通过bufferWriter打开,写入通过函数.write()进行写入,在这部分代码中,将BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("out1.txt"));放如try中,这样可以不用考虑资源的释放,能够实现自动释放。

FileWriter示例

代码

    public static void DemoFileWriter(){
        try {
            FileWriter fileWriter = new FileWriter("out.txt");
            fileWriter.write('a');
            fileWriter.write(new char[]{'b','b','b','b','b'});
            fileWriter.write(new char[]{'d','d','d','c','c'},2,3);
            fileWriter.write("hello world\n");
            fileWriter.write("hello world\n",0,5);
            fileWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

解析

在这段代码中需要注意的有两个点,1是try没有了小括号,这样需要手动释放资源,try代码块的最后一行.close(),2是write()的重载,能够根据不同的情形选择合适的方法。

字节输出

FileOutputStream示例

代码

    public static void DemoFileOutputStream(){
        try {
            FileOutputStream fos = new FileOutputStream("src\\DailyTest\\_250220\\Demo.txt");
            String data = "hello world";
            byte[] bytes = data.getBytes();
            fos.write(bytes);
            fos.close();
        }
        catch (Exception e){

        }


    }

解析

这一段就一个注意点这个类的写入需要将字符型转为字节型,然后做参数进行写入。

复制文件

原理

同过字节读取的形式,然后再写入到另一个文件中,实现文件的复制

代码

    public static void DemoCopyFile(String original,String newFile){
        //        通过字节流复制一个文件
        try {
            FileInputStream fin = new FileInputStream(original);
            FileOutputStream fos = new FileOutputStream(newFile);
            byte[] bytes = new byte[1024];
            int len;
            while((len = fin.read(bytes)) != -1){
                fos.write(bytes,0,len);
            }
            fin.close();
            fos.close();
        }
        catch (Exception e){
            e.printStackTrace();
        }


    }

解析

通过传入两个文件名,然后进行文件的复制,常见思维是读取一个字节写入一个字节,但是这样的效率太低,因此在这个示例中,创建了一个缓存数组,一次读一个数组的大小,写入同理,这样能够提高很多效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值