字符流
- 字符流主要用于操作文字数据
- 数据操作原理
-
Writer
- 是所有输出字符流的父类,是一个抽象类
- 通常使用的子类为:FileWriter
FileWriter
public static void main(String[] args) throws IOException {
/*1、创建一个可以往文件中写入字符数据的字符输出流对象。
2、这个文件可能不存在啊 好吧是Z盘 所以需要抛一个
3、如果文件不存在,则会自动创建。
如果文件存在,则会被覆盖。
如果构造函数中加入true,可以实现对文件进行续写!
*/
FileWriter fw = new FileWriter("ademo.txt");
/*
* 4、调用Writer对象中的write(string)方法,写入数据。
* 5、查看发现没有
* 其实数据写入到临时存储缓冲区中。
* */
fw.write("aaaa");
/*
* 6进行刷新,将数据直接写到目的地中。
*/
//fw.flush();
/*
* 8、
* 关闭由来
* 当我们写入硬盘数据的时候,好比记事本一样,
* 调用的是windows中的资源,
* 所以要把win的资源关掉。要不然,浪费资源。
* 8、关闭流,关闭资源。在关闭前会先调用flush刷新缓冲中的数据到目的地。
* 所以就不用去单独调用flush
*/
fw.close();
/*
* 9、还能继续写么
*/
//fw.write("bbbb");// java.io.IOException: Stream closed
}
Reader
- 是所有输入字符流的父类,是一个抽象类
- 通常使用的子类为:FileReader
读取一个文本文件。将读取到的字符打印到控制台
1、读取 一个
public static void main(String[] args) throws IOException { //1,创建读取字符数据的流对象。 FileReader fr = new FileReader("demo.txt"); //2、用Reader中的read方法读取字符。 int ch = fr.read(); System.out.println((char)ch); int ch1 = fr.read(); System.out.println(ch1); //4、当不存在的时候 返回为-1 int ch2 = fr.read(); System.out.println(ch2); //3、关闭资源 fr.close(); }
改写
public static void main(String[] args) throws IOException { /*1,创建读取字符数据的流对象。 * 在创建读取流对象时,必须要明确被读取的文件。 * 一定要确定该文件是存在的。 * 用一个读取流关联一个已存在文件。 * demo.txt 中有只ab两个字符 */ FileReader fr = new FileReader("demo.txt"); //2、由于读取的数据不断在变化 所以定义一个变量用于接收读取的数据。 int ch = 0; while((ch=fr.read())!=-1){ System.out.println((char)ch); } //3、关闭资源 fr.close(); } 2、读取一组 public static void main(String[] args) throws IOException { /* * demo.txt 中有只abcd四个字符 */ FileReader fr = new FileReader("demo.txt"); /* * 2、使用read(char[])读取文本文件数据。 * 先创建字符数组。 */ char[] buf = new char[2]; int num = fr.read(buf);//将读取到的字符存储到数组中。返回字符数 System.out.println(num+":"+new String(buf,0,num));//数组变成字符串 int num1 = fr.read(buf);//将读取到的字符存储到数组中。 System.out.println(num1+":"+new String(buf,0,num1)); int num2 = fr.read(buf);//不存在 返回的是-1 会出现和之前的重复数据 System.out.println(num2+":"+new String(buf)); //3、关闭资源 fr.close(); }
改写
public static void main(String[] args) throws IOException { /* * demo.txt 中有只ab两个字符 */ FileReader fr = new FileReader("demo.txt"); /* * 2、使用read(char[])读取文本文件数据。 * 先创建字符数组。 * 从0开始读取 到一共的个数 有多少读取多少 * cbuf - 目标缓冲区 * off - 开始存储字符处的偏移量 * len - 要读取的最多字符数 */ char[] buf = new char[1024]; //一般是1024的整数倍即可 int len = 0; while((len=fr.read(buf))!=-1){ System.out.println(new String(buf,0,len)); } //3、关闭资源 fr.close(); }
练习:将c盘的一个文本文件复制到d盘
public class CopyTextTest{
private static final int BUFFER_SIZE = 1024;
/**
* @param args
*/
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("IO流_2.txt");
fw = new FileWriter("copytest_2.txt");
//创建一个临时容器,用于缓存读取到的字符。
char[] buf = new char[BUFFER_SIZE];//这就是缓冲区。
//定义一个变量记录读取到的字符数,(其实就是往数组里装的字符个数 )
int len = 0;
while((len=fr.read(buf))!=-1){
fw.write(buf, 0, len);
}
} catch (Exception e) {
// System.out.println("读写失败");
throw new RuntimeException("读写失败");
}finally{
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}