------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
文件拷贝,从一个地方拷贝到另一个地方
有两种方式
1. 一个一个字符的拷贝。
2. 数组缓冲区拷贝。
package com.lxh.io;
import java.io.*;
public class CopyDemo {
public static void main(String[] args) {
CopyDemo c = new CopyDemo();
c.copyByArray();
}
public void copyByChar() {
FileWriter fw = null;
FileReader fr = null;
try {
// 1.在目标地址创建目标文件
fw = new FileWriter("FileWriterDemo_copy.txt");
// 2.将被拷贝的文件放到流中
fr = new FileReader("D:\\我的文档\\Workspaces\\MyEclipse 8.5\\JavaBasic\\src\\com\\lxh\\io\\FileWriterDemo.java");
// 3.将流中的数据写到目标文件中。
int i = 0 ;
while((i = fr.read()) != -1) { // read返回0-65535
fw.write(i);
}
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void copyByArray() {
FileWriter fw = null;
FileReader fr = null;
try {
// 1.在目标地址创建目标文件
fw = new FileWriter("FileWriterDemo_copy2.txt");
// 2.将被拷贝的文件放到流中
fr = new FileReader("D:\\我的文档\\Workspaces\\MyEclipse 8.5\\JavaBasic\\src\\com\\lxh\\io\\FileWriterDemo.java");
// 3.将流中的数据写到目标文件中。
char[] buf = new char[1024];
int len ;
while((len = fr.read(buf)) != -1) { // read返回0-65535
fw.write(buf, 0, len);
}
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
BufferedWriter
单单使用FileWriter等写入流,读入一个字符,或字符串或字符数组,随即写入磁盘,效率将会比较底下。
BufferdWriter将会封装如FileWriter和OutputStreamWriters。其封装了数组作为缓冲区。另外封装了换行的新行符为newLine()方法。实现跨平台的换行功能。
一般的开发中,都建议使用缓冲区的流。
构造方法:
import java.io.*;
public class BufferdWriterDemo {
public static void main(String[] args) {
FileWriter fw = null;
BufferedWriter bufw = null;
try {
//1.先创建一个刘对象
fw = new FileWriter("BufferdWriterDemo.txt");
//2.使用缓冲区来封装流对象。
bufw = new BufferedWriter(fw);
//3.缓冲区实质是操作流对象读取数据的。
bufw.write("起初,神创造天地!");
//4.BufferedWriter提供newLine()方法换行。
bufw.newLine();
bufw.write("地是...");
bufw.flush();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
} finally {
//5.缓冲区实质是操作流对象,所以调用他的close()方法就能关闭其封装的Writer抽象类的子类的流对象了。
try {
bufw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
BufferedReader
提供了readLine()方法,可以一次读取一行,通过换行的字符’\n’或’\r’确定某一行的终止。返回类型为String。当到底流的末尾时,返回’null’。
import java.io.*;
public class BufferedReaderDemo {
public static void main(String[] args) {
FileReader fr = null;
BufferedReader bufr = null;
try {
fr = new FileReader("BufferdWriterDemo.txt");
bufr = new BufferedReader(fr);
String str = null;
while((str = bufr.readLine()) != null)
// 此处则需要使用println方法了。
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
MyBufferedReader
BufferedReader能够达到缓冲效果,其原理在于使用了数组。其readLine()方法,是调用Reader的read方法。将每一次read方法中返回的int类型转化成char类型存入StringBuilder中。每一行判断是否以’\r\n’结束。返回每一行的内容。