Java IO流 - 字符流的使用详细介绍

news2024/9/23 23:28:36

文章目录

    • 字符流的使用
      • 文件字符输入流
        • 创建字符输入流
        • 字符输入流读取
      • 文件字符输出流
        • 创建字符输出流
        • 字符输出流写入

字符流的使用

字节流读取中文输出会存在什么问题?

  • 会乱码。或者内存溢出。

读取中文输出,哪个流更合适,为什么?

  • 字符流更合适,最小单位是按照单个字符读取的。

字符输入输出流的实现类分别是FileReader和FileWriter

在这里插入图片描述

文件字符输入流

创建字符输入流

文件字符输入流:实现类FileReader

作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。

构造器说明
public FileReader(File file)创建字符输入流管道与源文件对象接通
public FileReader(String pathname)创建字符输入流管道与源文件路径接通
public static void main(String[] args) throws Exception {
    // 创建字符输入流管道与源文件对象接通  
    Reader fr = new FileReader(new File("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt"));
}
public static void main(String[] args) throws Exception {
    // 创建字符输入流管道与源文件路径接通  
    Reader fr = new FileReader("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt");
}

字符输入流读取

文件字符流的读取API如下:

方法名称说明
read()每次读取一个字符, 返回读取内容的编号,如果字符已经没有可读的返回-1
read(char[] buffer)每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1

每次读取一个字符: 普通读取 (我们可以发现字符流可以读取中文和英文, 不会出现乱码的问题)

public static void main(String[] args) throws Exception {
    // 创建字符输入流管道与源文件路径接通
    Reader fr = new FileReader("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt");

    // 第一次读取文件 返回的是字符编号
    int code1 = fr.read();
    // 将编号转为字符输出
    System.out.println((char) code1); // 我

    // 第二次读取
    int code2 = fr.read();
    System.out.println((char) code2); // a
}

每次读取一个字符: 循环读取 (每次读取一个字符性能较慢)

public static void main(String[] args) throws Exception {
    // 创建字符输入流管道与源文件路径接通
    Reader fr = new FileReader("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt");

    int code;
    while ((code = fr.read()) != -1) {
        System.out.print((char) code); // 我aa我a
    }
}

每次读取一个字符数组: 循环读取 (*字符流每次读取一个数组在读取中文不乱码的基础上, 提高了读取的性能)

public static void main(String[] args) throws Exception {
    Reader fr = new FileReader("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt");

    // 创建一个字符数组, 1024表示每次读取1k的字符(注意不是1024kb)
    char[] arr = new char[1024];
    // 记录每次读取了多少个字符
    int len;
    while ((len = fr.read(arr)) != -1) {
        // 对读取的字符进行解码
        String res = new String(arr, 0, len);
        System.out.print(res);
    }
}

文件字符输出流

字符输入流相比字节输入流更加适合写入文本

创建字符输出流

构造器说明
public FileWriter(File file)创建字符输出流管道与源文件对象接通
public FileWriter(File file,boolean append)创建字符输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath)创建字符输出流管道与源文件路径接通
public FileWriter(String filepath,boolean append)创建字符输出流管道与源文件路径接通,可追加数据

创建字符输出流

public static void main(String[] args) throws Exception {
    // 创建字符输出流与源文件对象接通
    Writer fw1 = new FileWriter(new File("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt"));
    // 创建字符输出流与源文件路径接通
    Writer fw2 = new FileWriter("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt");
}

创建字符输出流, 并由覆盖文件内容设置为追加文件内容(第二个参数设置为true就不会覆盖文件原来的内容)

public static void main(String[] args) throws Exception {
    // 创建字符输出流与源文件对象接通, 并设置可追加数据xxx
    Writer fw1 = new FileWriter(new File("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt"), true);
    // 创建字符输出流与源文件路径接通, 并设置可追加数据
    Writer fw2 = new FileWriter("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt", true);
}

字符输出流写入

字符输出流写数据出去的API

方法名称说明
write(int c)写一个字符
write(char[] cbuf)写入一个字符数组
write(char[] cbuf, int off, int len)写入字符数组的一部分
write(String str)写一个字符串
write(String str, int off, int len)写一个字符串的一部分
write(int c)写一个字符

与字节输入输出流一样, 字符输出流也有流的刷新与关闭

方法说明
flush()刷新流,还可以继续写数据
close()关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

示例代码:

写入换行同样是\r\n

public static void main(String[] args) throws Exception {
    // 创建字符输入流的追加管道
    Writer fw = new FileWriter("/Users/chenyq/Documents/learn_Java/code/file-io-app/src/test.txt", true);
    // 定义一个字符数组
    char[] arr = {'我', '爱', 'C', 'h', 'i', 'n', 'a'};
    // 定义一个字符串
    String str = "我爱学习Java";

    // 写入一个字符
    fw.write('我');
    fw.write(98);
    // 写入一个字符数组
    fw.write(arr);
    // 写入字符数组的一部分
    fw.write(arr, 1, 3);
    // 写入一个字符串
    fw.write(str);
    // 写入换行
    fw.write("\r\n");
    // 写入一个字符串的一部分
    fw.write(str, 0, 4);

    // 释放资源
    fw.close();
}

字符流字节流总结:

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MAX78000训练自己的神经网络模型

参考: The MAX78000 Microcontroller, Some Coffee, and Artificial Intelligence GitHub - MaximIntegratedAI/ai8x-training: Model Training for ADIs MAX78000 and MAX78002 AI Devices ai8x-synthesis/WSL2.md at develop MaximIntegratedAI/ai8x-synthesi…

移动金融管理系统设计与开发实训(课程设计报告)——基于Android+Django的银行系统部分功能设计与实现

阅读过程中若有不解和需要可私信,乐于解答 项目代码文档都保存着 基于AndroidDjango的银行系统部分功能开发与设计 摘要: 随着信息技术的快速发展以及经济的快速发展,金融界的信息化的进程也在不断推进,信息技术的不断成熟和人…

JavaWeb:EL表达式JSTL标签

1,EL表达式 1.1 概述 EL(全称Expression Language)表达式语言,用于简化JSP页面内的Java代码。 EL表达式的主要作用是 获取数据 。其实就是从域对象中获取数据,然后将数据展示在页面上。 而EL表达式的语法也比较简单…

HR软件七步帮助企业管理员工

对于中小企业(SMB)来说,员工就意味着一切。你的员工几乎掌握着企业的整体增长和发展,他们可以成就企业,但也能破坏企业的发展。为了提高员工效率,中小型企业需要出色的人力资源管理。员工只有在受到重视和培…

【Linux】Linux环境变量的理解

加油布鲁斯,你能行的! 文章目录一、环境变量PATH中的系统默认搜索路径1.将程序安装到/usr/bin目录(不带./运行自己写的程序)2.将程序路径添加到PATH环境变量里面(不带./运行自己写的程序)二、环境变量的深…

PyTorch基础部分——毕设进行时

为了完成毕设准备开始学习PyTorch,第一步到蓝桥云课搜索实验项目,找到了“PyTorch入门与实战(第二版)”,开始边实验边学习(本身有了一点点点点的相关基础了)学习传送门:PyTorch基础入…

SQL WHERE 子句

WHERE 子句用于过滤记录。 SQL WHERE 子句 WHERE 子句用于提取那些满足指定条件的记录。 SQL WHERE 语法 SELECT column1, column2, ... FROM table_name WHERE condition; 参数说明: column1, column2, ...:要选择的字段名称,可以为多个…

06SpringCloudAlibaba负载均衡服务调用-OpenFeign

目录 SpringCloud Feign 查看此博客:005SpringCloud--Feign:负载均衡(基于服务端)_gh_xiaohe的博客-CSDN博客 OpenFegin概述 OpenFeign是什么: OpenFegin能干什么 Feign和OpenFeign两者区别 OpenFeign使用步骤 服务消费者 接口注解 微…

TP相关知识

说明 该文章来源于徒弟lu2ker转载至此处,更多文章可参考:https://github.com/lu2ker/ 文章目录说明PHP中有一些内置类PHP反序列化问题绕过姿势:魔术方法(反序列化如何利用)CMS可能存在的部分逻辑问题$_REQUEST相关安全…

小游戏引擎选型参考指南

写在前面 前面写了几期有关于小游戏的文章,主要从小游戏开发、小游戏运营、小游戏变现等多个角度进行了较为粗略的介绍,很多同学表示对小游戏引擎部分很感兴趣,希望能够有一些更为深入的分析介绍。今天就对目前主流的小游戏引擎进行探讨。 …

Java 并发编程 (二)CountDownLatch和CyclicBarrier的使用

CountDownLatch和CyclicBarrier CountDownLatch 功能介绍 CountDownLatch 是一个同步功能的辅助类 线程计数不为0时呈wait状态如果为0则继续执行。通过await 和 countDown 两个方法来实现等待和继续运行。 作用:一个线程或多个线程等待另一个线程或多个线程完成后…

2003-2021年高铁列车信息

2003-2021年高铁列车信息 1、时间:2003-2021年 2、指标: 列车车次、出发站、出发站所属地级市、出发站所属省份、出发站类型、到达站、到达站所属地级市、到达站所属省份、到达站类型、车型、开车时间、到站时间、运行时间、里程 3、指标说明&#x…

58. 微调(fine-tuning)

前面的一些章节介绍了如何在只有6万张图像的Fashion-MNIST训练数据集上训练模型。 我们还描述了学术界当下使用最广泛的大规模图像数据集ImageNet,它有超过1000万的图像和1000类的物体。 然而,我们平常接触到的数据集的规模通常在这两者之间。 假如我们…

3、基于注解的IoC装配与依赖注入

一、XML开启注解支持 1、添加context名称空间 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context&…

03SpringCloudAlibaba服务注册中心—Zookeeper

目录 注册中心Zookeeper 五步曲&#xff1a; zookeeper服务提供者 1、03-cloud-provider-payment-zookeeper-8004 2、pom.xml 3、改yum 4、主启动 5、业务类 测试1&#xff1a; 测试2&#xff1a; ​ 服务节点是临时节点还是持久节点 粗划分&#xff1a; 细划分&am…

南京晓庄Java期末知识点复习

南京晓庄Java期末知识点复习第一章 Java 语言概述第二章 Java 语法基础标识符基本数据类型**运算符****语句**数组和字符串命令行参数输入输出第三章 类五个基本概念类类的封装类的继承**抽象类**接口关键字常用的工具类第四章 Applet及其应用**Java程序的两种基本形式****Appl…

红队渗透靶场之prime1.0(超详细!)

靶场考察知识 Wordpress WordPress是一个免费的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;可以用来创建和管理网站或博客。它是由PHP语言和MySQL数据库构建的&#xff0c;并且拥有大量的插件和主题&#xff0c;可以让您轻松地自定义网站的外观和功能 Wpscan扫…

引用量超6000的语义分割经典论文DeepLabv3解读

分享语义分割领域的一篇经典论文DeepLabv3&#xff0c;由谷歌发表于CVPR2017。开源代码地址&#xff1a; Tensorflow版本&#xff1a;https://github.com/tensorflow/models/tree/master/research/deeplabPytorch版本&#xff1a;https://github.com/open-mmlab/mmsegmentatio…

【Spring 入门教程3】

Spring_day03 &#x1f308;博客主页&#xff1a;屠一乐的博客 &#x1f4c5; 发文时间&#xff1a;2023.1.3 &#x1f388; 一定存在只有你才能做成的事 &#x1f339; 博主水平有限&#xff0c;如有错误&#xff0c;欢迎指正 欢迎各位&#x1f44d;收藏&#x1f48e;评论✉ …

mysql简介

一.mysql简介 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&a…