Java 进阶IO流(二)

简介: Java 进阶IO流

一、字符流

1、FileReader文件字符写入流

把磁盘中的数据以字符的形式读入到内存中

构造器 解释

public FileReader(File file) 创建字符输入流管道与源文件对象接通

public FileReader(String pathname) 创建字符输入流管道与源文件路径接通

方法名 解释

public int read() 每次读取一个字符,没有字符返回-1

public int read(char[] buffer) 每次读取一个字符数组,没有字符返回-1

2fad2b9e80bfe0d28f152fb7ca54ca4.png

import java.io.FileReader;
import java.io.IOException;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        int read = 0;
        //创建一个读入数据的相对路径的流
        FileReader fileReader = new FileReader("data/access.log");
        //直接读取字符输出
//        while((read = fileReader.read()) != -1){
//            System.out.printf("%c",read);
//        }
        //根据数组存储要求输出
        char[] by = new char[8];
        while((read = fileReader.read(by)) != -1){
            System.out.println(by);
        }
        //关闭读入流
        fileReader.close();
    }
}

2、FIleWriter文件字符输出流

把内存中的数据以字符的形式写出到磁盘中

构造器

构造器 解释

public FileWriter(File file) 创建字符输出流管道与源文件对象接通

public FileWriter(File file,boolean append) 创建字符输出流管道与源文件对象接通,

可追加数据

public FileWriter(String filepath) 创建字符输出流管道与源文件路径接通

public FileWriter(String filepath,boolean append) 创建字符输出流管道与源文件路径接通,

可追加数据

常用方法

方法名 解释

void write(int c) 写一个字符

void write(char[] cbuf) 写入一个字符数组

void write(char[] cbuf, int off, int len) 写入字符数组的一部分

void write(String str) 写一个字符串

void write(String str, int off, int len) 写一个字符串的一部分

flush() 刷新流,可以继续写数据

close() 关闭流,释放资源,但是在关闭之前会先刷新流;

一旦关闭,就不能再写数据

e5cec3f86ea14d9d77c798a0f48dc44.png

import java.io.*;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        int read = 0;
        //创建一个读入数据的相对路径的流
        FileReader fileReader = new FileReader("data/access.log");
        FileWriter fileWriter = new FileWriter("data/access1.log");
        //直接读取字符输出
        while((read = fileReader.read()) != -1){
            fileWriter.write(read);
        }
        //根据数组存储要求输出
        char[] ch = new char[8];
        while ((read = fileReader.read(ch)) != -1) {
            fileWriter.write(new String(ch, 0, read));
        }
        System.out.println("复制OK");
        fileWriter.flush();
        //关闭读入流
        fileReader.close();
        //关闭写出
        fileWriter.close();
    }
}

场景

字节流适合做文件数据的拷贝(音视频,文本)

字节流不适合读取中文内容输出

字符流适合做文本文件的操作(读,写)

二、缓冲流

1、概念

缓冲流是高效流或者高级流,前面学习的字节流算原始流

作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写性能

2、优化原理

字节缓冲输入流默认有8KB缓冲池,直接从缓冲池读取数据,性能较好。

字节缓冲输入流默认有8KB缓冲池,数据直接写入缓冲池中,提高写数据性能

3、体系图

057d718153d634179bb7c0031bbc2a2.png

4、字节缓冲流

1)BufferedInputStream字节缓冲输入流

提高字节输入流读取数据的性能

2)BufferedOutputStream字节缓存输出流

提高字节输出流读取数据的性能

构造器 解释

public BufferedInputStream(InputStream is) 创建一个新的缓冲输入流

public BufferedOutputStream(OutputStream os) 创建一个新的缓冲输出流

9f87b09fd307e10d4e5ad3ecfc57157.png

import java.io.*;
import java.nio.charset.StandardCharsets;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        int read = 0;
        //创建一个读入数据的相对路径的流
        InputStream inputStream = new FileInputStream("data/access.log");
        //创建带有缓存的输入流
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        //创建一个数组
        byte[] by = new byte[1024];
        //判断是否还有数据
        while ((read = bis.read(by)) != -1) {
            //转换字符串
            String str = new String(by, 0, read);
            System.out.println(str);
        }
        //关闭写出
        bis.close();
        //关闭读入流
        inputStream.close();
        //创建一个输出数据的相对路径的流
        OutputStream outputStream = new FileOutputStream("data/access1.log");
        //创建带有缓存的输出流
        BufferedOutputStream bos = new BufferedOutputStream(outputStream);
        //直接写入内容,设置编码格式
        bos.write("helloworld".getBytes(StandardCharsets.UTF_8));
        bos.close();
        outputStream.close();
    }
}

5、字符缓冲流

1)BufferedReader字符缓冲输入流

提高字符输入流读取数据的性能,可以按行读取数据

构造器 解释

public BufferedReader(Reader r) 创建一个新的字符缓冲输入流

方法 解释

public String readLine() 读取一行数据,没有数据返回null

2)BufferedWriter字符缓冲输出流

提高字符输出流写取数据的性能,可以换行

构造器 解释

public BufferedWriter(Writer w) 写入一行数据

方法 解释

public void newLine() 换行

f33fffe4177def8d8c0842e156e4fd2.png

import java.io.*;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        String msg = null;
        //创建一个字符输入流
        FileReader fr = new FileReader("data/access.log");
        //创建一个字符输入缓冲流
        BufferedReader br = new BufferedReader(fr);
        //判断是不是最后一行
        while ((msg = br.readLine()) != null) {
            System.out.println(msg);
        }
        //关闭输入缓冲流
        br.close();
        //创建一个字符输出流
        FileWriter fw = new FileWriter("data/access1.log");
        //创建一个字符输出缓冲流
        BufferedWriter bw = new BufferedWriter(fw);
        //字符写入的内容
        bw.write("china");
        //关闭字符缓冲流
        bw.close();
    }
}

三、转换流

文件和代码编码不一致,会出现乱码

1、InputStreamReader字符输入转换流

把原始的字节流按照指定编码转换成字符输入流

构造器 解释

public InputStreamReader(InputStream is) 字节流按照代码默认编码转换成字符输入流

public InputStreamReader(InputStream is ,String charset) 原始的字节流按照指定编码转换成字符输入流,不会出现乱码

1321866213d922c9b19181a0d2fd611.png

import java.io.*;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        int len = 0;
        //创建一个InputStreamReader对象,FileInputStream构造一个原始的字节流按照指定编码转换成字符输入流
        InputStreamReader gbk = new InputStreamReader(new FileInputStream("data/access1.log"),"GBK");
        //判断是不是最后一行
        while ((len = gbk.read()) != -1) {
            System.out.print((char)len);
        }
        System.out.println();
        //释放资源
        gbk.close();
        InputStreamReader utf = new InputStreamReader(new FileInputStream("data/access1.log"),"utf8");
        while ((len = utf.read()) != -1) {
            System.out.print((char)len);
        }
        utf.close();
    }
}

2、OutputStreamWriter字符输出转换流

把字节输出流按照指定编码转换成字符输出流

构造器 解释

public OutputStreamWriter(OutputStream os) 原始的字节输出流按照代码默认编码转换成字符输出流

public OutputStreamWriter(OutputStream os,String charset) 原始的字节输出流按照指定编码转换成字符输出流,不会出现乱码

0103df09f6d32fe28322aeedf4dfac0.png

import java.io.*;
public class ClassStructure {
    public static void main(String[] args) throws IOException {
        //字节输出流指定编码格式
        OutputStreamWriter gbk = new OutputStreamWriter(new FileOutputStream("data/access1.log"), "GBK");
        //写入内容
        gbk.write("china,我爱你!!!");
        //释放资源
        gbk.close();
        OutputStreamWriter gbk1 = new OutputStreamWriter(new FileOutputStream("data/access2.log"), "utf-8");
        gbk1.write("china,我爱你!!!");
        gbk1.close();
    }
}


相关文章
|
30天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
65 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
32 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
70 1
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
23天前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
39 0
|
2月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
1月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
35 0
|
2月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
3月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
44 2
|
3月前
|
NoSQL Java Redis
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
下一篇
无影云桌面