4.11学习总结

一.IO流

一.java中IO的初步了解

(一).概念:

Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。

(二).java IO流的框架图

(三).流的分类:

1.按方向分:

  • 输入流:用来读 in
  • 输出流:用来写 out

2.按一次读取的字节数分:

  • InputStream outputStream
  • Reader Writer
  • 字节流一次读取1个字节 byte 字符流一次读取多个字符
  • 字节流:数据流中最小的数据单元是字节
  • 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节(无论中文还是英文都是两个字节)。

3.按功能分:

  • 节点流:可以从或向一个特定的地方(节点)读写数据,直接连接数据源。如最常见的是文件的FileReader,还可以是数组、管道、字符串,关键字分别为ByteArray/CharArray,Piped,String。.
  • 处理流(包装流):并不直接连接数据源,是对一个已存在的流的连接和封装,是一种典型的装饰器设计模式,使用处理流主要是为了更方便的执行输入输出工作,如PrintStream,输出功能很强大,又如BufferedReader提供缓存机制,推荐输出时都使用处理流包装。

 二.常用的IO流类(部分)

1.InputStream和Reader

InputStream 是字节流输入对象抽象类,它实现了从字节输入流中读取数据的方法。开发人员可以使用子类实现该接口,从而通过该对象获取到 InputStream 中的数据。在输入过程中,系统会将字节编码为字符。此外,InputStream 也提供了诸如关闭流、清空数据缓存等常规操作。

Reader 是用于读取字符流的抽象类,它的子类实现了具体的字符输入流。默认情况下,Reader 所使用的字符编码与平台默认的字符编码相同。因此,在不指定编码的情况下,Reader 将使用操作系统的默认字符编码来读取字符流。

 

实例:

public class io {
    public static void main(String[] args) throws IOException {
        FileInputStream file =new FileInputStream("study1\\text1");
        byte[]arr=new byte[1024];
        int len;
        while((len=file.read())!=-1){
            String str= new String(arr,0,len);
            System.out.println(str);
        }
    }
}
public class IO5 {
    public static void main(String[] args) throws IOException {

        //1.创建对象
        FileReader fr=new FileReader("Study1\\text1");
        //2.读取数据
        //read()底层上也是字节流,但是他是字节流+字节集,遇到汉字就读取多个字节
        int r;
        /*while((r=fr.read())!=-1){
            System.out.print(r);//解码后以十进制形式保cun
        }*/
        while((r=fr.read())!=-1){
            System.out.print((char)r);//解码后以十进制形式保cun
        }
        //3.释放资源
        fr.close();
    }
}

2.OutputStream和Writer

OutputStream 是用于写入字节流的抽象类,它的子类实现了具体的字节输出流。

Writer是用于写入字符流的抽象类,它的子类实现了具体的字符输出流。

 

 

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

        //1.创建字节输出对象
        //参数是字符串表示的路径或者File对象都可以
        //如果文件不存在会创建一个新文件,但要保证父级路径是存在的
        //如果文件已经存在,则会清空文件
        FileOutputStream fos=new FileOutputStream("Study1\\text1");
        //2.写出数据
        //write方法的参数是整数,但是实际上写到本地文件中是以ASCLL对于的字符输出
        fos.write(97);
        byte[]arr={97,98,99,100};
        fos.write(arr);
        //释放资源
        //每次使用完六后都要释放资源
        fos.close();
    }
}
public class WriteFileExample {

    public static void main(String[] args) {
        String content = "这是要写入文件的内容";
        try (Writer writer = new FileWriter("example.txt")) {
            writer.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.BufferReader和BufferWriter

BufferedReader 继承自 Reader 类,它的作用是从输入流中读取文本数据,并缓冲各个字符,以提供字符、数组和行的高效读取。

BufferedWriter 继承自 Writer 类,它的作用是向输出流中写入字符数据,并缓冲各个字符,以提高写入性能。

这两个类的主要优势在于减少了对底层数据源(例如文件、网络连接等)的直接读写次数,而是将数据先暂存在内存缓冲区中,减少了 I/O 操作的频率,从而提高了读写性能。因此,在需要频繁读写大量数据时,使用 BufferedReader 和 BufferedWriter 可以提高程序的效率。

 

public class IO6 {
    public static void main(String[] args) throws IOException {
        /*
         * 缓冲流:4个
         * 字符缓冲流和字节缓冲流
         *
         * */

        //1.创建对象
        File root=new File("study1\\text1");
        File get=new File("study1\\text2");
        read(root);
        Write(get);
    }

    private static void Write(File get) throws IOException {
        BufferedWriter bw=new BufferedWriter(new FileWriter(get));
        String str1="好好学习";
        String str2="天天向上";
        bw.write(str1);
        bw.newLine();
        bw.write(str2);
        bw.newLine();
        bw.close();
    }

    private static void read(File root) throws IOException {
        BufferedReader br=new BufferedReader(new FileReader(root));
        String line;
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
        br.close();
    }
}

 

4.InputStreamReader和OutputStreamWriter

InputStreamReader:把字节输入流转换为字符输入流.

OutputStreamWriter:把字节输出流转换为字符输出流


        //1、创建源和目标
        File srcFile = new File("io"+File.separator+"a.txt");
        File descFile = new File("io"+File.separator+"b.txt");
        //2、创建字节输入输出流对象
        InputStream in = new FileInputStream(srcFile);
        OutputStream out = new FileOutputStream(descFile);
        //3、创建转换输入输出对象
        Reader rd = new InputStreamReader(in);
        Writer wt = new OutputStreamWriter(out);
        //3、读取和写入操作
        char[] buffer = new char[10];//创建一个容量为 10 的字符数组,存储已经读取的数据
        int len = -1;//表示已经读取了多少个字符,如果是 -1,表示已经读取到文件的末尾
        while((len=rd.read(buffer))!=-1){
            wt.write(buffer, 0, len);
        }
        //4、关闭流资源
        rd.close();
        wt.close();

三.操作 IO 流的模板

①、创建源或目标对象

输入:把文件中的数据流向到程序中,此时文件是 源,程序是目标

输出:把程序中的数据流向到文件中,此时文件是目标,程序是源

②、创建 IO 流对象

输入:创建输入流对象

输出:创建输出流对象

③、具体的 IO 操作

④、关闭资源

输入:输入流的 close() 方法

输出:输出流的 close() 方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值