Java——I/O流(二):字符流(概念理解+应用举例)

简介: Java——I/O流(二):字符流(概念理解+应用举例)

1.开篇


承接博主上一篇博文的字节流,在这篇博文中,我主要为大家介绍一下I/O流中的字符流,有关字节流的内容可以参考下面博文的链接:👇👇👇 

https://blog.csdn.net/weixin_43823808/article/details/107443855

 

2.字符流概述


说明:除了字节流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader Writer它们之间的继承体系如下:👇👇👇

 

3.字符流应用举例


3.1 FileReader

import java.io.*;
public class IODemo04 {
  public static void main(String[] args) throws IOException {
    //创建FileReader对象,构造方法中绑定要读取的数据源
    FileReader fr1=new FileReader("E:/Eclipse/Java Project/Love/FOS1.txt");
    int len1=0;
    System.out.print("读取文件FOS1中的内容:");
    while((len1=fr1.read())!=-1) {
      System.out.print((char)len1 + " ");
    }
    fr1.close();//关闭流,释放资源
    System.out.println();
    FileReader fr2=new FileReader("E:/Eclipse/Java Project/Love/FOS2.txt");
    char[] ch1=new char[20];
    int len2=fr2.read(ch1);//将从输入流中读取的所有字符存入字符数组中
    System.out.print("读取文件FOS2中的内容:");
    for(int i=0;i<len2;i++) {//len2为字符数组的长度
      System.out.print(ch1[i] + " ");
    }
    fr2.close();//关闭流,释放资源
    System.out.println();
    FileReader fr3=new FileReader("E:/Eclipse/Java Project/Love/FOS3.txt");
    char[] ch2=new char[20];
    int len3=fr3.read(ch2,1,4);//将从输入流中读取的从第1个字符开始(包括第1个)往后的4个字符存入字符数组中
    System.out.print("读取文件FOS3中的内容:");
    for(int i=1;i<=4;i++) {//1表示从第一个字符开始,4表示一共读取的字符个数
      System.out.print(ch2[i] + " ");
    }
    fr3.close();//关闭流,释放资源
    System.out.println();
  }
}

3.2 FileWriter

import java.io.*;
public class IODemo05 {
  public static void main(String[] args) throws IOException {
    //创建FileWriter对象,构造方法中绑定要写入数据的目的地
    FileWriter fw1=new FileWriter("study1.txt");
    //使用FileWriter中的write()方法把数据写入到内存缓冲区中
    fw1.write("Hello FileWriter!");
    //使用FileWriter中的方法flush,把内存缓冲区中的数据刷新到文件中
    fw1.flush();
    //释放资源(会先把内存冲区中的数据刷新到文件中)
    fw1.close();
    FileWriter fw2=new FileWriter("study2.txt");
    char[] ch1="编程路上的初学者".toCharArray();
    fw2.write(ch1);
    char[] ch2={97,98,99,100,101};
    fw2.write(ch2,1,3);
    fw2.flush();
    fw2.close();
    FileWriter fw3=new FileWriter("study3.txt",true);//续写和换行
    fw3.write("软件设计师");
    fw3.write("\n");
    fw3.write("Java工程师");
    fw3.flush();
    fw3.close();
  }
}

3.3 I/O异常的处理


在之前的程序代码块中,我们都是通过 throws IOException 来将异常抛出。那么,下面我们对I/O异常进行处理:

import java.io.*;
public class IODemo06 {
  public static void main(String[] args) {
    FileWriter fw=null;//创建FileWriter并赋值Null
    try {
      fw=new FileWriter("study4.txt",true);//可以续写和换行
      fw.write("IO流中的字节流");//写入数据
      fw.write("\n");
      fw.write("IO流中的字符流");
      fw.flush();
    }catch (IOException e1) {
      System.out.println(e1.getMessage());//处理异常
    }finally {//无论如何,都会执行finally语句块
      try {
        assert fw!=null;//当且仅当fw!=null的时候
        fw.close();
      }catch (IOException e2) {
        e2.getMessage();//处理异常
      }
    }
  }
}

JDK7后,可以直接在try后创建流对象,而不用写finally语句块,最后也会释放资源(自动释放资源),如下:👇👇👇 

import java.io.*;
public class IODemo07 {
  public static void main(String[] args) {
    try (//可以直接在try语句中创建流对象,自动释放资源
        FileInputStream fis=new FileInputStream("E:/Eclipse/Java Project/Love/集合.jpg");
        FileOutputStream fos=new FileOutputStream("E:/Eclipse/Java Project/Love/集合5.jpg");
      ) {
      int len=0;
      while((len=fis.read())!=-1) {
        fos.write(len);//写入数据,拷贝图片
      }
    }catch(IOException e) {
      System.out.println(e.getMessage());//处理异常
    }
  }
}

3.4 字符缓冲流


说明:使用字符流逐个字符的读写文件也需要频繁的操作文件,效率仍非常低。为此,同字节流操作文件一样,也可以使用提供的字符流缓冲区(类似于字节流缓冲区)和字符缓冲流(类似于字节缓冲流)进行读写操作,来提高执行效率。 

使用:字符流缓冲区需要定义一个字符数组作为字符缓冲区,通过操作字符缓冲区来提高文件读写效率。

          字符缓冲流需要使用 BufferedReader BufferedWriter,其中 BufferedReader 用于对字符输入流进行操作,BufferedWriter 用于对字符输出流进行操作。在 BufferedReader 中有一个 readLine() 方法,用于一次读取一行文本。

import java.io.*;
public class IODemo08 {
  public static void main(String[] args) throws IOException {
    FileReader fr=new FileReader("E:/Eclipse/Java Project/Love/FOS1.txt");
    FileWriter fw=new FileWriter("E:/Eclipse/Java Project/Love/FOS11.txt");
    int len=0;
    char[] buff1=new char[1024];
    while((len=fr.read(buff1))!=-1) {
      fw.write(buff1,0,len);
    }
    fr.close();
    fw.close();
    BufferedReader br=new BufferedReader(new FileReader("E:/Eclipse/Java Project/Love/FOS2.txt"));
    BufferedWriter bw=new BufferedWriter(new FileWriter("E:/Eclipse/Java Project/Love/FOS22.txt"));
    String str=null;
    while((str=br.readLine())!=null) {
      bw.write(str);
      bw.newLine();
    }
    br.close();
    bw.close();
  }
}

相关文章
|
2月前
|
人工智能 算法 Java
Java与AI驱动区块链:构建智能合约与去中心化AI应用
区块链技术和人工智能的融合正在开创去中心化智能应用的新纪元。本文深入探讨如何使用Java构建AI驱动的区块链应用,涵盖智能合约开发、去中心化AI模型训练与推理、数据隐私保护以及通证经济激励等核心主题。我们将完整展示从区块链基础集成、智能合约编写、AI模型上链到去中心化应用(DApp)开发的全流程,为构建下一代可信、透明的智能去中心化系统提供完整技术方案。
293 3
|
2月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
222 4
|
2月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
150 8
|
3月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
586 12
|
3月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
469 1
|
4月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
Java 大视界 -- Java 大数据机器学习模型在自然语言生成中的可控性研究与应用(229)
本文深入探讨Java大数据与机器学习在自然语言生成(NLG)中的可控性研究,分析当前生成模型面临的“失控”挑战,如数据噪声、标注偏差及黑盒模型信任问题,提出Java技术在数据清洗、异构框架融合与生态工具链中的关键作用。通过条件注入、强化学习与模型融合等策略,实现文本生成的精准控制,并结合网易新闻与蚂蚁集团的实战案例,展示Java在提升生成效率与合规性方面的卓越能力,为金融、法律等强监管领域提供技术参考。
|
4月前
|
存储 监控 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在企业生产运营监控与决策支持中的应用(228)
本文探讨了基于 Java 的大数据可视化技术在企业生产运营监控与决策支持中的关键应用。面对数据爆炸、信息孤岛和实时性不足等挑战,Java 通过高效数据采集、清洗与可视化引擎,助力企业构建实时监控与智能决策系统,显著提升运营效率与竞争力。
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
196 1