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和Python在企业中的应用情况
Java和Python在企业中的应用情况
62 7
|
12天前
|
存储 Java 程序员
Java的基础概念一
### Java编程基础简介 #### 一、注释 注释用于解释代码,不会参与编译和运行。Java支持三种注释: - **单行注释**:以 `//` 开头。 - **多行注释**:以 `/* ... */` 包围。 - **文档注释**:通常用于生成开发文档。 #### 二、关键字 关键字是被Java赋予特定含义的英文单词,全部小写,且在代码编辑器中有特殊颜色标记。常用的如 `class` 表示定义一个类。
Java的基础概念一
|
2天前
|
Java 数据安全/隐私保护
Java的基础概念(二)
本文介绍了Java编程语言中的运算符和表达式,涵盖算术运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符等。重点讲解了算术运算符的使用,如加减乘除取余,并强调了整数除法和取余的特殊性。同时,详细说明了隐式转换与强制转换的概念及应用场景,以及字符串和字符的拼接规则。通过多个案例演示了不同运算符的实际应用,包括数值拆分、自增自减、三元表达式的使用等。最后简要提及了运算符的优先级,指出小括号具有最高优先级。
|
13天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
44 2
|
2月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
163 6
|
1月前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
37 2
|
2月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
57 2
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
11天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
13天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。