1:简单介绍

字符流 

1.字符流是什么 

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

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

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

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

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

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

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


补充:

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

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

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

 

java 字符流追加写入 java中字符流_java



5.图解

java 字符流追加写入 java中字符流_java 字符流追加写入_02




java 字符流追加写入 java中字符流_java_03




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


 }


}