在程序中一个字符等于两个字节,那么Java提供了Reader和Writer两个专门操作字符流的类
1.字符输出流Writer
Writer本身是一个字符流的输出类,此类的定义如下:
public abstract class Writer extends Object implements Appendable,Closeable,Flushable
范例:向文件中写入数据
<span style="font-size:18px;">import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class WriterDemo01 {
public static void main(String[] args) throws Exception{
//1.使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt");
//2.通过子类实例化父类对象
Writer out = null;
out = new FileWriter(f);
//3.进行写操作
String str = "Hello Tomcmd!";
out.write(str);
//4.关闭输出流
out.close();
}
}
</span>
使用FileWriter追加文件的内容
public FileWriter(File file,boolean append) throws IOException{}
<span style="font-size:18px;">import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class WriterDemo02 {
public static void main(String[] args) throws Exception{
//1.使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt");
//2.通过子类实例化父类对象
Writer out = null;
out = new FileWriter(f,true);
//3.进行写操作
String str = "\r\nCHENMD";
out.write(str);
//4.关闭输出流
out.close();
}
}
</span>
2.字符输入流
Reader是使用字符的方式从文件中取出数据
public abstract class Reader extends Object implements Readable,Closeable
<span style="font-size:18px;">import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class ReaderDemo01 {
public static void main(String[] args) throws Exception{
//1.使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt");
//2.通过子类实例化父类对象
Reader reader = null;
reader = new FileReader(f);
//3.进行读操作
char[] c = new char[1024];
int len = reader.read(c);
//4.关闭输入流
reader.close();
System.out.println("内容为:"+new String(c,0,len));
}
}
</span>
循环读取:
<span style="font-size:18px;">import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.io.Writer;
public class ReaderDemo02 {
public static void main(String[] args) throws Exception{
//1.使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt");
//2.通过子类实例化父类对象
Reader reader = null;
reader = new FileReader(f);
//3.进行读操作
int len = 0; //记录读取的数据个数
char[] c = new char[1024]; //所有的内容读到此数组中
int temp = 0 ; //接收读到的每一个内容
while((temp = reader.read()) != -1){
c[len] = (char)temp;
len++;
}
//4.关闭输入流
reader.close();
System.out.println("内容为:"+new String(c,0,len));
}
}
</span>
3.字节流与字符流的区别
字节流在操作时本身不会用到缓冲区,是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,下面看两种区别:
<span style="font-size:18px;">import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class OutputStreamDemo{
public static void main(String[] args) throws Exception{
File f = new File("d:" + File.separator + "test.txt");
OutputStream out = null;
out = new FileOutputStream(f);
String str = "Hello World!!!";
byte[] b = str.getBytes();
out.write(b);
}
}
</span>
输出结果:
文件内容变为:Hello World!!!
此时没有关闭字节流操作,但是文件中依然存在了输出的内容,证明字节流是操作文件本身的,下面是用字符流完成,观察效果:
<span style="font-size:18px;">import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class WriterDemo03 {
public static void main(String[] args) throws Exception{
//1.使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt");
//2.通过子类实例化父类对象
Writer out = null;
out = new FileWriter(f,true);
//3.进行写操作
String str = "\r\nCHENMD";
out.write(str);
//4.关闭输出流
//out.close();
}
}
</span>
程序运行结果:
文件内容为:Hello World!!!
也就是说追加的内容并没有加进去,这是因为字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区的内容是无法输出的
所以:字符流使用了缓冲区,而字节流没有使用缓冲区
如果想在不关闭时也将字符流的内容全部输出,可以使用Writer类中的flush()方法完成
4.使用字节流好还是字符流好
字符流,显然是专用来写入字符的字节流,可以写文本文本文件也可以写其他文件如电影文件 ,在开发中,字节流使用较为广泛