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();
    }
}


相关文章
|
2月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
21天前
|
安全 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版)
|
15天前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
1月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
2月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
28 2
|
2月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
2月前
|
缓存 Java
【IO面试题 一】、介绍一下Java中的IO流
Java中的IO流是对数据输入输出操作的抽象,分为输入流和输出流,字节流和字符流,节点流和处理流,提供了多种类支持不同数据源和操作,如文件流、数组流、管道流、字符串流、缓冲流、转换流、对象流、打印流、推回输入流和数据流等。
【IO面试题 一】、介绍一下Java中的IO流
|
2月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
39 2
|
2月前
|
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 ... 异常
|
3月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
下一篇
无影云桌面