java中的IO流(字节流和字符流)----读写文件数据

简介: 输入流(读)(硬盘👉内存)、输出流(写)(内存👉硬盘)

一、划分依据

1.按流的方向分:

输入流(读)(硬盘👉内存)、输出流(写)(内存👉硬盘)

2.按流中的数据最小方向分(抽象类):

字节流(输入:InputStream 、   输出:OutputStream)、

字符流(输入:Reader 、输出Writer)

二、具体实现类

上述四个都是抽象类,不能直接用,要使用对应的实现类去实现,多态形式。

1.对应的实现类:抽象类前面都加上File就是实现类形式了

三、其他知识点

1.常用的就是字符流

2.输入就是读取存在的文件。输出就是写入数据(可以自动建立文件)。

3.拷贝文件要手动建立一个文件,并且注意一二级文件(一级目录不能直接写入,二级才能生成写入)

4.什么类型的IO流就放什么类型的数据。

5.反斜杠(\\)就用两个。正斜杠就用一个(/)。效果是一样的

四、具体IO流代码例子:

1.字节流输入(读取文件数据)

读取存在的文件就好了

例子:

package bao;
import java.io.*;
public class Test {
    public static void main(String[] args) throws IOException {
        //1.创建要读取的文件对象
        File file = new File("D:\\java_base\\SE\\src\\bao\\测试.txt");
        //2,new输入读取的实现类,这里要使用多态接口
        InputStream f = new FileInputStream(file);//会出现异常,抛出就好
        //3.定义一个和文件刚好大小的数组来进行读取
        byte[] b = new byte[(int) file.length()];
        //获取读取了多少个字节
        int len = f.read(b);//会出现异常,抛出就好
        System.out.println("读取了多少个字节:"+len);
        //获取文件的大小
        System.out.println(file.length());
        //获取文件内容
        System.out.println("文件内容为:"+new String(b));
    }
}

运行结果:

读取了多少个字节:69

69

文件内容为:想念真的是压制不住的想念,但是又没有办法。kkk111

2.字节输出流(写入文件数据)

不需要提前创建文件,代码中自动生成

注意点:这里的是字节输入流,只能放字节类型。

例子:

package bao;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class Test {
    public static void main(String[] args) throws IOException {
        //1.创建要读取的文件对象,会自动生成建立一个文件夹
        FileOutputStream os = new FileOutputStream("D:\\java_base\\SE\\src\\bao\\测试.txt");//会覆盖之前的文件内容,要在之前的文件上追加内容可以在加个true。例如:(xx,true)
        //2.要传入的数据放入一个数组中,要多少就给到文件中去
        byte[] a = {'w', '9','1','5','p'};
        //3.整个数组内容写入到文件中去
        os.write(a);
        //换行
        os.write("\r\n".getBytes(StandardCharsets.UTF_8));
        //4.中文单独写入到文件夹中
        byte[] b="中国人".getBytes(StandardCharsets.UTF_8);
        os.write(b);
        //关闭流,包含了刷新流(flush)。有了刷新才能运行完成。
        os.close();
    }
}

运行结果:

w515p 中国人

3.文件拷贝:

要提前创建一个放数据的文件夹

适合做一切文件的拷贝,任何文件的底层都是字节

用到的素材:

例子:

package bao;
import java.io.*;
public class Test {
    public static void main(String[] args) throws IOException {
        //拷贝这个可能会出现异常,写完全部选中用异常处理快捷键CTRL+alt+t处理就好了。cty catch
        try {
            //文件拷贝三步走。1.建立输入拷贝源文件地址对象  2.建立输出拷贝到目标的地址对象   3.数组当两者之间的拷贝中介(传输管道)
            //1.输入的拷贝对象。注意点:这里要复制的只能一个个文件复制,而不是一整个文件夹复制地址
            InputStream in = new FileInputStream("D:\\图片\\壁纸\\巴蛇.jpg");//把图片文件夹全部复制拷贝地址
            //2.输出的拷贝对象。注意点:这里要粘贴到哪里也要精确到哪个文件中去(至少两级文件夹)
            OutputStream out = new FileOutputStream("E:\\放这里\\这里的名字就是粘贴到的文件名");//粘贴到的地址(一级地址"放这里"要手动先建立好,二级文件是自动生成的)
            //3.数组传输中介
            byte[] b = new byte[1024];//传输中介大小
            int len;//记录每次读取的字节数
            //循环来完成读写的闭环传输
            //读取数据
            while ((len=in.read(b))!=-1){
                //写入数据
                out.write(b,0,len);
            }
            System.out.println("复制完成了");
            //生成的抛出异常代码
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

运行结果:

复制完成了

(复制成功👇)

1.为什么要用强制资源释放?

答:在开发中,有可能中间的代码就报错了,执行不到下面的关闭流代码。那么就要有一个好大哥来保证不管中间的运行时代码是否报错(编译异常会报错,只能通过运行时异常),这个强制关闭代码都会关闭流。那就是jvm不死,finally就存在并且优先执行于关闭流close。

2.怎么做?

把例子3的代码try catch改成 try catch finally(里面代码块记得加上return;)就好了(快捷键ctrl+alt+t

例子:

可看可不看的代码,用来对照例子3更改了哪里

package bao;
import java.io.*;
public class Test {
    public static void main(String[] args) throws IOException {
        //拷贝这个可能会出现异常,写完全部选中用异常处理快捷键CTRL+alt+t处理就好了。cty catch finally(记得加上代码块return;才能生效)
        try {
            //文件拷贝三步走。1.建立输入拷贝源文件地址对象  2.建立输出拷贝到目标的地址对象   3.数组当两者之间的拷贝中介(传输管道)
            //1.输入的拷贝对象。注意点:这里要复制的只能一个个文件复制,而不是一整个文件夹复制地址
            InputStream in = new FileInputStream("D:\\图片\\壁纸\\巴蛇.jpg");//把图片文件夹全部复制拷贝地址
            //2.输出的拷贝对象。注意点:这里要粘贴到哪里也要精确到哪个文件中去(至少两级文件夹)
            OutputStream out = new FileOutputStream("E:\\放这里\\这里的名字就是粘贴到的文件名");//粘贴到的地址(一级地址"放这里"要手动先建立好,二级文件是自动生成的)
            //3.数组传输中介
            byte[] b = new byte[1024];//传输中介大小
            int len;//记录每次读取的字节数
            //循环来完成读写的闭环传输
            //读取数据
            while ((len=in.read(b))!=-1){
                //写入数据
                out.write(b,0,len);
            }
            System.out.println("复制完成了");
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            return;
        }
    }
}

运行结果:

复制完成了

5.字符输入流 (读取文件数据)

读取存在的文件就好了

为什么要用到字符流?

优点:解决字节流可能出现的中文乱码问题。

缺点: 性能较慢

例子:

素材:

package bao;
import java.io.FileReader;
import java.io.Reader;
public class Test {
    public static void main(String[] args) throws Exception {
            //创建一个要读文件的对象
            Reader f = new FileReader("D:\\java_base\\SE\\src\\bao\\测试.txt");
            //new一个中介a进行读取
        char[] a = new char[1024];//1k字符
        int len;//这个len用来装要读里面的数据
        while ((len = f.read(a))!=-1){//把文件数据放到这个中介桶里面。
            //开始读
            String s = new String(a,0,len);
            System.out.println(s);
        }
    }
}

马作的卢飞快,弓如霹雳弦惊,ABCabc123,小狗小狗

6.字符输出流(写入文件数据)

不需要提前创建文件,代码中自动生成

package bao;
import java.io.FileWriter;
import java.io.Writer;
public class Test {
    public static void main(String[] args) throws Exception {
        //创建一个要写文件的对象,该文件可以自动生成,出现异常抛出就好了
         Writer f = new FileWriter("D:\\java_base\\SE\\src\\bao\\测试1.txt");//后期需要加入数据就尾部加入true
        //例如: Writer f = new FileWriter("D:\\java_base\\SE\\src\\bao\\测试1.txt",true);
        //1.写一组数据进去
        f.write("6666长安落尽马蹄疾,aa");
        //2.写一个数组进去。
        char[] c="888一日看尽长安花,bb".toCharArray();
        f.write(c);
        f.close();//关闭流包含了刷新流。刷新流是flush
    }
}

运行结果:

6666长安落尽马蹄疾,aa888一日看尽长安花,bb

旁白:主要学习会了字符类型的IO流就好了。每次执行都会覆盖原有的数据,在开始创建对象地址后面加上一个true就不会被覆盖并且可以添加新的数据了,写完一定要记得刷新流或者关闭流才会生效。出现异常是常有的事情,快捷键抛出就好了。

目录
相关文章
|
2月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
38 1
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
86 1
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
3月前
|
移动开发 Java Linux
IO流:字节流
在Java编程中,IO流是一个核心概念,用于与文件、网络、内存等数据源交互。Java的IO库提供丰富的类和方法支持数据读写。IO流分为字节流和字符流,前者可操作所有类型文件,后者仅限纯文本文件。`FileOutputStream`用于向文件写入字节,支持多种写入方式,并可通过构造函数的布尔参数控制是否追加写入。`FileInputStream`则用于从文件读取字节,支持逐字节或批量读取。文件拷贝可通过结合读写操作实现,高效的方法是一次性读取并写入大容量数组。处理IO流时需注意异常管理,合理使用try-catch-finally结构确保资源正确释放。JDK7及以后版本提供了自动关闭资源的简化语法
51 10
|
4月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
49 2
|
4月前
|
NoSQL Redis 数据库
Redis AOF重写问题之同一数据产生两次磁盘IO如何解决
Redis AOF重写问题之同一数据产生两次磁盘IO如何解决
Redis AOF重写问题之同一数据产生两次磁盘IO如何解决
|
6月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
【6月更文挑战第26天】Java IO流涵盖字节流与字符流。字节流(InputStream/OutputStream)处理数据单位为字节,适用于二进制和文本,而字符流(Reader/Writer)专注于文本,处理单位为字符,处理编码转换。字符流在字节流基础上添加编码处理,以装饰器模式实现。文件复制示例展示了两者区别:字节流直接复制所有数据,字符流处理字符编码。理解并选择适当流类型对优化程序至关重要。
138 0
|
7月前
|
存储 缓存 Java
【Java IO系列】那字节流和字符流有什么区别?
而如果使用缓存流,一次性从文件里读取多个字节到缓存中,可以减少系统调用同时也减少了磁盘读取,提高了读取的效率。所以字符流是一个很方便的流了,没有必要把一个方便的流转换成一个不方便的流。,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。从输入流读取下一个数据字节,值字节以0到255范围内的。好的面试官,Java IO有两个参与对象,一个是。,这个基类提供了3个方法可以来读取字节流。,同样是提供了3个方法来支持字符流读取。好的,有这些不同之处,主要是3个方面。是这样的,虽然字节流比字符流的。
103 1
【Java IO系列】那字节流和字符流有什么区别?
|
7月前
|
数据采集 存储 Java
JAVA BIO 字节流和字符流区别
【1月更文挑战第1天】JAVA BIO 字节流和字符流区别
|
7月前
|
Java
IO流Java字节流和字符流的区别是什么?
IO流Java字节流和字符流的区别是什么?
68 0