流的分类可以按以下几个方面:
按流的方向:输入流(InputStream)和输出流(OutputStream)
按处理数据的单元:字节流(处理一切文件),字符流(处理纯文本文件)
按功能:节点流,处理流
本文关于文件的读入,写出以及拷贝均是基于字节流。
1.文件的读入
public class Demo01 {
public static void main(String[] args) {
// 1:建立联系
File src = new File("D:/test/1/aaa.txt");
// 提升作用域
InputStream is = null;
try {
// 2.选择流
is = new FileInputStream(src);
// 读取
byte[] car = new byte[100];
// 实际读取的长度
int len = 0;
while (-1 != (len = is.read(car))) {
// 把字节转换为字符数组
String info = new String(car, 0, len);
System.out.println(info);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件没有发现");
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件读取失败");
} finally {
// 关闭流
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch bloc
e.printStackTrace();
}
}
}
}
2:文件的写出
public class FileOutputStreamDemo02 {
public static void main(String[] args) {
//建立联系
File dest=new File("D:/test/1/aa.txt");
OutputStream fos=null;
try {
fos=new FileOutputStream(dest);
String str="good good study";
//将字符串转换为字符数组
byte[] data=str.getBytes();
//写入文件中
fos.write(data, 0,data.length );
//刷新一下,关闭流
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件未找到");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3:文件,文件夹的拷贝(可作为工具类使用)
/**
* 1:文件的拷贝
* 2:文件夹的拷贝
* @ @author lenovo
*
**/
public class CopyFile {
/**
* 文件的拷贝
* @param srcPath 源文件路径
* @param destPath 目标文件路径
* @throws Exception
*/
public static void copyFile(String srcPath, String destPath) throws Exception {
// 源,目的文件建立联系
File src = new File(srcPath);
File dest = new File(destPath);
// 拷贝的时候src只能是文件
if (!src.isDirectory()) {
copyFile(src, dest);
} else {
throw new Exception("只能拷贝文件");
}
}
/**
* 文件的拷贝
* @param src 源文件
* @param dest 目标文件
* @throws IOException
*/
public static void copyFile(File src, File dest) throws IOException {
InputStream is = new FileInputStream(src);
OutputStream os = new FileOutputStream(dest);
// 缓冲数组
byte[] car = new byte[1024];
int len = 0;
while (-1 != (len = is.read(car))) {
os.write(car, 0, len);
}
os.flush();
// 关闭两个流
os.close();
is.close();
}
/**
* 文件夹的拷贝
* @param srcPath 源文件的路径
* @param destPath 目标文件的路径
*/
public static void copyDir(String srcPath, String destPath) {
File src = new File(srcPath);
File dest = new File(destPath);
copyDir(src, dest);
}
/**
* 文件夹的拷贝
* @param src 源文件
* @param dest 目标文件
*/
public static void copyDir(File src, File dest) {
if (src.isDirectory()) {// 源文件是文件夹
dest = new File(dest, src.getName());
}
CopyDirDetail(src, dest);
}
//文件夹拷贝具体的实现细节
private static void CopyDirDetail(File src, File dest) {
if (src.isFile()) {// 是文件
try {
CopyFile.copyFile(src, dest);
} catch (IOException e) {
e.printStackTrace();
}
} else if (src.isDirectory()) {// 是文件夹
// 确保目标文件在
dest.mkdirs();
// 获取下一级目录,文件
for (File sub : src.listFiles()) {
CopyDirDetail(sub, new File(dest, sub.getName()));
}
}
}
}