知识点:
递归
IO流
控制台传参
bat处理文件
将bat文件加载到任务栏(一键拷贝)
使用控制台传参方法拷贝文件:(路径可在控制台输入也可在java源文件中修改)
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CopyDir {
public static void main(String[] args) throws IOException {
String pathFrom = "";
String pathTo = "";
// 在控制台运行文件时传参,省去了编译过程
if (args.length == 2) {
pathFrom = args[0];
pathTo = args[1];
} else{
// 手动指定路径,需要进行编译再运行
pathFrom = "D:/MyEclipse/Web/WebFrom";
pathTo = "F:/software/apache-tomcat-7.0.42/webapps/WebFrom";
}
File dir = new File(pathFrom);
File destDir = new File(pathTo);
// 当拷贝的路径已经存在文件时,先将文件夹删除再拷贝
if(destDir.exists()){
deleteDir(destDir);
}
destDir.mkdir();
copyDir(dir, destDir);
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss") ;
String time = dateFormat.format(date);
System.out.println("拷贝成功 " + time);
}
private static void deleteDir(File dir) {
File[] files = dir.listFiles();
for(File file : files){
if(file.isFile()){
file.delete();
}else if(file.isDirectory()){
deleteDir(file);
}
}
dir.delete();
}
private static void copyDir(File dir, File destDir) throws IOException {
File[] files = dir.listFiles();
for(File file:files){
if(file.isFile()){
File newFile = new File(destDir,file.getName());
// file.renameTo(newFile); // 剪切文件
copyFile(file, newFile); // 拷贝文件
}else if(file.isDirectory()){
File subDestDir = new File(destDir,file.getName());
subDestDir.mkdir();
copyDir(file,subDestDir);
}
}
}
private static void copyFile(File file, File newFile) throws IOException {
FileInputStream fileInputStream = new FileInputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream(newFile);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int content = 0;
while ((content = bufferedInputStream.read()) != -1) {
bufferedOutputStream.write(content);
}
bufferedOutputStream.close();
bufferedInputStream.close();
}
}
使用bat处理快速运行文件:
1.新建bat文件
2.输入命令行
d:
cd D:\Java\file (进入class文件所在目录,这样bat文件可以在任意位置都能执行)
java CopyDir D:\MyEclipse2016\Web\WebRoot F:\software\apache-tomcat-7.0.42\webapps\Web (改变路径只需修改参数)
3.保存文件
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
递归:
/*
递归:函数的自身调用函数的自身 (从后面结束到前面)
递归的使用前提:必须要有条件的情况下调用。
需求: 算出5的阶乘。 5! = 5*4 *3 * 2*1
*/
public class Demo {
public static void main(String[] args) {
int result = print(5);
System.out.println("结果:"+ result);
}
public static int print(int num){
if(num == 1){
return 1;
}else{
return num*print(num-1);
}
}
public static int test(int num){
int result = 1;
while(num>0){
result = result*num;
num--;
}
return result;
}
}
/*
需求1:列出一个文件夹的子孙文件与目录。
需求2:列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格:
第一级前面有0个,第二级前面有1个,第三级前面有2个...,以此类推。
需求3:|--src
| |--cn
| | |--itcast
| | | |--a_helloworld
| | | | |--HelloWorld.java
| | | |--b_for
| | | | |--ForTest.java
| | | |--c_api
| | | | |--Student.java
|--bin
| |--cn
| | |--itcast
| | | |--i_exception
| | | | |--ExceptionTest.class
| | | |--h_linecount
| | | | |--LineCounter3.class
| | | | |--LineCounter2.class
| | | | |--LineCounter.class
|--lib
| |--commons-io.jar
需求4: 删除一个非空的文件夹。
*/
import java.io.File;
public class Demo {
public static void main(String[] args) {
/* File dir = new File("F:\\project\\day");
listFiles3(dir,"|--");*/
File dir = new File("F:\\aa");
deleteDir(dir);
}
//删除了一个非空的目录
public static void deleteDir(File dir){ // bb
File[] files = dir.listFiles(); //列出了所有的子文件
for(File file : files){
if(file.isFile()){
file.delete();
}else if(file.isDirectory()){
deleteDir(file);
}
}
dir.delete(); // 删除最后留下的空文件夹
}
//列出一个文件夹的子孙文件与目录,要求要是树状结构
public static void listFiles3(File dir,String space){ //space 存储的是空格
File[] files = dir.listFiles(); //列出所有 的子文件
for(File file : files){
if(file.isFile()){
System.out.println(space+file.getName());
}else if(file.isDirectory()){
System.out.println(space+file.getName());
listFiles3(file,"| "+space);
}
}
}
//列出一个文件夹的子孙文件与目录,要求名称前面要有相应数量的空格。
public static void listFiles2(File dir, String space){ //space 存储的是空格
File[] files = dir.listFiles(); //列出所有 的子文件
for(File file : files){
if(file.isFile()){
System.out.println(space+file.getName());
}else if(file.isDirectory()){
System.out.println(space+file.getName());
listFiles2(file," "+space);
}
}
}
//列出一个文件夹的子孙文件与目录。
public static void listFiles1(File dir){
File[] files = dir.listFiles(); //列出所有的子文件
for(File file : files){
if(file.isFile()){
System.out.println("文件名:"+file.getName());
}else if(file.isDirectory()){
System.out.println("文件夹:"+file.getName());
listFiles1(file);
}
}
}
}
bat处理文件:
/*
快速启动java图形化文件:(jar文件)
1.进入文件目录 (cd Java)
2.对java源文件进行编译:javac -d . java源文件 (javac -d . Demo.java)
3.对java文件进行打包:jar cvf jar包名 java文件名 (jar cvf Text.jar aa)
4.修改清单文件:Main-Class: 包名+类名 (Main-Class: aa.bb.cc.Demo)
bat处理文件: bat处理文件就是可以一次性执行多个命令的文件。
为什么要学bat处理文件, 快速运行一个软件我一般都会把软件打包一个jar包。
jar双击可以运行仅对于图形化界面的软件起作用,对于控制台的程序是不起作用的。
对于控制台的程序我们可以使用bat处理文件快速启动一个项目。
如何编写bat处理文件呢? (控制台程序和图形化程序)
步骤: 编写一个自定义的文本文件,然后把后缀名改成bat即可,然后把你所要执行的命令写在bat处理文件中即可。
javac -d . Demo.java(bat+源文件)
java aa.bb.cc.Demo
pause
执行压缩包里的class文件:(找不到主类)
1.设置临时环境变量(set classpath=d:\Java\text.zip)对本控制台有效
2.指定类文件路径(java -classpath .\text.zip; aa.bb.cc.Demo)对本次有效(bat+zip、jar的class文件)
bat处理文件常用的命令:
echo 向控制台输出指定的内容
echo off 隐藏echo off后面执行过的命令
@ 隐藏当前行执行的命令
title 改变当前控制台窗口的标题
color 指定控制台的背景颜色与前景颜色
%注释的内容%
pause: 让当前控制台停留
%1~%9: 给bat处理文件传入参数(传参只能用控制台输入参数:bat文件名 参数)
*/
将bat文件加载到任务栏(一键拷贝)
/*
将CopyDir.bat 改名为CopyDir.exe
将修改后的CopyDir.exe拉到任务栏
将修改后的CopyDir.exe修改回CopyDir.bat
找到C:\Users\acer\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar路径下的CopyDir.exe文件
右键点击CopyDir.exe文件--属性,将目标文件路径的后缀名exe改为bat
点击确定
*/