首页 > 编程语言 >【高级编程】Java IO流(下)字符流 Reader Writer 字节流读取二进制文件

【高级编程】Java IO流(下)字符流 Reader Writer 字节流读取二进制文件

时间:2024-09-11 11:52:34浏览次数:10  
标签:字符 Java String Writer IOException IO new null 读取

文章目录

Reader

Reader 是一个抽象类,用于读取字符流。它是所有字符输入流的基类。Reader 提供了一些基本的方法来读取字符数据

int read() //读取单个字符,并返回一个整数。如果到达流末尾,返回-1
int read(char[] c) //将字符读入数组中,返回实际读取的字符数
read(char[] c,int off,int len)
void close() //关闭流,并释放与流相关的资源

子类 InputStreamReader 常用的构造方法

InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)

FileReader

FileReaderReader 的一个具体实现,用于从文件中读取字符数据。它简单地将文件内容读取为字符流。

FileReader 类是 InputStreamReader 的子类。

构造方法

FileReader(File file) //通过 File 对象创建 FileReader 对象

FileReader(String fileName) //通过文件名创建 FileReader 对象

该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型

System.out.println(System.getProperty("file.encoding"));  
// 获得本地平台的字符编码类型

关系概述

Reader ==> InputStreamReader(字节流InputStream, 编码) ==> FileReader(路径 || File对象)

读取文件

import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.IOException;

public class InputReaderTest {
    public static void main(String[] args) {
        Reader reader = null; // 声明reader变量
        try {
            // 使用正确的文件路径和编码初始化reader
            reader = new InputStreamReader(new FileInputStream("D:\\..."), "GBK");
            // 创建一个缓冲区
            char[] buffer = new char[100];
            // 从文件中读取字符
            int length = reader.read(buffer);
            // 将读取的字符转换为字符串
            String msg = new String(buffer, 0, length);
            // 打印字符串
            System.out.println(msg);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

BufferedReader

BufferedReaderReader 的一个装饰类,它在 Reader 的基础上提供了缓冲功能。缓冲区的存在减少了对底层读取操作的调用次数,从而提高了性能。它提供了额外的方法,如按行读取内容的 readLine() 方法来更方便地读取文本数据。

构造方法

BufferedReader(Reader in) //使用 Reader 对象构造 BufferedReader

子类 BufferedReader 特有的方法

String readLine() //读取一行文本(不包括行结束符),返回一行的内容。如果到达流的末尾,返回 null

读文本文件

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderTest {
    public static void main(String[] args) {
        // 创建读取器和缓冲读取器
        FileReader reader = null;
        BufferedReader br = null;
        try {
            reader = new FileReader("D:\\...");
            br = new BufferedReader(reader);
            String msg = null;
            // 逐行读取文件
            while ((msg = br.readLine()) != null) {
                System.out.println(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (br != null) {
                    br.close();
                }
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

解决读取时中文乱码

// 直接使用 FileReader 读取文件字符,但不指定编码。
FileReader fr = new FileReader("c:\\myDoc\\hello.txt");
BufferedReader br = new BufferedReader(fr); 
// 使用 FileInputStream 读取文件字节,再通过 InputStreamReader 转换为字符流,并指定编码UTF-8
FileInputStream fis = new FileInputStream("c:\\myDoc\\hello.txt");
InputStreamReader fr = new InputStreamReader(fis,"UTF-8"); 
BufferedReader br = new BufferedReader(fr); 

Writer

Writer 是 Java I/O 系统中处理字符流的抽象基类。它定义了写入字符的方法,并且提供了子类实现这些方法的基础。Writer 类的主要方法包括:

write(String str) //写入单个字符
write(String str, int off, int len)
void close() //关闭流,并释放与流相关的系统资源
void flush() //刷新流,确保所有缓冲的数据都被写出

OutputStreamWriterWriter 的一个具体子类,它是一个桥接类,用于将字节流(OutputStream)转换成字符流(Writer)。它将字符数据编码成字节数据,并将其写入底层的字节流。

OutputStreamWriter 常用的构造方法

OutputStreamWriter(OutputStream out) // 使用默认字符编码
OutputStreamWriter(OutputStream out,String charsetName) //使用指定的字符编码

使用示例

public static void main(String[] args) {
    try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("example.txt"), "UTF-8")) {
        osw.write("Hello, World!");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

FileWriter

FileWriterOutputStreamWriter 的一个子类,用于将字符数据直接写入文件

FileWriter (File file) //将字符写入指定的文件
FileWriter (String fileName) //将字符写入指定的文件(通过文件名)

该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型

public static void main(String[] args) {
    try (FileWriter fw = new FileWriter("example.txt")) {
        fw.write("Hello, FileWriter!");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

关系概述

Writer ==> OutputStreamWriter(字节流OutputStream, 编码) ==> FileWriter(路径 || File对象, 是否追加)

写入文件

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class OutputWriter {
    public static void main(String[] args) {
        Writer writer = null;
        try {
            // 创建 FileWriter 实例,指定文件路径和是否追加
            writer = new FileWriter("D:\\...", true);
            // 写入内容
            writer.write("\n123");
            System.out.println("写入成功!!!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 确保资源被关闭
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

BufferedWriter

BufferedWriterWriter 的一个装饰类,用于在写入字符数据时提供缓冲功能。BufferedWriter 在内部维护一个缓冲区,将数据先写入缓冲区,而不是直接写入目标流,从而减少实际写入操作的次数。

使用 FileWriter 类与 BufferedWriter 类提高字符流写文本文件的效率

构造方法

BufferedWriter(Writer out) //使用指定的 Writer 对象作为基础流

使用 BufferedWriter 写入文件

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class BufferedWriterTest {
    public static void main(String[] args) {
        Writer writer = null;
        BufferedWriter bw = null;
        try {
            // 创建 FileWriter 实例,指定文件路径和是否追加
            writer = new FileWriter("D:\\...", true);
            // 创建 BufferedWriter 实例
            bw = new BufferedWriter(writer);
            // 写入信息到缓冲区
            bw.write("数据结构");
            bw.newLine(); // 换行
            bw.write("软件名词解释");
            bw.newLine(); // 换行
            bw.write("Linux虚拟机安装vmware");
            // 将缓冲区数据刷新到字符流中
            bw.flush();
            System.out.println("写入成功!!!!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 确保资源被关闭
            try {
                if (bw != null) {
                    bw.close();
                }
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

读写二进制文件

流之间的关系概述

读取:InputStream ==> FilelnputStream ==> DatalnputStream(InputStream)

写入:0utputStream ==> FileOutputStream ==> DatalnputStream(OutputStream)

需求说明
使用 DataInputStream DataOutputStream 读写二进制文件 完成复制过程
public class DatastreamTest {
    public static void main(String[] args) {
        DataInputStream dis = null;
        DataOutputStream dos = null;

        try {
            dis = new DataInputStream(new FileInputStream("D:\\star.jpg"));
            dos = new DataOutputStream(new FileOutputStream("D:\\test\\1.jpg"));

            int b = -1;
            while ((b = dis.read()) != -1) {
                dos.write(b);
            }
            System.out.println("复制成功!!!");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (dos != null) dos.close();
                if (dis != null) dis.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

标签:字符,Java,String,Writer,IOException,IO,new,null,读取
From: https://blog.csdn.net/m0_66584716/article/details/142098576

相关文章

  • 【高级编程】认识Java多线程 代码举例三种创建线程的方式
    文章目录主线程创建线程方式1:Thread方式2:Runnable方式3:Callable进程:应用程序的执行实例,有独立的内存空间和系统资源线程:CPU调度和分派的基本单位,进程中执行运算的最小单位,可完成一个独立的顺序控制流程多线程:如果在一个进程中同时运行了多个线程,用来完成不同的工......
  • C# Dictionary(字典)的用法
    要使用Dictionary集合,需要导入C#泛型命名空间!​System.Collections.Generic​(程序集:mscorlib)Dictionary的描述1、从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成2、任何键都必须是唯一的3、键不能为空引用null(VB中的Nothing),若值为引用类......
  • [1059] Operations of None in pandas
    Inpandas,handlingNonevalues(whicharerepresentedasNaNinDataFrames)isacommontask.Herearesomewaystodealwiththem:FilteringRowsFilterRowswithNoneValues:importpandasaspd#SampleDataFramedf=pd.DataFrame({'A......
  • 2025让你爱不释手的iOS设备管理软件iMazing3!
    嘿,各位科技控的小伙伴们!今天给你们带来一款让你爱不释手的iOS设备管理软件——iMazing3!......
  • java常规web面试题考点
    在java的理论知识中,有一个模块作为最基础的组成,但在学习的难度上较大所以往这方面发展的人不多。其实这就是web模块,开发一些软件都离不开web方面的理论支撑。web面试题主要考察一些基础开发的工具的用法和实际代码运用的试题,下面我们来就具体的题目进行作答。1.网络编程首先要......
  • AI绘画:SD打光神器!(Stable Diffusion进阶篇:Imposing Consistent Light)
    前言在上一篇笔记中学习了如何简单地下载以及使用IC-Light,今天的内容会稍微有点不一样。对于学过stablediffusion的小伙伴来说,forgeUI和ComfyUI会更加熟悉一些。在IC-Light发布后,Openposeeditor的开发者将其制作成了一个ForgeUI上的插件。所有的AI设计工具,模型和插......
  • 【JAVA】第五天
    【JAVA】第五天一、Math类二、System类三、Runtime类四、BigDecimal类五、JDK8之前传统的日期、时间(不推荐)1.Date类2.SimpleDateFormat类3.Calendar类六、JDK8之后新增的日期、时间1.LocalDateTime类2.ZoneId类3.ZonedDateTime类4.Instant类5.DateTimeFormatter类6.Peri......
  • [JavaScript] 事件委托以及 Vue 列表循环事件绑定的性能优化
    前言事件委托(EventDelegation)是一种通过将事件监听器绑定到父元素,而不是直接绑定到每个子元素上的技术。这样可以减少事件监听器的数量,提升性能,并使得对动态添加或移除的元素更容易进行事件处理。事件冒泡和事件捕获事件冒泡:从里往外<divid="parent"style="padding:50px;......
  • WebSphere Application Server在centos7下的安装
    需要先下载ibm的官方安装器InstallationManager1.下载InstallationManager1.9.0下载地址:InstallationManagerandPackagingUtilitydownloaddocuments选择1.9.0版本点击下载点击之后往下滑,点击对应版本的FC。勾选第一个,点击继续直接在浏览器下载参考这篇博客,......
  • VMware ESXi 8.0U3 macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server
    VMwareESXi8.0U3macOSUnlocker集成驱动版更新OEMBIOS2.7支持WindowsServer2025VMwareESXi8.0U3macOSUnlocker&OEMBIOS2.7集成网卡驱动和NVMe驱动(集成驱动版)发布ESXi8.0U3集成驱动版,在个人电脑上运行企业级工作负载请访问原文链接:https://sy......