一、概念详解
1.定义
JavaIO流是既可以从中读取,也可以写入到其中的数据流。正如这个系列教程之前提到过的,流通常会与数据源、数据流向目的地相关联,比如文件、网络等等。
2.具体类型
二、实现实例
1.读取文件
/**
* 1.读取文件
* @param sourceFilepath 文件全路径,例如:"E:\\sharedfolder\\share.txt";
*/
public static void ReadFile(String sourceFilepath){
//1、建立连接
File file = new File(sourceFilepath);
InputStream is = null;
BufferedInputStream bis=null;
// BufferedWriter(new FileWriter("d:\\c.txt"));
try {
//2、选择流(此处为输入流)
is = new FileInputStream(file);
//和上一句功能一样,BufferedInputStream是增强流,加上之后能提高输入效率,建议!
// bis = new BufferedInputStream(new FileInputStream(file));
bis=new BufferedInputStream(is);
int len = 0;
//3、操作:以每次1024大小读取
byte[] buff = new byte[1024];
while((len = bis.read(buff))!= -1) {
String ss = new String(buff,0,len); // 将byte类型的数组转化成字符串,方便下面输出
System.out.println(ss);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件不存在!");
} catch (IOException e) {
e.printStackTrace();
System.out.println("读取文件失败!");
}finally {
if (is != null) { //若is还存在就需要释放,否则不需要释放
try {
bis.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("关闭文件输入流失败");
}
}
}
}
2.写入文件
/**
* 2.写入文件
* @param targetFilepath 文件全路径,例如:"E:\\sharedfolder\\share_target.txt";
*/
public static void WriteFile(String targetFilepath){
//1、建立连接
File file = new File(targetFilepath);
OutputStream os = null;
BufferedOutputStream bos=null;
try {
//2、选择输出流,以追加形式(在原有内容上追加) 写出文件 必须为true 否则为覆盖
os = new FileOutputStream(file,true);
// //和上一句功能一样,BufferedInputStream是增强流,加上之后能提高输出效率,建议
bos = new BufferedOutputStream(new FileOutputStream(file,true));
String string = "Programmer say : Hello World!";
byte[] data = string.getBytes(); //将字符串转换为字节数组,从而写出到指定文件
//3、写入文件
bos.write(data, 0, data.length);
bos.flush(); //将存储在管道中的数据强制刷新出去
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件没有找到!");
} catch (IOException e) {
e.printStackTrace();
System.out.println("写入文件失败!");
}finally {
if (os != null) {
try {
bos.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("关闭输出流失败!");
}
}
}
}
3.拷贝单个文件
/**
* 3.复制文件到直指定文件
* @param sourceFilepath 源文件全路劲:"E:\\sharedfolder\\share.txt"
* @param targetFilepath 目标文件全路径:"E:\\sharedfolder\\share_copy2.txt"
*/
public static void copyFile(String sourceFilepath,String targetFilepath){
//1.检测路径环境
File srcFile=new File(sourceFilepath);
File destFile=new File(targetFilepath);
if(! srcFile.isFile()){ //当不是文件或者为null
System.out.println("只能拷贝文件");
try {
throw new IOException("只能拷贝文件");
} catch (IOException e) {
e.printStackTrace();
}
}
if(destFile.isDirectory()){ //不能建立于文件夹同名的文件
System.out.println(destFile.getAbsolutePath()+"不能建立于文件夹同名的文件");
try {
throw new IOException(destFile.getAbsolutePath()+"不能建立于文件夹同名的文件");
} catch (IOException e) {
e.printStackTrace();
}
}
//2、建立连接
InputStream is =null;
OutputStream os = null;
try {
//3、选择流
is = new FileInputStream(srcFile);
os = new FileOutputStream(destFile);
//4、操作: 循环{读取+写出} + 强制刷新
byte[] inData = new byte[1024];
int len = 0;
while(-1 != (len = is.read(inData))){ //读取文件
os.write(inData, 0, len); //每次以inData大小读取数据
}
os.flush(); //将存储在管道中的数据强制刷新出去
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件不存在!");
} catch (IOException e) {
e.printStackTrace();
System.out.println("读取文件失败!");
}finally {
if (os != null)
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
if (is != null)
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.拷贝整个目录
/**
* 4.拷贝文件夹
* @param srcPath 源文件夹:"E:\\sharedfolder"
* @param destPath 目标文件夹:"E:\\sharedfolder2"
*/
public static void copyDir(String srcPath,String destPath){
File src = new File(srcPath);
File dest = new File(destPath);
//1、如果是文件夹
if (src.isDirectory()){
// Creates a new File instance from a parent pathname string(destPath)
// and a child pathname string(src.getName()).
dest = new File(destPath,src.getName()); //在路径destPath中新建一个src.getName()子目录
dest.mkdirs(); //Creates the directory named by this abstract pathname(dest)
}
copyDirDetail(src,dest);
}
/**
* 4.1 拷贝文件夹的细节实现(单独提出需要递归的部分,方便递归)
* @param src
* @param dest
*/
public static void copyDirDetail(File src,File dest){
//1、如果是文件
if (src.isFile()) {
copyFile(src.getAbsolutePath(),dest.getAbsolutePath());
}else if (src.isDirectory()) {
//2、如果是文件夹
dest.mkdirs(); //建立一个新的子目录
for(File sub:src.listFiles())
copyDirDetail(sub,new File(dest,sub.getName()));//3、递归查找子孙级
}
}
三、参考
1.Java IO流学习总结一:输入输出流
https://blog.csdn.net/zhaoyanjun6/article/details/54292148/