java中的字符流

  • 使用字节流读取中文的时候,如果使用的编码是GBK,则占用2个字节;如果使用UTF-8编码,则占用3个字节,意味着我们读取中文文档的时候如果每次读取1个字节,那么输出的将会是乱码,因为是不完整的中文。

  • 所以为了更好的读取文本文档,java提供了字符流类,以字符为单位读写数据,专门拿来读写文本文档。

  • Java.io.Reader 字符输入流,是字符输入流的最顶层的父类,定义了一些共性方法,是一个抽象类

  • 共性方法:

  1. int read() 读取单个字符并返回
  2. int read(char[] cbuf) 一次读取多个字符,将字符读入数组
  3. void close() 关闭流并且释放相关的资源
  • FileReader 文件字符输入流 ,继承自InputStreamReader类,InputStreamReader类又继承自Reader类,作用是将硬盘文件中的数据以字符的方式读入内存

  • 构造方法:

  1. FileReader(String fileName)
  2. FileReader(File file)
  • 字符输入流的使用步骤:
  1. 创建FileReader对象,构造方法中绑定要读的数据源

  2. 使用FileReader对象中的read方法(继承自父类Reader)读取文件

  3. 释放资源

    java 复制代码
        public static void test1() throws IOException{
            FileReader fr=new FileReader("a.txt");
            int len=0;
            //一次读取多个字符
            char[] cbuf=new char[1024];
            while((len=fr.read(cbuf))!=-1)
            {
                System.out.print(new String(cbuf,0,len));
            }
        }
  • Java.io.writer 字符输出流,是所有字符输出流的父类

  • 共性方法:

  1. void write(int c) 写入单个字符
  2. void write(char[] cbuf) 写入字符数组
  3. abstract void write(char[] cbuf,int off,int len) 写入字符数组的某一部分,off是开始下标,len是字符个数
  4. void flush() 刷新流的缓冲
  5. void close() 关闭流,但是要先刷新
  • Filewriter 文件字符输出流,继承自OutputStreamWriter ,而OutputStreamWriter又继承自Writer,作用是把内存中的字符写入到硬盘文件中。

  • 构造方法:

  1. FileWriter(String fileName ,boolean append) 根据给定的路径创建一个FileWriter对象,apend为是否追加写入的标志
  2. FileWriter(File file, boolean append)根据给定的File对象创建一个FileWriter对象,apend为是否追加写入的标志
  • 字符输出流的使用步骤:
  1. 创建FileWriter对象,构造方法中绑定写入数据的地址

  2. 使用FileWriter中的write方法将字符写入内存缓冲区中

  3. 刷新内存缓冲区将数据写入文件,这里可以使用flush直接刷入,然后再使用close方法关闭流;也可以使用close方法关闭流,关闭流的时候,会自动先调用flush刷入文件。

  4. 使用追加写入的方式

    java 复制代码
        public static void test2() throws IOException{
            FileWriter fw=new FileWriter("a.txt",true);
            fw.write(98);
            //可以先调用flush,再调用close
            //fw.flush();
            //fw.close();
            //也可以直接调用close
            fw.close();
        }
  • 字符输出流写数据的其他方法
  1. void write(char[] cbuf) 写入字符数组

  2. abstract write(char[] cbuf,int off,int len) 写入字符数组的一部分,off是开始索引,len是字符个数

  3. void write(String str) 写入一个字符串

  4. void write(String str,int off,int len) 写入字符数组的一部分,off是开始索引,len是字符个数\

    java 复制代码
        public static void test3() throws IOException{
            FileWriter fw=new FileWriter("a.txt",true);
            char[] cbuf={'a','b','c','d'};
            //写入一个字符串组
            fw.write(cbuf);
            //写入字符数组的一部分
            fw.write(cbuf,0,2);
            //写入一个字符串
            fw.write("hello");
            //写入字符数组的一部分
            fw.write("hello",0,3);
            fw.close();
        }
相关推荐
爱学的小码8 分钟前
JavaEE初阶——多线程3(案例)
java·开发语言·单例模式·java-ee
جيون داد ناالام ميづ8 分钟前
Spring Boot 核心原理(五):配置管理怎么玩?从基础到多环境再到配置中心
java·spring boot·后端
csbysj202018 分钟前
Ruby 面向对象编程深入解析
开发语言
voidmort18 分钟前
web3.py 简介:面向 Python 开发者的以太坊
开发语言·python·web3.py
一 乐34 分钟前
农产品电商|基于SprinBoot+vue的农产品电商系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot
Teacher.chenchong43 分钟前
R语言实现物种分布预测与生态位分析:多元算法实现物种气候生态位动态分析与分布预测,涵盖数据清洗、模型评价到论文写作全流程
开发语言·算法·r语言
烤麻辣烫1 小时前
23种设计模式(新手)-7迪米特原则 合成复用原则
java·开发语言·学习·设计模式·intellij-idea
鹿里噜哩1 小时前
Spring Authorization Server 打造认证中心(一)项目搭建/集成
java·后端·spring
菠菠萝宝1 小时前
【Java手搓RAGFlow】-1- 环境准备
java·开发语言·人工智能·llm·openai·rag
Chan161 小时前
热点数据自动缓存方案:基于京东 Hotkey 实践
java·数据库·redis·mysql·spring·java-ee·intellij-idea