字符流
字符流其实就是字节流+字符集,他在遇到相关的数据时会转变为相关的字节,例如遇到英文就转变为一个字节,遇到中文转变为三个字节
FileReader(读取数据类)
作用:纯文本文件-------->程序
将纯文本文件里的数据读取到程序中,同样也分为三个步骤
1、创建字符输入流对象
2、读取数据
3、释放资源
在默认的read方法读取数据时读英文时跟字节流一致,一次读一个字节,但是如果读到中文,就会一次读取三个字节,并在读取完之后返回一个整数类型的值,如果想看到源文件中被读取的数据需要对这个返回的整数进行一个数据类型的转换,如果读取完该文件的数据,会返回-1
具体实现代码如下:源文件数据为:
abcdefghibbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb看看我被复制了吗哈
package com.itazhang.Demo1;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamDemo2 {
public static void main(String[] args) throws IOException {
FileReader fr =new FileReader("D:\\11Codingtext\\MyIO\\a.txt");
int read = fr.read();
System.out.println((char) read);
}
}
使用read(char数组)的方式能一次读取数组长度个数据,这样的话在读取的时候,读取出来的数据是直接存储在这个char数组中的,而此时read(char数组)这个方法的返回值是这个数组的长度也是一次能读取的数据个数,在读取完本文件数据之后同样会返回-1。(他与字节流读取不同的地方在于他读取存入的数据是char类型,而字节流读取之后存入的是byte类型)
实现代码如下:具体实现方法与字节流的数组读取类似,只不过字节流的数组读取的数组是byte类型,而下列代码也就是字符流的数组读取的数组类型为char类型
package com.itazhang.Demo1;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamDemo1 {
public static void main(String[] args) throws IOException {
FileReader fr =new FileReader("D:\\11Codingtext\\MyIO\\a.txt");
FileWriter fw =new FileWriter("D:\\11Codingtext\\MyIO\\b.txt");
char[] crr = new char[10];
int temp;
while(true){
temp = fr.read(crr);
if(temp == -1){
break;
}
fw.write(crr,0,temp);
}
fw.close();
fr.close();
}
}
Filewriter(写出数据类)
字节流输出文本文件数据的话是使用 Filewriter进行将数据从程序输出到文件中
作用:程序数据--------->文件
练习
下列为一个文件加字节流实现的小练习,要求将a文件中的数据
4-9-1-7-8-2
按照从小到大的顺序排列并输出到该文件中,具体实现代码如下:
package com.itazhang.Demo1;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringJoiner;
public class ByteStreamExercise1 {
public static void main(String[] args) throws IOException {
FileInputStream fi = new FileInputStream("D:\\11Codingtext\\MyIO\\a.txt");
int temp;
StringBuilder sb =new StringBuilder();
//读取数据
while (true){
temp = fi.read();
if(temp == -1){
break;
}
sb.append((char)temp);
}
fi.close();
//对其进行排序
Integer[] s = Arrays.stream(sb.toString()
.split("-"))
.map(Integer::parseInt)
.sorted()
.toArray(Integer[]::new);
//用Stringjoiner进行将数据排出
StringJoiner sj = new StringJoiner("-");
//这里不是将整个数组转化类型,而是将数组里的每个元素转化类型
for (Integer integer : s) {
sj.add(integer.toString());
}
String str = sj.toString();
FileOutputStream fw = new FileOutputStream("D:\\11Codingtext\\MyIO\\a.txt");
fw.write(str.getBytes(StandardCharsets.UTF_8));
fw.close();
}
}