字符流
字节流的两个基类 InputSteam OutputStream
字符流的两个基类 Reader Writer
1.字符输出流
FileWriter是字符流基类Writer的子类,用来操作文件中的数据。基本操作如下:
1.创建FileWriter对象,在创建对象时必须明确要操作的文件
该对象会在当前目录下根据传入的文件名创建一个文件,如果目录下已有同名文件,将被覆盖。
FileWriter fw = new FileWriter("demo.txt");
如果当文件已存在,又不想覆盖,而是在文件末尾处追加信息时,可以如下定义:
FileWriter fw = new FileWriter("demo.txt",true);
2.调用write方法,将字符串写入流中。
fw.write("abcde");
3.刷新流对象中的缓冲中的数据。将数据刷到目的地中。
如果刷新之后,此流不再使用,那么可以使用close()代替flush()
fw.flush();
4.关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw.close();
IO异常处理
在使用IO体系中的类的方法时有可能会抛出IO异常,需要捕获并处理异常。
import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
FileWriter fw = null; //在finally语句块中有用到fw对象,所以需要把fw的定义放在try的外面
try
{
fw = new FileWriter("demo.txt");
fw.write("abcdefg");
}
catch (IOException e)
{
System.out.println("catch:"+e.toString());
}
finally
{
try
{
if(fw!=null) //不管发不发生异常,都要执行关闭流的动作,所以把close函数放在finally语句块中
fw.close(); //但如果字符输出流打开时发生异常,也就是输出流打开失败,那么就不用关了
}
catch (IOException e) //close函数也会抛出异常,需要处理
{
System.out.println(e.toString());
}
}
}
}
2.字符输入流
FileReader文件读取流,是字符流Reader的子类。
1.创建文件读取流时,需指定相关联的文件,并且保证文件已存在,如果不存在,会发生FileNotFoundException异常。
FileReader fr = new FileReader("demo.txt");
2.调用读取流对象的read方法读取文件信息,一次读一个字符。
read方法会返回读取的字符的整形表示,当读到文件末尾时会返回-1.
int ch = 0;
while((ch=fr.read())!=-1)
{
System.out.println(ch);
}
3.在文件数据较多的情况下,单个读取字符效率不高,此时需要通过字符数组进行读取
使用read(char[])函数读取一个字符数组的字符,该函数方法读到的字符个数。
char[] buf = new char[1024]; //通常将缓冲数组的大小定义为1024的整数倍
int num = 0;
while((num=fr.read(buf))!=-1)
{
System.out.println(new String(buf,0,num)); //将数组转换成字符串输出
}
4.最后也必须关流。
fr.close();
关于字符输入输出流的一个练习:复制文本文件
复制的原理就是读取一个文件中的数据然后写入另一个文件当中。
代码如下:
import java.io.*;
class CopyText
{
public static void main(String[] args)
{
copy();
}
public static void copy()
{
FileWriter fw = null; //定义读取流与写入流
FileReader fr = null;
try
{
fw = new FileWriter("Demo_copy.txt");
fr = new FileReader("Demo.txt");
char[] buf = new char[1024];
int len = 0;
while((len=fr,read(buf)!=-1)
{
fw.write(buf,0,len); //将读取的字符数组写入到写入流
}
}
catch(IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
if(fr!=null)
try
{
fr.close();
}
catch (IOException e) {}
if(fw!=null)
try
{
fw.close();
}
catch (IOException e){}
}
}
}
字符缓冲流
在创建对象时,必须传入一个字符流
BufferedWriter bufw = new BufferedWriter(new FileWriter(buf.txt));
BufferedWriter字符缓冲流提供了一个换行方法:newLine(); 可以插入一个换行
BufferedReader字符输入缓冲流提供了一个一次读一行的函数:readLine(); 该函数返回读取的字符穿串,结束时返回null
用缓冲流写文本复制文本文件:
package cn.test;
import java.io.*;
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("src\\cn\\test\\Testbean.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("src\\cn\\test\\TestBean-c.java"));
String len = null;
while((len=br.readLine())!=null)
{
bw.write(len);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}