时隔多久,我又回来写博客了,最近忙于两个课设,五周,搞得头发都不知道掉了多少根了,还没成为程序员就开始掉了,等我成为一名程序员的时候岂不是要秃头了,IT界的人会不会帮我当成大佬了,哈哈哈哈,希望我以后也可以成为一名IT界的大佬,虽然有点不现实,但是梦想还是要有的,万一不经意间就实现了也说不定,加油~


字符流

  当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件

字符输入流[Reader]

  java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入 流的基本共性功能方法

    public void close() :关闭此流并释放与此流相关联的任何系统资源。

    public int read() : 从输入流读取一个字符。

    public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中

FileReader类

  java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

    1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。 idea中UTF-8

    2. 字节缓冲区:一个字节数组,用来临时存储字节数据。

  构造方法:

    FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。

    FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。

读取字符数据:

  1. 读取字符: read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 ,循环读取

 package demosummary.file.filereader;

 import java.io.FileReader;

 public class FileReader_02 {
public static void main(String[] args) throws Exception{
//使用文件名创建流对象
FileReader fr = new FileReader(".\\src\\demosummary\\file\\a.txt");
//定义变量,保存数据
int a;
//循环读取
while ((a = fr.read())!= -1) {
System.out.println((char) a);
}
//释放资源
fr.close();
}
/**
* 输出结果
* 黑
* 马
* 程
* 序
* 员
*/
}

  2. 使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数, 读取到末尾时,返回 -1

 package demosummary.file.filereader;

 import java.io.FileReader;

 public class FileReader_03 {
public static void main(String[] args) throws Exception{
//创建流对象
FileReader fr = new FileReader(".//src//demosummary//file//a.txt");
//定义变量
int len;
//定义字符数组,作为装字符的容器
char[] l = new char[2];
//循环读取
while ((len = fr.read(l)) != -1) {
System.out.println(new String(l, 0, len));
}
fr.close();
}
/**
* 输出结果
* 黑马
* 程序
* 员
*/
}

字符输出流[writer]

  java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节 输出流的基本共性功能方法

    void write(int c) 写入单个字符。

    void write(char[] cbuf) 写入字符数组。

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

    void write(String str) 写入字符串。

    void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个 数。

    void flush() 刷新该流的缓冲。

    void close() 关闭此流,但要先刷新它。

FileWriter类

  java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区

  构造方法

    FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。

    FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称

基本写出数据

  写出字符: write(int b) 方法,每次可以写出一个字符数据

 package demosummary.file.filereader;

 import java.io.FileWriter;

 public class FileReader_04 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//b.txt");
//写入数据
fw.write(97);
fw.write('b');
fw.write('C');
fw.write(30000);
fw.write(40000); //刷新缓冲
fw.flush();
//释放资源
fw.close();
}
/**
* 输出结果
* abC田鱀
*/
}

  注意:

    1. 虽然参数为int类型四个字节,但是只会保留一个字符的信息写出。

    2. 未调用close方法,数据只是保存到了缓冲区,并未写出到文件中。

关闭和刷新

  因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据 的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了。

    flush :刷新缓冲区,流对象可以继续使用。

    close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

 package demosummary.file.filereader;

 import java.io.FileWriter;

 public class FileReader_05 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//c.txt"); //写入数据并刷新
fw.write("刷");
fw.flush();
fw.write("新");
fw.flush(); //写入数据,并关闭
fw.write("关");
fw.close();
fw.write("闭");//报错(流已关闭): Stream closed
fw.close(); //释放资源
fw.close();
}
/**
* 输出结果
* 刷新关
*/
}

  注意:即便是flush方法写出了数据,操作的后还是要调用close方法,释放系统资源。

写出其他数据

  1. 写出字符数组 : write(char[] cbuf) 和 write(char[] cbuf, int off, int len) ,每次可以写出字符数 组中的数据,用法类似FileOutputStream

 package demosummary.file.filereader;

 import java.io.FileWriter;

 public class FileReader_06 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//d.txt"); char[] chars = "黑马程序员".toCharArray(); fw.write(chars);//黑马程序员 fw.write(chars,2,2);//程序
//释放资源
fw.close();
}
/**
* 输出结果
* 黑马程序员
* 程序
*/
}

  2. 写出字符串: write(String str) 和 write(String str, int off, int len) ,每次可以写出字符串中的 数据,更为方便

 package demosummary.file.filereader;

 import java.io.FileWriter;

 public class FileReader_07 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//e.txt"); String string = "传智播客"; fw.write(string);//传智播客 fw.write(string,2,2);//播客
//释放资源
fw.close();
}
/**
* 输出结果
* 传智播客播客
*/
}

  3. 续写和换行:操作类似于FileOutputStream

 package demosummary.file.filereader;

 import java.io.FileWriter;

 public class FileReader_08 {
public static void main(String[] args) throws Exception{
//创建流对象
FileWriter fw = new FileWriter(".//src//demosummary//file//filereader//f.txt"); //写入字符串
fw.write("黑马");
//写入换行
fw.write("\r\n");
//写入字符串
fw.write("程序员");
//释放资源
fw.close();
}
/**
* 输出结果
* 黑马
* 程序员
*/
}

  注意:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流

字符流---Day32的更多相关文章

  1. java 字节流与字符流的区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...

  2. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  3. IO流中将字节流转成字符流的方法

    //字节流--->字符流 1. public class TestIO { public static void main(String[] args) throws IOException { ...

  4. JAVA之IO流(字符流)

    字符流InputStreamReader和OutputStreamWriter是Writer和Read的子类:是字节流通向字符流的桥梁,也就是可以把字节流转化为字符流. InputStreamRead ...

  5. java IO输入输出流中的各种字节流,字符流类

    字节流字节流主要是操作byte类型数据,也byte数组为准,主要操作类就是·字节输出流:OutputStream·字节输入流:InputStream字符流在程序中一个字符等于2个字节,那么java提供 ...

  6. Java字节流和字符流区别

    1.字节流:直接操作文件本身. 2.字符流:通过缓冲区来操作文件. 所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节 ...

  7. 用字符流实现每个文件夹中创建包含所有文件信息的readme.txt

    package com.readme; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; i ...

  8. java IO流 之 字符流

    字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...

  9. [Java IO]03_字符流

    Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ...

随机推荐

  1. python面试的100题(1)

    题目:有一个jsonline格式的文件file.txt大小约为10K def get_lines(): with open('file.txt','rb') as f: return f.readli ...

  2. UNICODE编码UTF-16 中的Endian(FE FF) 和 Little Endian(FF FE)

    从网上找到的两篇不错的文章,由于被网上多处转载,所以不知道源处,未能注明出处,希望作者见谅,如有意见请发信给我,谢谢! 第一篇很清晰. 介绍Unicode之前,首先要讲解一些基础知识.虽然跟Unico ...

  3. Winform遍历窗口的所有控件(几种方式实现)

    本文链接:https://blog.csdn.net/u014453443/article/details/85088733 扣扣技术交流群:460189483 C#遍历窗体所有控件或某类型所有控件 ...

  4. 学会C#可以做什么

    C#基于.NET Framework  和 .NET CORE平台 Client/Server 客户端/服务端 windows桌面应用程序 winform  2D WPF  3D Browser/Se ...

  5. JEECG笔记

    一.修改默认主题 找到SysThemesEnum.java类,路径为:\src\org\jeecgframework\core\enums\SysThemesEnum.java,在toEnum(Str ...

  6. 不会PPT配色没关系,有这些配色网站,也能让你的PPT配色美到极致

    很多小伙伴在做PPT的时候,都会被PPT的配色难倒.看到各种非常好看的颜色总是想要将其用在自己的PPT中,可是却发现,颜色和颜色之间完全不搭,自己的PPT也变得丑到不像样. 别担心,今天将分享几个非常 ...

  7. vscode解决java无法输入(scanner)问题

    vscode解决java无法输入问题 需要先安装java环境,->windows安装java 新建Test.java 输入代码 import java.util.Scanner; public ...

  8. java篇 之 数组

    数组:本身也是对象元素数据类型必须一致,初始值为各种零(跟类型一致),数组中存放 的是对象的引用(地址),对象在其它空间,一旦创建长度不可变,length可以直 接访问 (new的时候才分配空间,创建 ...

  9. JSAJAX请求

    let xmlHttp = new XMLHttpRequest();//创建发送请求的对象     //这是为了兼容IE的获取ajac请求对象的方法     // let getXmlHttpReq ...

  10. Android学习09

    SharedPreferences SharedPreferences,是一种轻量级的数据存储方式,采用Key/value的方式 进行映射,Sp通常用于记录一些参数配置.行为标记等! 1.获得mSha ...