IO流全称为Input、Output流(输入输出流)
流按操作数据分为两种:字节流和字符流
字节流的抽象基类:InputStream、OutputStream
字符流的抽象基类:Reader、Writer
缓冲区BufferedWriter、BufferedReader
其中BufferedWriter有一个方法 newLine() 是换行的意思。与\n换行符不同的是。newLine()方法是跨平台的。而\n换行符只能是Windows系统上有效。在linux系统无效。
而BufferedReader有一个方法readLine()在读取文本文件时,读取一行文本数据。返回String(读取的该行的文本,不包含行终止符)或NULL(说明已经读取到文本结尾)
使用缓冲区对象进行复制文件,如下
public class BufferedCopyTest {
public static void main(String[] args) {
File srcfile = new File("d:\\fengjd\\temp\\writer.txt");
File targetFile = new File("d:\\fengjd\\temp\\taget.txt");
FileReader fr = null;
FileWriter fw = null;
// 缓冲区
BufferedWriter bw = null;
BufferedReader br = null;
try {
fr = new FileReader(srcfile);
fw = new FileWriter(targetFile);
// 用流对象来构造一个缓冲区对象
bw = new BufferedWriter(fw);
br = new BufferedReader(fr);
String tempStr = "";
while((tempStr = br.readLine()) != null){
bw.write(tempStr);
bw.newLine();
bw.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bw!=null){
try {
// 关闭缓冲区方法,实际上关闭的是缓冲区中的流对象
bw.close();
} catch (IOException e) {
System.out.println("写入出异常了..");
e.printStackTrace();
}
}
if(br!=null){
try {
br.close();
} catch (IOException e) {
System.out.println("读取出异常了..");
e.printStackTrace();
}
}
}
}
}
总结:使用缓冲区件和不使用缓冲区复制文本文件的区别
在读取文本时,FileReader的read()方法和BufferedReader的readLine()方法返回的类型不一致
FileReader的read()方法:其实读取文本的时候是一个字符一个字符的读取,并且每读取一个字符,就返回, 如果使用read(char[] temp)方法则是一个读取满一个缓存数组就返回,两个read()方法都是返回读取的个数;此时返回的int类型对应0 到 65535 之间,可转成字符。
而BufferedReader的readLine()方法:读取文本文件时每次读取是读取一行的数据。那么它内部是如何实现的呢?其实在文本文件中,比如a.txt 里面有一行abc123,但存在电脑的硬盘的形式是:abc123\r\n ,但我们无法看到\r\n字符,此是换行符。方法内部实现是每当读取到\r\n就算读取了一行文本,此时返回读取的abc123数据(不包括 \r\n)。
总结:其实readLine() 是在read()方法进行了扩展