IO-04-字符输入输出流

IO-字符输入输出流

这篇我们将的是字符输入输出流:Reader,Writer

mark

  1. 为什么要使用字符流?

    因为使用字节流操作汉字或者特殊语言符号的时候特别容易乱码,因为汉字不止一个字节,为了解决这个问题,建议使用字符流。

  2. 什么情况下使用字符流?

    一般可以用记事本打开的文件,我们可以看到内容不乱码。就是文本文件,可以使用字符流。而操作二进制文件(比如图片,音频,视频)必须使用字节流。

1. Writer

  • 用于写入字符流的抽象类
1
public abstract class Writer implements Appendable, Closeable, Flushable
  • 方法摘要:

mark

  • 举例介绍:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package FileWriter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class TestWriter {
public static void main(String[] args) throws IOException {
// 1. 创建源
File srcFile = new File("io" + File.separator + "a.txt");

// 2. 创建字符输出流对象
Writer out = new FileWriter(srcFile);

// 3. 具体的IO操作
/***
* void write(int c):向外写出一个字符
* void write(char[] buffer):向外写出多个字符 buffer
* void write(char[] buffer,int off,int len):把 buffer 数组中从索引 off 开始到 len个长度的数据写出去
* void write(String str):向外写出一个字符串
*/

//void write(int c):向外写出一个字符
out.write(65); //将 A 写入 a.txt 文件中

//void write(char[] buffer):向外写出多个字符 buffer
out.write("Aa刷酱酱".toCharArray());

//void write(char[] buffer,int off,int len)
out.write("Aa刷酱酱".toCharArray(),0,2);

//void write(String str):向外写出一个字符串
out.write("Aa刷酱酱");

// 4. 关闭系统资源
/***
* 注意如果这里有一个 缓冲的概念,如果写入文件的数据没有达到缓冲的数组长度,那么数据是不会写入到文件中的
* 解决办法:手动刷新缓冲区 flush()
* 或者直接调用 close() 方法,这个方法会默认刷新缓冲区
*/
out.flush();
out.close();

// AAa刷酱酱AaAa刷酱酱
}
}

2. Reader

  • 用于读取字符流的抽象类。
1
public abstract class Reader implements Readable, Closeable
  • 方法摘要:

mark

  • 下面我们用 字符输入流Reader的 典型实现类FileReader 来介绍这个类的用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package FileReader;

import java.io.*;

public class TestReader {
public static void main(String[] args) throws IOException {
// 1. 创建源
File srcFile = new File("io" + File.separator + "a.txt");

// 2. 创建字符输入流对象
Reader in = new FileReader(srcFile);

// 3. 具体的IO操作
/***
* int read():每次读取一个字符,读到最后返回 -1
* int read(char[] buffer):将字符读进字符数组,返回结果为读取的字符数
* int read(char[] buffer,int off,int len):将读取的字符存储进字符数组 buffer,返回结果为读取的字符数,从索引 off 开始,长度为 len
*
*/

//int read():每次读取一个字符,读到最后返回 -1
int len = -1; //定义当前读取字符的数量
while((len = in.read())!=-1){
// 打印a.txt中的所有内容
System.out.println((char) len);
}

//int read(char[] buffer):将字符读进字符数组
char[] buffer = new char[10];
while ((len=in.read(buffer))!=-1){
System.out.println(new String(buffer,0,len));
}


//int read(char[] buffer,int off,int len)
while ((len=in.read(buffer,0,10))!=-1){
System.out.println(new String(buffer,0,len));
}


// 4. 关闭流资源
in.close();
}
}

3. 用字符流完成文件的复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package FileReader;

import java.io.*;

public class TestCopy {
public static void main(String[] args) throws IOException {
// 1. 创建源和目标
File srcFile = new File("io" + File.separator + "a.txt");
File destFile = new File("io" + File.separator + "b.txt");

// 2. 创建字符输入输出流对象
Reader in = new FileReader(srcFile);
Writer out = new FileWriter(destFile);

// 3. 读取和写入操作
char[] buffer = new char[10]; //创建一个容量是10的数组,用于存储已经读取的数据
int len = -1;
// 读进来
while ((len=in.read(buffer))!=-1){
// 写出去
out.write(buffer,0,len);
}

// 4. 关闭流资源
out.close();
in.close();
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信