文件拷贝
文件拷贝是java里面比较基础的知识,在面试中面试官也经常要求进行手写,本人最近就在面试中遇到,写得不是很好,于是总结了一下java文件
复制的方法
1.字节流
-
package com.jn.IOtest; import java.io.*; /** 文件复制 * @author jiangnan * @version 1.0 * @date 2023/3/17 14:38 */ public class demo04 { public static void main(String[] args) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("F:\\java\\project\\javaseDemo\\src\\input.txt"); fos = new FileOutputStream("F:\\java\\project\\javaseDemo\\src\\output2.txt"); int readCount; byte[] bytes = new byte[1024*1024]; while ((readCount=fis.read())!=-1){ fos.write(bytes,0,readCount); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
优点:使用与然后形式的文件
缺点:文本文件的拷贝容易造成乱码
2.字符流
package com.jn.IOtest;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/** 字符流
* @author jiangnan
* @version 1.0
* @date 2023/3/17 14:57
*/
public class demo05 {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("F:\\java\\project\\javaseDemo\\src\\input.txt");
fw = new FileWriter("F:\\java\\project\\javaseDemo\\src\\output4.txt");
int readCount ;
char[] bytes = new char[4];
while ((readCount=fr.read(bytes))!=-1){
fw.write(bytes, 0, readCount);
}
fw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
使用字符流复制文件一般不会造成乱码问题
3.字符流加缓存流
package com.jn.IOtest;
import java.io.*;
/**
* @author jiangnan
* @version 1.0
* @date 2023/3/17 15:10
*/
public class demo06 {
public static void main(String[] args) {
BufferedReader reader = null;
BufferedWriter writer = null;
try {
reader = new BufferedReader(new FileReader("F:\\java\\project\\javaseDemo\\src\\input.txt"));
writer = new BufferedWriter(new FileWriter("F:\\java\\project\\javaseDemo\\src\\output2.txt"));
String readCount;
while ((readCount=reader.readLine())!=null) {
writer.write(readCount+"\n");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
缓冲流提供了readLine()方法,可以一行一行读,效率高
这种缓存流和字符流相互配合使用的模式叫做装饰器模式
装饰器(Decorator)模式** 可以在不改变原有对象的情况下拓展其功能。
装饰器模式通过组合替代继承来扩展原始类的功能,在一些继承关系比较复杂的场景(IO 这一场景各种类的继承关系就比较复杂)更加实用。
外部的缓存流也称为包装流,里面的字符流称为节点流
public class BufferedReader extends Reader {
private Reader in;//字符流
public BufferedReader(Reader in) {
this(in, defaultCharBufferSize);
}
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close();//关闭字符流
} finally {
in = null;
cb = null;
}
}
}
}
观察BufferedReader源码可知,缓存流内部维护了相应的字符流,在close()时,也会调用字符流的close()方法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/189662.html