package javaFileStudy;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
/**
* 文件的简单操作 : 读、写(覆盖写、追加写)、复制、剪切、新增、删除
* 特别提示:文件输入输出原则,有汉子尽量使用字符流,音频图片尽量使用字节流。
*
* @author xubo
*
*/
public class File1 {
/**
* 步骤请一步步的调试,记得刷新项目
*
* @param args
* @throws Exception
*/
public static void main(String args[]) throws Exception {
// String abnormalFilepath = ":tools_file1"; //异常路径
String normalFilepath = "first/firstFile.txt"; // 相对路径
String nextFilepath = "second/second/File.txt";
System.out.println(System.getProperty("user.dir"));
// File abnormalFile = new File(abnormalFilepath); abnormalFile.getParentFile()会抛出java.lang.NullPointedException
// 测试新建文件 , 刷新项目,看项目文件夹下面是否有新文件生成
File firstFile = File1.createNewFile(normalFilepath);
// 从内存中向新建的文件写入数据
// File1.writeFileFromMemory("许博将来会成功吗?", firstFile, false);
// 从内存向新建的文件尾部追加内容
// File1.writeFileFromMemory("\r\n必须的啊 !", firstFile, true); // 文件换行 \r\n 回车换行符
// 测试复制文件
// File nextFile = File1.copyFile(firstFile, nextFilepath);
// 测试删除文件
// File1.deleteFile(nextFile);
// 测试剪切文件
File secondFile = File1.cutFile(firstFile, nextFilepath);
// 测试文件的基本信息方法
System.out.println("文件名称\t" + firstFile.getName());
System.out.println("文件路径\t" + firstFile.getPath());
System.out.println("文件绝对路径\t" + firstFile.getAbsolutePath());
System.out.println("文件大小\t" + firstFile.length());
}
/**
* 根据指定目录创建文件
* 只要文件不要目录(java file类包含目录)
* filepath,如果使用的没有"D:/"等表示绝对路径,就会采用相对路径。以System.getProperty("user.dir")为参照
* 考虑点 :1、是否已经存在 2、路径是否合法 3、是否是目录路径
*
* @param filepath
* @return
* @throws Exception
*/
static File createNewFile(String filepath) throws Exception {
File myFile = new File(filepath);
if (myFile.exists() && !myFile.isFile()) { // 合法文件但是一个目录
throw new RuntimeException("this is an already existed directory path ,not a filepath .");
}
if (!myFile.exists()) { // 如果文件不存在
if (!myFile.getParentFile().exists()) { // 检查目录是否存在,不存在就创建,如果filepath为非法根目录(":tools_file1"),则抛nullPointed
if (!myFile.getParentFile().mkdirs()) {// 创建指定目录,多级创建,非合法路径返回false;
throw new RuntimeException("this is not a normal filepath .");
}
}
myFile.createNewFile();
if (myFile.isDirectory()) { // 是个目录而不是一个文件 TODO 创建的文件夹是否要删除?
// myFile.delete(); 当然还可以循环至上删除所有空文件夹,但没必要了
throw new RuntimeException("this is a directory path ,not a filepath .");
}
}
return myFile;
}
/**
* 删除文件
* 只有是文件或者空目录才可以删除
*/
static boolean deleteFile(File file) {
return file.delete();
}
/**
* 向文件中写入String值
* 使用字符流,特别是String中有汉子的时候,字节只能表示ASCII码的0~255,汉子不在此列,使用字节流会乱码的。
*
* @param isAddwrite
* : false 覆盖写入 ,true 追加写入
*/
static void writeFileFromMemory(String content, File myfile, boolean isAddwrite) throws Exception {
if (!myfile.exists()) { // 文件不存在 则跑出异常
throw new RuntimeException("file is not exist");
}
if (content == null || content.equals("")) { // 内容为空 不用写
return;
}
// 构建文件输入流,content不可能太大,不需要用缓冲流
FileWriter fileWrite = new FileWriter(myfile, isAddwrite); // 字符流文件写入,flag为true则追加写入
fileWrite.write(content);
fileWrite.flush();
fileWrite.close(); // 流使用完了要关闭
}
/**
* 从一个文件读取数据,然后写入到另外一个文件
* 从文件到文件,一般使用字节流,汉子也不会乱码
*/
static void writeFileFromFile(File fromFile, File toFile, boolean isAddwrite) throws Exception {
if (!fromFile.exists() || !toFile.exists()) {
throw new RuntimeException("one or two files not exist ! ");
}
// 构建缓冲输入字节流 (相对于内存,从哪里输入)
BufferedInputStream bif = new BufferedInputStream(new FileInputStream(fromFile));
// 构建缓冲输出字节流 (相对于内存,输出到哪里去)
BufferedOutputStream bof = new BufferedOutputStream(new FileOutputStream(toFile, isAddwrite));
byte[] b = new byte[2000];
int tmp = 0;
while ((tmp = bif.read(b)) != -1) {
bof.write(b, 0, tmp);
}
bof.flush(); // 刷新输出流,使得写入数据得以保存。新人可以试试不加看看文件内容有不
bof.close(); // 输出流的资源远大于输入流,先关输出流!
bif.close();
}
/**
* 文件复制
* 1、根据提供的filepath新建一个文件
* 2、把当前文件的内容写入到新文件中。
* 如果1操作完成,后续操作失败就删除新建的文件
*
* @throws Exception
*/
static File copyFile(File oldFile, String newFilePath) throws Exception {
File newFile = File1.createNewFile(newFilePath);
try {
File1.writeFileFromFile(oldFile, newFile, true);
} catch (Exception e) {
File1.deleteFile(newFile);
throw e;
}
return newFile;
}
/**
* 文件剪切
* 1、文件复制
* 2、删除老文件
* 注意:如果新文件创建后,后续操作抛出异常就删除新创建的文件(copyFile已经完成这步骤)
*/
static File cutFile(File oldFile, String newFilePath) throws Exception {
File newFile = File1.copyFile(oldFile, newFilePath);
File1.deleteFile(oldFile);
return newFile;
}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
/**
* 文件的简单操作 : 读、写(覆盖写、追加写)、复制、剪切、新增、删除
* 特别提示:文件输入输出原则,有汉子尽量使用字符流,音频图片尽量使用字节流。
*
* @author xubo
*
*/
public class File1 {
/**
* 步骤请一步步的调试,记得刷新项目
*
* @param args
* @throws Exception
*/
public static void main(String args[]) throws Exception {
// String abnormalFilepath = ":tools_file1"; //异常路径
String normalFilepath = "first/firstFile.txt"; // 相对路径
String nextFilepath = "second/second/File.txt";
System.out.println(System.getProperty("user.dir"));
// File abnormalFile = new File(abnormalFilepath); abnormalFile.getParentFile()会抛出java.lang.NullPointedException
// 测试新建文件 , 刷新项目,看项目文件夹下面是否有新文件生成
File firstFile = File1.createNewFile(normalFilepath);
// 从内存中向新建的文件写入数据
// File1.writeFileFromMemory("许博将来会成功吗?", firstFile, false);
// 从内存向新建的文件尾部追加内容
// File1.writeFileFromMemory("\r\n必须的啊 !", firstFile, true); // 文件换行 \r\n 回车换行符
// 测试复制文件
// File nextFile = File1.copyFile(firstFile, nextFilepath);
// 测试删除文件
// File1.deleteFile(nextFile);
// 测试剪切文件
File secondFile = File1.cutFile(firstFile, nextFilepath);
// 测试文件的基本信息方法
System.out.println("文件名称\t" + firstFile.getName());
System.out.println("文件路径\t" + firstFile.getPath());
System.out.println("文件绝对路径\t" + firstFile.getAbsolutePath());
System.out.println("文件大小\t" + firstFile.length());
}
/**
* 根据指定目录创建文件
* 只要文件不要目录(java file类包含目录)
* filepath,如果使用的没有"D:/"等表示绝对路径,就会采用相对路径。以System.getProperty("user.dir")为参照
* 考虑点 :1、是否已经存在 2、路径是否合法 3、是否是目录路径
*
* @param filepath
* @return
* @throws Exception
*/
static File createNewFile(String filepath) throws Exception {
File myFile = new File(filepath);
if (myFile.exists() && !myFile.isFile()) { // 合法文件但是一个目录
throw new RuntimeException("this is an already existed directory path ,not a filepath .");
}
if (!myFile.exists()) { // 如果文件不存在
if (!myFile.getParentFile().exists()) { // 检查目录是否存在,不存在就创建,如果filepath为非法根目录(":tools_file1"),则抛nullPointed
if (!myFile.getParentFile().mkdirs()) {// 创建指定目录,多级创建,非合法路径返回false;
throw new RuntimeException("this is not a normal filepath .");
}
}
myFile.createNewFile();
if (myFile.isDirectory()) { // 是个目录而不是一个文件 TODO 创建的文件夹是否要删除?
// myFile.delete(); 当然还可以循环至上删除所有空文件夹,但没必要了
throw new RuntimeException("this is a directory path ,not a filepath .");
}
}
return myFile;
}
/**
* 删除文件
* 只有是文件或者空目录才可以删除
*/
static boolean deleteFile(File file) {
return file.delete();
}
/**
* 向文件中写入String值
* 使用字符流,特别是String中有汉子的时候,字节只能表示ASCII码的0~255,汉子不在此列,使用字节流会乱码的。
*
* @param isAddwrite
* : false 覆盖写入 ,true 追加写入
*/
static void writeFileFromMemory(String content, File myfile, boolean isAddwrite) throws Exception {
if (!myfile.exists()) { // 文件不存在 则跑出异常
throw new RuntimeException("file is not exist");
}
if (content == null || content.equals("")) { // 内容为空 不用写
return;
}
// 构建文件输入流,content不可能太大,不需要用缓冲流
FileWriter fileWrite = new FileWriter(myfile, isAddwrite); // 字符流文件写入,flag为true则追加写入
fileWrite.write(content);
fileWrite.flush();
fileWrite.close(); // 流使用完了要关闭
}
/**
* 从一个文件读取数据,然后写入到另外一个文件
* 从文件到文件,一般使用字节流,汉子也不会乱码
*/
static void writeFileFromFile(File fromFile, File toFile, boolean isAddwrite) throws Exception {
if (!fromFile.exists() || !toFile.exists()) {
throw new RuntimeException("one or two files not exist ! ");
}
// 构建缓冲输入字节流 (相对于内存,从哪里输入)
BufferedInputStream bif = new BufferedInputStream(new FileInputStream(fromFile));
// 构建缓冲输出字节流 (相对于内存,输出到哪里去)
BufferedOutputStream bof = new BufferedOutputStream(new FileOutputStream(toFile, isAddwrite));
byte[] b = new byte[2000];
int tmp = 0;
while ((tmp = bif.read(b)) != -1) {
bof.write(b, 0, tmp);
}
bof.flush(); // 刷新输出流,使得写入数据得以保存。新人可以试试不加看看文件内容有不
bof.close(); // 输出流的资源远大于输入流,先关输出流!
bif.close();
}
/**
* 文件复制
* 1、根据提供的filepath新建一个文件
* 2、把当前文件的内容写入到新文件中。
* 如果1操作完成,后续操作失败就删除新建的文件
*
* @throws Exception
*/
static File copyFile(File oldFile, String newFilePath) throws Exception {
File newFile = File1.createNewFile(newFilePath);
try {
File1.writeFileFromFile(oldFile, newFile, true);
} catch (Exception e) {
File1.deleteFile(newFile);
throw e;
}
return newFile;
}
/**
* 文件剪切
* 1、文件复制
* 2、删除老文件
* 注意:如果新文件创建后,后续操作抛出异常就删除新创建的文件(copyFile已经完成这步骤)
*/
static File cutFile(File oldFile, String newFilePath) throws Exception {
File newFile = File1.copyFile(oldFile, newFilePath);
File1.deleteFile(oldFile);
return newFile;
}
}