您的位置:首页 > 编程语言 > Java开发

JAVA中的I/O流以及文件操作

2015-04-20 15:08 344 查看
一 JAVA语言中主要通过流来完成IO操作。

流:计算机的输入输出之间流动的数据序列,也是类的对象。java中的流方式就像是建立在数据交换源和目的之间的一条通信路径。

数据源:计算机中的数据源是指可以提供数据的地方,包括键盘,磁盘文件,网络接口等。

输入流:从程序外部传向程序的流。输入流只能从中读数据。

输出流: 从程序传到外部的流。输出流只能向其写入数据。

所谓的输入和输出是以程序为中心的,数据流向程序即输入流,数据从程序中流出即输出流。

二 字节流

字节流是以字节为传输单位的数据读写形式,用于直接读取二进制数据,如图像和声音文件等。

InputStream和OutputStream分别为面向字节的输入流类的父类和输出流类的父类。InputStream和OutputStream都是抽象类。

FileInputStream和FileOutputStream是文件流类,他们是InputStream和OutputStream的子类。

FileInputStream类的一般用法是:先创建一个FileInputStream对象关联到要读取的文件,然后调用read方法读取字节数据到程序中,再进行其他处理。因为read方法是按字节的读入的,所以汉字被读入时会出现乱码。

FileOutputStream类的一般用法是:先创建一个FileOutputStream对象关联到要写入的文件,然后调用write方法将字节数据写到程序中。如果进行写操作的文件不存在,则自动创建该文件,但是如果文件所在的路径也不存在,则运行时会报错。

例如 FileOutputStream fos = new FileOutputStream("D:\\test.txt");是不会报错的,

FileOutputStream fos = new FileOutputStream("D:\\tmp\\test.txt");如果之前在D盘中没有tmp这个文件夹,那么此时运行这条语句会报错。

代码如下

package 输入输出流_移动指定目录下的文件;

import java.io.File;

public class FileDemo_06 {
//英东某个指定的文件,但移动成功后不会覆盖已存在的文件
public static boolean moveA_File(String sourceFileName, String targetFileName) {
return FileDemo_06.moveA_File(sourceFileName, targetFileName, false);
}

//移动某个指定的文件,但移动成功后可以根据isOverlay的值来决定是否覆盖已存在的目标文件
public static boolean moveA_File(String sourceFileName, String targetFileName,
boolean isOverlay) {
File sourceFile = new File(sourceFileName);
if (!sourceFile.exists()) {
System.out.println("文件" + sourceFileName + "不存在,移动失败");
return false;
} else if (!sourceFile.isFile()) {
System.out.println(sourceFileName + "不是文件,移动失败");
return false;
}
File targetFile = new File(targetFileName);
if (targetFile.exists()) {
if (isOverlay) {
System.out.println("目标文件已经存在,准备删除它");
if (!FileDemo_05.deleteFilesOrDir(targetFileName)) {
System.out.println("文件移动失败,文件" + targetFileName + "删除失败");
return false;
}
} else {
System.out.println("文件移动失败,因为文件" + targetFileName + "已经存在");
return false;
}
} else {
if (!targetFile.getParentFile().exists()) {
System.out.println("文件" + targetFile + "所在的目录不存在,正在创建");
if (!targetFile.getParentFile().mkdirs()) {
System.out.println("移动文件失败,因为创建文件坐在的文件夹失败");
return false;
}
}
}

//移动源文件至目标文件
if (sourceFile.renameTo(targetFile)) {
System.out.println("移动源文件" + sourceFileName + "到" + targetFileName
+ "成功" );
return true;
} else {
System.out.println("移动源文件" + sourceFileName + "到" + targetFileName
+ "失败" );
return false;
}

}

public static boolean moveDir(String sourceDirName, String targetDirName) {
//默认为不覆盖目标文件
return FileDemo_06.moveDir(sourceDirName, targetDirName, false);
}

//移动某个指定的目录,但移动成功后可以根据isOverlay的值来决定是否覆盖当前已存在的目标目录
public static boolean moveDir(String sourceDirName, String targetDirName,
boolean isOverlay) {
//判断原目录是否存在
File sourceDir = new File(sourceDirName);
if (!sourceDir.exists()) {
System.out.println("源目录" + sourceDirName + "不存在,移动目录失败");
return false;
} else if (!sourceDir.isDirectory()) {
System.out.println("移动目录失败," + sourceDirName + "不是目录");
return false;
}
//如果目标文件名不是以文件分割符结尾,自动添加文件分隔符
if (!targetDirName.endsWith(File.separator)) {
targetDirName += File.separator;
}
File targetDir = new File(targetDirName);
//如果目标文件夹存在
if (targetDir.exists()) {
if (isOverlay) {
//允许删除则删除已存在的目标目录
System.out.println("该目录已经存在,准备删除它");
if (!FileDemo_05.deleteFilesOrDir(targetDirName)) {
System.out.println("移动目录失败,因为目标目录已经存在。   删除目录" +
targetDirName + "失败!"                        );
}
} else {
System.out.println("移动目录失败:该目录" + targetDirName + "已存在!");
return false;
}
} else {
//创建目标目录
System.out.println("该目录不存在,正在创建");
if (!targetDir.mkdirs()) {
System.out.println("移动目录失败: 创建目标目录失败");
return false;
}
}
boolean flag = true;
//移动原目录下的文件和子目录到目标目录下
File[] files = sourceDir.listFiles();
for (int i = 0; i < files.length; i++) {
//移动子文件
if (files[i].isFile()) {
flag = FileDemo_06.moveA_File(files[i].getAbsolutePath(),
targetDirName + files[i].getName(), isOverlay);
if (!flag) {
break;
}
} else if (files[i].isDirectory()) { //移动子目录
flag = FileDemo_06.moveDir(files[i].getAbsolutePath(),
targetDirName + files[i].getName(), isOverlay);
if (!flag) {
break;
}

}
}

if (!flag) {
System.out.println("目录" + sourceDirName + "移动到" + targetDirName + "失败");
return false;
}
//删除原目录
if (FileDemo_05.deleteDir(sourceDirName)) {
System.out.println("目录" + sourceDirName + "移动到" + targetDirName + "成功");
return true;
} else {
System.out.println("目录" + sourceDirName + "移动到" + targetDirName + "失败");
return false;
}
}

public static void main(String[] args) {
//移动文件,如果目标文件存在,则替换
System.out.println("调用moveA_File方法的结果如下");
String sourceFileName = "D:\\aa\\temp\\key.txt";
String targetFileName = "D:\\bbb\\ddd\\";
FileDemo_06.moveA_File(sourceFileName, targetFileName);
//移动目录,如果目标目录存在,则不覆盖
System.out.println("\n调用moveDir方法的结果如下");
String sourceDir = "D:\\aa";
String targetDir = "C:\\mm";
FileDemo_06.moveDir(sourceDir, targetDir,false);
}

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐