Java IO流补充(字符流)

news2024/11/26 14:47:49

字符

        那么在Java中的字符用char来表示,char存储字符。Java使用Unicode来表示字符。Unicode可以表示在所有人类语言中找到的所有字符。Java char是16位类型

字符的范围是 0 ~ 65536 ,没有负字符。字符可以是文字、字母数字、符号等等。

字符流

尽管Java中字节流的功能十分强大,几乎可以直接或间接地处理任何类型的输入/输出操作,但利用它却不能直接操作 16 位的 Unicode 字符。这就要用到字符流。其实字节流和字符流的方法大致一样,区别在于使用字节流时,每个文字或者是字母看作是一个字节,但是在字节流中,文字占三个字节。

输入流——Reader

Reader 是Java的IO库提供的另一个输入流接口。 和 InputStream 的区别是, InputStream 是一个字节流,即以 byte 为单位读取,而 Reader 是一个字符流,即以 char 为单位读取

Reader结构图如下

FileReader

Reader使用时需要用其子类FileReader类来创建对象

File f1 = new File("D:/a.txt"); 
Reader in = new FileReader(f1);

这个时候就可以使用字符流的方法read方法来对文件进行读操作

那么既然是读操作,我们要先从内存找磁盘的某个文件是否存在才能进行读取

那么我们就事先在D盘创建一个a.txt文件,并且往里面添加点文字内容

 那我们在Java中用read方法就可以读取里面的字符

        //文件对象
        File f1 = new File("D:/a.txt");
        //创建Reader对象
        Reader in = new FileReader(f1);        
        //读操作
        int read = in.read();//读取第一个汉字的Unicode值
        System.out.println((char)read);//将值强转为字符

 如果要读取文件里的全部数据,就需要借助循环完成,代码如下

        //文件对象
        File f1 = new File("D:/a.txt");
        //创建Reader对象
        Reader in = new FileReader(f1);
        //读操作
        int n;
        while ((n=in.read()) != -1){
            System.out.print((char)n);//将值强转为字符
        }

 以上就可以完成文件的全字符获取,但是有个小问题,一个一个字符循环获取字符相对计较慢,我们还可以使用我们自定意缓冲区来进行性能的增强,代码如下

package IO;

import java.io.*;

public class Test01{
    public static void main(String[] args) throws IOException {
        //文件对象
        File f1 = new File("D:/a.txt");
        //创建Reader对象
        Reader in = new FileReader(f1);
        //读操作
        //自定义每次最大读10个字符的缓冲区
        char[] chars = new char[10];
        //c初始化
        int n;
        //判断后值是否为-1,如果为-1则没有值
        while ((n=in.read(chars)) != -1){//将chars数组传进read方法里,使每次读10个字符的存放入chars数组
            //使用String类将chars数组中有效个字符转化成字符串,并打印
            String s = new String(chars,0,n);
            System.out.print(s);
        }
    }
}

当然了,Java中也就给我们定义好的缓冲区

package IO;

import java.io.*;

public class Test02 {
    public static void main(String[] args) throws IOException {
        //文件对象
        File f1 = new File("D:/a.txt");
        //创建Reader对象
        Reader in = new FileReader(f1);
        //读操作
        //BufferedReader缓冲区,传入Reader对象
        BufferedReader b = new BufferedReader(in);
        //n初始化
        int n;
        //判断后值是否为-1,如果为-1则没有值
        while ((n=b.read()) != -1){
            System.out.print((char)n);
        }
    }
}

 最后是一些Reader常用方法供参考

方法摘要
abstract  voidclose()
          关闭该流并释放与之关联的所有资源。
 voidmark(int readAheadLimit)
          标记流中的当前位置。
 booleanmarkSupported()
          判断此流是否支持 mark() 操作。
 intread()
          读取单个字符。
 intread(char[] cbuf)
          将字符读入数组。
abstract  intread(char[] cbuf, int off, int len)
          将字符读入数组的某一部分。
 intread(CharBuffer target)
          试图将字符读入指定的字符缓冲区。
 booleanready()
          判断是否准备读取此流。
 voidreset()
          重置该流。
 longskip(long n)
          跳过字符。

输出流——Writer

Writer是Java的IO库提供的另一个输出流接口,和 OutputStream 的区别是, OutputStream 是一个字节流,即以 byte 为单位读取,而 Writer是一个字符流,即以 char 为单位读取结构图如下:

 FileWriter的使用

FileWriter是Writer的子类,用来完成Writer对象的创建

        //文件对象
        File f1 = new File("D:/a.txt");
        //创建Writer对象
        Writer out = new FileWriter(f1);

 下一步,我们可以用write方法来对文件进行插入数据

        //文件对象
        File f1 = new File("D:/a.txt");
        //创建Writer对象
        Writer out = new FileWriter(f1);
        //写入数据
        out.write("你好,我是蔡徐坤");
        //刷新(如不刷新相当于没有保存)
        out.flush();

 其他的方法我放在下面,可以参考使用

方法摘要
 Writerappend(char c)
          将指定字符添加到此 writer。
 Writerappend(CharSequence csq)
          将指定字符序列添加到此 writer。
 Writerappend(CharSequence csq, int start, int end)
          将指定字符序列的子序列添加到此 writer.Appendable。
abstract  voidclose()
          关闭此流,但要先刷新它。
abstract  voidflush()
          刷新该流的缓冲。
 voidwrite(char[] cbuf)
          写入字符数组。
abstract  voidwrite(char[] cbuf, int off, int len)
          写入字符数组的某一部分。
 voidwrite(int c)
          写入单个字符。
 voidwrite(String str)
          写入字符串。
 voidwrite(String str, int off, int len)
          写入字符串的某一部分。

综合案例

对含有汉字的文件完成复制操作

package IO;

import java.io.*;

public class Test03 {
    public static void main(String[] args) throws IOException {
         //创建复制和目标文件对象
        File f1 = new File("D:/a.txt");
        File f2 = new File("D:/b.txt");
        //创建读对象
        Reader in = new FileReader(f1);
        //创建写对象
        Writer out = new FileWriter(f2);
        //缓冲区
        char[] chars = new char[10];
        //初始化
        int n;
        //读取数据
        while ((n=in.read(chars)) !=-1){
            //数据的写入
            out.write(chars,0,n);
        }
        //资源释放
        out.close();
        in.close();
    }
}

结果如下:

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

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

相关文章

【Spring】——17、@Resource注解和@Inject注解?

📫作者简介:zhz小白 公众号:小白的Java进阶之路 专业技能: 1、Java基础,并精通多线程的开发,熟悉JVM原理 2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线…

使用 systemd 管理多个 MySQL 服务器实例

使用 systemd 管理多个 MySQL 服务器实例 文章目录使用 systemd 管理多个 MySQL 服务器实例先决条件支持 systemd 的操作系统每个实例配置独立的目录和参数部署多实例环境1. 配置选项文件使用 systemd 管理 MySQL 多实例总结本文仅讲述使用 RPM 包安装的多个 MySQL 实例如何使用…

IronXL 2022.12.10926 Crack

关于适用于 .NET 的 IronXL 在 C# 中阅读和编辑 Excel 电子表格,无需 MS Office 或 Excel Interop。 IronXL for .NET 允许开发人员在 .NET 应用程序和网站中读取、生成和编辑 Excel(和其他电子表格文件)。您可以读取和编辑 XLS/XLSX/CSV/TSV…

操作系统-内存管理(内存的分配与回收(非连续分配方式,基本分页存储管理方式,基本地址变换机构))

文章目录1. 基本分页存储管理基本地址变换机构1. 基本分页存储管理 分页存储: 将内存空间分为一个个大小相等的分区(eg:每个分区4KB),每个分区就是一个页框 每个页框有一个编号,即页框号,页框…

C++ 重要笔记与题 (循环-嵌套-数组)

文章目录十 循环10.1 字符与循环10.2 数与循环十一 循环嵌套——不拘一格11.2数学与循环——脉脉相通十 循环 10.1 字符与循环 题1.1&#xff1a;循环输出26个字母&#xff0c;从A-Z。 for(char i A;i<Z;i){cout<<i<<" ";}题1.2&#xff1a;输入某…

第二证券|定增市场回暖 机构争抢优质项目

今年下半年以来&#xff0c;定增商场持续回暖。最新数据显现&#xff0c;到12月13日&#xff0c;下半年以来A股商场实施定增计划的上市公司近200家&#xff0c;比较上半年的133家显着增加。持续回暖的定增商场吸引了不少组织的目光&#xff0c;不只百亿级私募活跃捡拾筹码&…

大学生个人博客网页设计模板 学生个人博客网页成品 简单个人网站作品下载 静态HTML CSS个人网页作业源代码

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

[附源码]Python计算机毕业设计SSM基于java网上心理咨询系统数据分析(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

docke+gitlab+jenkins+springboot

安装Gitlab 开放防火墙端口80和配置映射文件夹 firewall-cmd --zonepublic --add-port80/tcp --permanent firewall-cmd --reload mkdir -p /docker_data/gitlab/{data,logs,config}启动Gitlab容器&#xff08;启动容器之前确保80&#xff0c;443端口没用被占用&#xff0c;被…

通话类型转换流程之AudioCall到VideoCall

目录 概述时序图关键代码关键log总结 一、概述 这里的通话类型指的是语音通话和视频通话&#xff0c;转换包括upgrade/ downgrade升降级&#xff0c;就是语音通话升级为视频通话、视频通话降级为语音通话。升级为视频通话一般就是包括如下图示的4步&#xff0c;MO发起请求&…

Microsoft SharePoint Online 更新功能可能是下一次勒索攻击的目标

Microsoft SharePoint Online是被使用最广泛的内容管理平台之一。但令人担忧的是&#xff0c;最近几年我们发现大部分攻击者可以滥用 SharePoint Online 和 OneDrive for Business 中的某项功能来加密您的所有文件并以此来勒索赎金。 SharePoint Online 据观察发现可能存在潜在…

四旋翼无人机学习第15节--PCB Editor简单绘制封装-手动绘制封装

文章目录1 前言2 class与sub class3 手动绘制3.1 芯片手册分析3.2 手动绘制1 前言 上一篇博客我们学习了获取封装的几种途径&#xff0c;分别是下载&#xff0c;软件生成与软件转化。本次博客开始讲手动绘制封装。 2 class与sub class 参考博客&#xff1a;第11讲、Allegro …

前端高频手写面试题集锦

手写深度比较isEqual 思路&#xff1a;深度比较两个对象&#xff0c;就是要深度比较对象的每一个元素。> 递归 递归退出条件&#xff1a; 被比较的是两个值类型变量&#xff0c;直接用“”判断被比较的两个变量之一为null&#xff0c;直接判断另一个元素是否也为null 提前结…

对受控组件和非受控组件的理解,以及应用场景?

一、受控组件 受控组件&#xff0c;简单来讲&#xff0c;就是受我们控制的组件&#xff0c;组件的状态全程响应外部数据 举个简单的例子&#xff1a; class TestComponent extends React.Component {constructor (props) {super(props);this.state { username: lindaidai }…

从事生活垃圾(含粪便)经营性清扫、收集、运输服务许可证

《城市生活垃圾管理办法》&#xff08;2007年4月28日建设部令第157号公布2015年5月4日修正本&#xff09;第十七条从事城市生活垃圾经营性清扫、收集、运输的企业&#xff0c;应当取得城市生活垃圾经营性清扫、收集、运输服务许可证。 未取得城市生活垃圾经营性清扫、收集、运输…

安卓玩机搞机技巧综合资源-----查看手机硬件全部参数 隐藏参数 多个软件【十七】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

绿色消费积分,共建开放生态,让消费变投资

随着市场的逐渐饱和&#xff0c;不断推出新产品、开拓推广渠道、增加客户量是商家想要实现可持续发展的生存之道。商家为了刺激消费&#xff0c;可以说是无所不用&#xff0c;但还是面临着缺少新用户&#xff0c;推广难&#xff0c;客户活跃度低&#xff0c;复购率低等痛点。 商…

7个用Python就可以搞副业的方法

抢茅台 全民开抢1499元的茅台&#xff0c;你抢到过吗&#xff1f;我表弟去年开始到现在抢到30瓶&#xff0c;一瓶轻松赚1000元。 没想到表弟私信我说&#xff0c;他的茅台都是用软件抢的。 Python是啥&#xff1f;我是2G网了吗&#xff0c;还有这么好用的工具&#xff01;&…

如何把自定义的函数,记录到你的Airtest报告里

1. 前言 熟悉Airtest的同学都知道&#xff0c;像touch、swipe这类核心API&#xff0c;运行之后&#xff0c;都会在Airtest报告里记录一个步骤&#xff1a; 但有很多情况下&#xff0c;我们可能会使用自定义的函数&#xff0c;这种自定义的函数&#xff0c;就不会被记录到我们的…