字符流和字节流复制文件的9种方法及测试效率
一、字符流字节流区别:
操作的单位不一样,一个是字节[byte-8bit],一个是字符[变长字节]
操作中文的时候使用字符流更方便 字节流更广泛:文本,视频,音频,图片…
使用缓冲Buffer以后:效率明显提高
二、9种方法
public class java_IO {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
long start=System.currentTimeMillis();//系统当前时间
long end=System.currentTimeMillis();
System.out.println("所用时间:"+(end-start)+"ms");
}
//1.1字符流读写复制文件,每次复制一个字符:-------所用时间:21360ms
public static void copyFileChar(){
System.out.println("请输入你需要拷贝的文件路径:");
String oldPath = sc.next();
System.out.println("请输入你拷贝到的文件路径:");
String newPath = sc.next();
FileReader fileReader = null;
FileWriter fileWriter = null;
try{
fileReader = new FileReader(oldPath);
fileWriter = new FileWriter(newPath);
int red;
while((red = fileReader.read()) != -1){//读取单个字符,-1代表已达到流的末尾
fileWriter.write(red);//写入单个字符
}
System.out.println(oldPath+"文件拷贝完毕!");
fileWriter.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(null != fileReader){
try{
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != fileWriter){
try{
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//2.2字符流读写复制文件,每次复制一个字符数组:----所用时间:10534ms
public static void copyFileReaderArray(){
System.out.println("请输入你需要拷贝的文件路径:");
String oldPath = sc.next();
System.out.println("请输入你拷贝到的文件路径:");
String newPath = sc.next();
FileReader Reader = null;
FileWriter Writer = null;
try{
Reader = new FileReader(oldPath);
Writer = new FileWriter(newPath);
char[] charArray = new char[1024];//缓冲数组
int readLength;//每次读取的长度
while((readLength = Reader.read(charArray)) != -1){
Writer.write(charArray,0,readLength);//写入读取的字符数组.
}
Writer.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(null != Reader){
try{
Reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != Writer){
try{
Writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//3.3缓冲字符流读写复制文件,每次复制复制一个字符:---所用时间:22119ms
public static void copyFileBufferedReaderChar(){
System.out.println("请输入你需要拷贝的文件路径:");
String oldpath=sc.next();
System.out.println("请输入你拷贝到的文件路径:");
String newpath=sc.next();
FileReader Reader = null;
FileWriter Writer = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try{
Reader = new FileReader(oldpath);
Writer = new FileWriter(newpath);
bufferedReader = new BufferedReader(Reader);
bufferedWriter = new BufferedWriter(Writer);
int b;//保存每次循环读取的字符
while ((b = bufferedReader.read()) != -1){//读取一个字符,-1代表读到流末尾
bufferedWriter.write(b);//写入读到的字符
}
bufferedWriter.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(null != Reader){
try{
Reader.close();
}catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedReader){
try{
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != Writer){
try{
Writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedWriter){
try{
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//4.4缓冲字符流读写复制文件,每次复制一个字符数组:---所用时间:17971ms
public static void copyFileBufferedReaderArray(){
System.out.println("请输入你需要拷贝的文件路径:");
String oldpath=sc.next();
System.out.println("请输入你拷贝到的文件路径:");
String newpath=sc.next();
FileReader fileReader = null;
FileWriter fileWriter = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try{
fileReader = new FileReader(oldpath);
fileWriter = new FileWriter(newpath);
bufferedReader = new BufferedReader(fileReader);
bufferedWriter = new BufferedWriter(fileWriter);
char[] Array = new char[1024];
int b;//保存每次循环读取的字符
while ((b = bufferedReader.read(Array)) != -1){//读取一个字符,-1代表读到流末尾
bufferedWriter.write(Array,0,b);//写入读到的字符
}
bufferedWriter.flush();
} catch (FileNotFoundException e) {
System.err.println("没有找到文件");
} catch (IOException e) {
System.err.println("创建文件或写入文件失败");
} finally {
if(null != fileReader){
try{
fileReader.close();
}catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedReader){
try{
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != fileWriter){
try{
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedWriter){
try{
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//1.5缓冲字符流读写复制文件,每次复制一行:-----所用时间:14664ms
public static void copyFileBufferedReaderString(){
System.out.println("请输入你需要拷贝的文件路径:");
String oldpath=sc.next();
System.out.println("请输入你拷贝到的文件路径:");
String newpath=sc.next();
FileReader fileReader = null;
FileWriter fileWriter = null;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try{
fileReader = new FileReader(oldpath);
fileWriter = new FileWriter(newpath);
bufferedReader = new BufferedReader(fileReader);
bufferedWriter = new BufferedWriter(fileWriter);
String b;
while ((b = bufferedReader.readLine()) != null){//读取一行,null代表已经读到流末尾
bufferedWriter.write(b);
bufferedWriter.newLine();
bufferedWriter.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(null != fileReader){
try{
fileReader.close();
}catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedReader){
try{
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != fileWriter){
try{
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedWriter){
try{
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//2.1.字节流读写复制文件,每次复制一个字节:----所用时间:29236ms
public static void copyFileInputStreamChar(){
System.out.println("请输入你需要拷贝的文件路径:");
String oldpath=sc.next();
System.out.println("请输入你拷贝到的文件路径:");
String newpath=sc.next();
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try{
fileInputStream = new FileInputStream(oldpath);
fileOutputStream = new FileOutputStream(newpath);
int b;//每次读取的长度
while((b = fileInputStream.read()) != -1){//读取单个字节,-1代表已达到流的末尾
fileOutputStream.write(b);//写入单个字节
}
fileOutputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(null != fileInputStream){
try{
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != fileOutputStream){
try{
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//2.2.字节流读写复制文件,每次复制一个字节数组:所用时间:8088ms
public static void copyFileInputStreamArray(){
System.out.println("请输入你需要拷贝的文件路径:");
String oldpath=sc.next();
System.out.println("请输入你拷贝到的文件路径:");
String newpath=sc.next();
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try{
fileInputStream = new FileInputStream(oldpath);
fileOutputStream = new FileOutputStream(newpath);
byte[] byteArray = new byte[1024];
int b;//每次读取的长度
while((b = fileInputStream.read(byteArray)) != -1){
fileOutputStream.write(byteArray,0,b);//写入读取的字节数组.
}
fileOutputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(null != fileInputStream){
try{
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != fileOutputStream){
try{
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//2.3.缓冲字节流读写复制文件,每次复制一个字节:-----所用时间:22387ms
public static void copyFileBufferedInputStreamChar(){
System.out.println("请输入你需要拷贝的文件路径:");
String oldpath=sc.next();
System.out.println("请输入你拷贝到的文件路径:");
String newpath=sc.next();
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try{
fileInputStream = new FileInputStream(oldpath);
fileOutputStream = new FileOutputStream(newpath);
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int b;//每次读取的长度
while((b = bufferedInputStream.read()) != -1){//读取单个字节,-1代表已达到流的末尾
bufferedOutputStream.write(b);//写入单个字节
}
bufferedOutputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(null != fileInputStream){
try{
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != fileOutputStream){
try{
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedInputStream){
try{
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedOutputStream){
try{
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//2.4.缓冲字节流读写复制文件,每次复制一个字节数组:-----所用时间:11967ms
public static void copyFileBufferedInputStreamArray(){
System.out.println("请输入你需要拷贝的文件路径:");
String oldpath=sc.next();
System.out.println("请输入你拷贝到的文件路径:");
String newpath=sc.next();
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try{
fileInputStream = new FileInputStream(oldpath);
fileOutputStream = new FileOutputStream(newpath);
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
byte[] byteArray = new byte[1024];
int b;//每次读取的长度
//
while((b = bufferedInputStream.read(byteArray)) != -1){
bufferedOutputStream.write(byteArray,0,b);//写入读取的字节数组.
}
bufferedOutputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(null != fileInputStream){
try{
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != fileOutputStream){
try{
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedInputStream){
try{
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != bufferedOutputStream){
try{
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
三、字节流和字符流转换
任何数据的持久化和网络传输都是以字节形式进行的,所以字节流和字符流之间必然存在转换问题。字符转字节是编码过程,字节转字符是解码过程。io包中提供了InputStreamReader和OutputStreamWriter用于字符和字节的转换。
在选择流步骤时:
//设置编码
InputStreamReader isr = new InputStreamReader(
new FileInputStream(“D:/test.txt”)
, “GBK”);