JAVA之浅谈字符流
1:简单介绍
字符流
1.字符流是什么
*字符流是可以直接读写字符的IO流
*字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.
2. 字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符,写出时还要把字符转回字节.
程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
读取的时候是按照字符的大小读取的,不会出现半个中文。写出的时候可以直接将字符串写出,不用转换为字节数组。
3. 字符流不可以拷贝非纯文本的文件
因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去。如果是?,直接写出,这样写出之后的文件就乱了。
补充:
4. 使用指定的码表读写字符:
* FileReader是使用默认码表读取文件, 如果需要使用指定码表读取,那么可以使用InputStreamReader(字节流,编码表)
* FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出,那么可以使用OutputStreamWriter(字节流,编码表)
5.图解
2:FileReader和FileWriter操作文件
(1)FileReader
package yu;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
//FileReader
public class Main {
public static void main(String[] args) throws IOException {
//创建一个FileReader对象用来读取文件中的字符
FileReader fr=new FileReader("test.txt");
int n; //定义一个变量用于记录读取的字符
while((n=fr.read())!=-1) { //循环判断是否读取到文件的末尾
System.out.println((char)n);//打印字符
}
fr.close();
}
}
(2)FileWriter
package yu;
import java.io.FileWriter;
import java.io.IOException;
//FileWriter
public class Main {
public static void main(String[] args) throws IOException {
FileWriter fw=new FileWriter("writer.txt");//创建一个的对象用于想文件写入数据
String str="你好,世界";
fw.write(str);//将字符写入文件
fw.write("\r\n");//换行写入
fw.close();
}
}
3:BufferedReader和BufferedWriter字符缓冲流
注意:BufferedReader中有一个重要的方法readLine(),该方法用于一次写入一行文本
package yu;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("src.txt"));//创建一个缓冲对象
BufferedWriter bw=new BufferedWriter(new FileWriter("des.txt"));//创建一个缓冲对象
String str;
while ((str=br.readLine())!=null) {
bw.write(str);
bw.newLine();
}
br.close();
bw.close();
}
}
4:一些练习
Test1: 定义一个集合,向集合中添加一些字符串,然后将集合中的所有字符串内容写到文件中,要求每个字符串占一行。
package henu.rjxy.test1;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public abstract class Test1 {
/*
* 定义一个集合,向集合中添加一些字符串,然后将集合中的所有字符串内容写到文件中,要求每个字符串占一行。
*
* 分析:
* 1, 定义一个集合ArrayList,
* 2. add添加字符串
* 3. 定义字符流缓冲对象 BufferedWriter
* 4. 循环遍历集合写入文件,注意换行
*/
public static void main(String[] args) throws IOException {
ArrayList<String> arrayList=new ArrayList<String>();
arrayList.add("1:你好");
arrayList.add("2:你不好");
arrayList.add("3:你非常不好");
BufferedWriter bw=new BufferedWriter(new FileWriter("test1.txt"));
for (String arr : arrayList) {
bw.write(arr);
bw.newLine();
}
bw.close();
}
}
Test2:将文件中的字符串文本读取到集合当中,并且每一行文本作为集合中的一个元素
package henu.rjxy.test2;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class Test2 {
// 将文件中的字符串文本读取到集合当中,并且每一行文本作为集合中的一个元素
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("test1.txt");
BufferedReader bfr=new BufferedReader(fr);
String line;
ArrayList<String> arrayList =new ArrayList<String>();
while ((line=bfr.readLine())!=null) {
arrayList.add(line);
}
for (String string : arrayList) {
System.out.println(string);
}
}
}
Test3: 将一个文本文档上的文本反转,第一行和倒数第一行交换,第二行和倒数第二行交换
package henu.rjxy.test3;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class Test3 {
/*
* 将一个文本文档上的文本反转,第一行和倒数第一行交换,第二行和倒数第二行交换
*
* 分析:
* 1,创建输入输出流对象
* 2,创建集合对象
* 3,将读到的数据存储在集合中
* 4,倒着遍历集合将数据写到文件上
* 5,关流
*
* 注意事项:
* 流对象尽量晚开早关
*/
public static void main(String[] args) throws IOException {
ArrayList<String > arrayList=new ArrayList<String>();
FileReader fr=new FileReader("test1.txt");
BufferedReader bfr=new BufferedReader(fr);
String line;
FileWriter fw=new FileWriter("test3.txt");
BufferedWriter bfw=new BufferedWriter(fw);
while ((line=bfr.readLine())!=null) {
arrayList.add(line);
}
for (int i = arrayList.size()-1;i>=0; i--) {
String line1=arrayList.get(i);
bfw.write(line1);
bfw.newLine();
}
bfw.close();
bfr.close();
}
}
Test4:获取一个文本上每个字符出现的次数,将结果写在test4.txt上
package henu.rjxy.test4;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.TreeMap;
public class Test4 {
/*
* 获取一个文本上每个字符出现的次数,将结果写在test4.txt上
*
* 分析:
* 1,创建带缓冲的输入流对象
* 2,创建双列集合对象TreeMap
* 3,将读到的字符存储在双列集合中,存储的时候要做判断,如果不包含这个键,就将键和1存储,如果包含这个键,就将该键和值加1存储
* 4,关闭输入流
* 5,创建输出流对象
* 6,遍历集合将集合中的内容写到文件中
* 7,关闭输出流
*/
public static void main(String[] args) throws IOException {
int c;
FileReader fr=new FileReader("test.txt");
BufferedReader br =new BufferedReader(fr);
TreeMap<Character, Integer>hm=new TreeMap<Character, Integer>();
while ((c=br.read())!=-1) {
char ch=(char)c;
if (!hm.containsKey(ch)) {//如果不包含这个键
hm.put(ch,1);
} else {
hm.put(ch, hm.get(ch)+1);
}
}
br.close();
//写入·
FileWriter fw=new FileWriter("test4.txt");
BufferedWriter bw=new BufferedWriter(fw);
for (Character key :hm.keySet()) {
bw.write(key+"="+hm.get(key));
bw.write("\r\n");
}
bw.close();
}
}