JAVA之浅谈字符流

1:简单介绍

字符流 

1.字符流是什么 

        *字符流是可以直接读写字符的IO流

        *字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.

2. 字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符,写出时还要把字符转回字节.

程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流

读取的时候是按照字符的大小读取的,不会出现半个中文。写出的时候可以直接将字符串写出,不用转换为字节数组。

3. 字符流不可以拷贝非纯文本的文件 

因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去。如果是?,直接写出,这样写出之后的文件就乱了。

 

补充:

4. 使用指定的码表读写字符:

* FileReader是使用默认码表读取文件, 如果需要使用指定码表读取,那么可以使用InputStreamReader(字节流,编码表)

* FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出,那么可以使用OutputStreamWriter(字节流,编码表)

 JAVA之浅谈字符流


5.图解

JAVA之浅谈字符流

JAVA之浅谈字符流

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();


}


}