时隔多久,我又回来写博客了,最近忙于两个课设,五周,搞得头发都不知道掉了多少根了,还没成为程序员就开始掉了,等我成为一名程序员的时候岂不是要秃头了,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. Refusing to install package with name "webpack" under a package

    最近学习webpack 知识时 下载依赖结果报了这个错 查阅资料后发现是 这个name 不能使用所需要安装包的名字! 换为其他之后 再次操作命令 就没问题了

  2. 字符串类型:char,varchar,text,enum,set

    字符串类型 1.char 格式:char (M) 2.varchar 格式:varchar (M) [注意]M表示允许的字符串长度[65535].M表示的是字符数,而不是字节数.但是最大长度的使用是按 ...

  3. 每天进步一点点------SOPC的Avalon-MM IP核(二) AVALON总线的IP核定制

    简介 NIOS II是一个建立在FPGA上的嵌入式软核处理器,除了可以根据需要任意添加已经提供的外设外,用户还可以通过定制用户逻辑外设和定制用户指令来实现各种应用要求.这节我们就来研究如何定制基于Av ...

  4. <好きになるなら> 歌詞

    あー生意気なこと言ったあと 何故かしらぽつんとしてしまう あー偶然のふり待ちぶせた ゴメンネと素直に言えるかな 帰る道はいつもカナリア 変ねこのごろ自分の気持ちがよめない もうじき風の向きが変わりそう ...

  5. +(new Date())

    +(new Date()) 等于 new Date().getTime();展示 1561003191879 毫秒时间戳

  6. Wx-小程序-图片预览、保存

    点击图片预览 长按图片保存 点击按钮保存到手机相册 view: <!--wxml--> <text>点击图片预览.长按保存图片.点击按钮保存到系统相册</text> ...

  7. 唠唠C++二级指针、二维数组、指针数组、数组指针等的区分

    今天看c++primer第六章,有这部分的内容,脑子有点糊涂了,看了几篇博客,自己敲了下,记录一下备忘. 二级指针: int **p; 二维数组: int p[10][10]; char q[10][ ...

  8. 运行composer出现do not run Composer as root/super user!

    curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer composer - ...

  9. Docker容器里配置计划任务 crontab(DaoCloud+Docker +Laravel5)

    最近项目涉及到一个定时任务的功能,所以去这几天研究了一下 crontab 的使用方法,按照网上的相关教程顺利在自己的电脑上成功开启了这个功能 Laravel + crontab 添加 crontab ...

  10. The Preliminary Contest for ICPC Asia Xuzhou 2019 G Colorful String(回文自动机+dfs)

    这题建立一棵回文树,然后用dfs搜索答案,但是有一点需要注意,就是打vis的标记时,如果标记为1,那么在好几个节点都对同一个字符i打过标记,此时的搜索从字符i点回溯,回到它的父亲节点,搜索其它的字符, ...