IO流(Input Output) :
存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动,传送,亦可以被其他程序使用.由于数据存储在文件中,所以我们需要学习一个和文件有密切关系的类,叫做File类,将要掌握获取文件的属性以及删除和重命名文件.最终如何向文件中写入数据和从文件中读取数据.
IO技术主要的作用是解决设备与设备之间 的数据传输问题。 比如: 硬盘--->内存 内存的数据---->硬盘上 把键盘的数据------->内存中
IO技术的应用场景:
导出报表 , 上传大头照 、 下载 、 解释xml文件 ...
数据保存到硬盘上,该数据就可以做到永久性的保存。 数据一般是以文件的形式保存到硬盘上
sun使用了一个File类描述了文件或者文件夹的。
File类可以描述一个文件或者一个文件夹。
1、File类的构造方法:
File(String pathname) 指定文件或者文件夹的路径创建一个File文件。
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(String parent, String child)
目录分隔符: 在windows机器上 的目录分隔符是 \ ,在linux机器上的目录分隔符是/ .
注意: 在windows上面\ 与 / 都可以使用作为目录分隔符。 而且,如果写/ 的时候只需要写一个即可。
import java.io.File;
public class Demo01 {
public static void main(String[] args) {
File parent =new File("D:\\java");//构建一个file对象
File file=new File(parent, "java");
System.out.println("D:\\Java路径下还存在java文件夹吗? "+file.exists());
File file02=new File("D:\\", "java");//
System.out.println("D盘下有Java文件夹吗? "+file02.exists());
}
}
输出结果:
D:\Java路径下还存在java文件夹吗? true
D盘下有Java文件夹吗? true
可以通过file对象或者string类型作为路径传入,一般选择file,可以调用file的一些方法做预处理
import java.io.File;
public class Demo02 {
public static void main(String[] args) {
System.out.println("系统的文件分隔符:"+File.separator);
File file=new File("D:"+File.separator+"java");
System.out.println(file.exists());
}
}
File.separator的方法是:与系统有关的默认名称分隔符
输出结果:
系统的文件分隔符:\
true
2、file常有方法
2.1创建方法
createNewFile() 在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false
mkdir() 在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。
mkdirs() 在指定位置创建目录,这会创建路径中所有不存在的目录。
renameTo(File dest) 重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切,剪切时候不能操作非空的文件夹。
移动/重命名成功则返回true,失败则返回false。
import java.io.File;
import java.io.IOException;
public class Demo03 {
public static void main(String[] args) throws IOException {
File file=new File("D:\\aaaaa.txt");
System.out.println("创建文件成功吗? "+file.createNewFile());
File dir=new File("D:\\test");
boolean flag=dir.mkdir();
System.out.println("创建文件夹成功 吗? "+flag);
File dir01=new File("D:\\aa\\bb");
System.out.println("创建多级文件夹成功吗? "+dir01.mkdirs());
}
}
结果:
创建文件成功吗? true
创建文件夹成功 吗? true
创建多级文件夹成功吗? true
import java.io.File;
import java.io.IOException;
public class Demo03 {
public static void main(String[] args) throws IOException {
File file=new File("D:\\abc.txt");
File destfile=new File("D:\\allen.txt");
System.out.println("重命名成功吗? "+file.renameTo(destfile));
}
}
重命名成功吗? true
2.2 删除方法:
delete() 删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false。
deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除
public class Demo03 {
public static void main(String[] args) throws IOException {
File file=new File("F:\\allenlor.txt");
System.out.println("删除成功吗? "+file.delete());
}
}
删除成功吗?ture
2.3判断方法
exists() 文件或文件夹是否存在。
isFile() 是否是一个文件,如果不存在,则始终为false。
isDirectory() 是否是一个目录,如果不存在,则始终为false。
isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute() 测试此抽象路径名是否为绝对路径名。
public class Demo04 {
public static void main(String[] args) {
File file =new File("D:\\abc.txt");
System.out.println("文件或文件夹是否存在? "+file.exists());
System.out.println("是否是一个文件?"+file.isFile());
System.out.println("是否是一个目录"+file.isDirectory());
System.out.println("是否是隐藏文件或者目录"+file.isHidden());
System.out.println("测试此抽象路径名是否为绝对路径名。"+file.isAbsolute());
}
}
结果:
文件或文件夹是否存在? true
是否是一个文件?true
是否是一个目录false
是否是隐藏文件或者目录false
测试此抽象路径名是否为绝对路径名。true
2.4 文件操作相关方法:
getName() 获取文件或文件夹的名称,不包含上级路径。
getPath() 返回绝对路径,可以是相对路径,但是目录要指定
getAbsolutePath() 获取文件的绝对路径,与文件是否存在没关系
length() 获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。
getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。
lastModified() 获取最后一次被修改的时间。
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo05 {
public static void main(String[] args) {
File file =new File("D:\\abc.txt");
System.out.println("获取文件或者文件夹名称:"+file.getName());
System.out.println("获取路径:"+file.getPath());
System.out.println("获取绝对路径:"+file.getAbsolutePath());
System.out.println("获取文件大小()字节数:"+file.length());
System.out.println("获取文件父目录:"+file.getParent());
long time=file.lastModified();
Date date =new Date(time);
SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println("最后一次修改时间:"+dateFormat.format(date));
}
}
结果:
获取文件或者文件夹名称:abc.txt
获取路径D:\abc.txt
获取绝对路径:D:\abc.txt
获取文件大小()字节数:128
D:\
2017年06月06日 22:24:43
2.5文件夹相关操作方法
staic File[] listRoots() 列出所有的根目录(Window中就是所有系统的盘符)
list() 返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。
list(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
listFiles() 返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。
listFiles(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
需求1:获取所有的F:/007 即007目录下的所有文件和文件夹
解题思路:
代码需要封装,就需要创建方法,并在main方法中调用和测试.
第一步:创建File对象
第二步:查找File类中可用的方法,想要获取该目录下的所有子文件和子目录
第三步:显示这些文件和文件夹的名称
package cn.file; import java.io.File; import java.util.ArrayList; public class Demo03 { public static void main(String[] args) { // File file =new File("F:\\007"); String path ="F:\\007"; //testfile(path); testfile01(path); } public static void testfile(String path){//判断完后直接输出 File file =new File(path); File[]names=file.listFiles(); for (int i = 0; i < names.length; i++) { if (names[i].isFile()) { System.out.println("文件:"); System.out.println("\t"+names[i].getName()); }else { if (names[i].isDirectory()) { System.out.println("文件夹:"); System.out.println("\t"+names[i].getName()); } } } } public static void testfile01(String path){//判断完后保存到集合中,再 输出 File dir =new File(path); File[] names=dir.listFiles(); ArrayList<File> filelist=new ArrayList<File>(); ArrayList<File> dirlist=new ArrayList<File>(); for (int i = 0; i < names.length; i++) { File file= names[i]; if (file.isDirectory()) { dirlist.add(file); } else if (file.isFile()) { filelist.add(file); } } System.out.println("子文件:"); for (int i = 0; i < filelist.size(); i++) { System.out.println("\t" + filelist.get(i).getName()); } System.out.println("子目录:"); for (int i = 0; i < dirlist.size(); i++) { System.out.println("\t" + dirlist.get(i).getName()); } } }
方法一输出效果:
文件夹:
001
文件夹:
002
文件夹:
003
文件夹:
004
文件:
Thumbs.db
文件:
总体测试计划.doc
文件:
新建文本文档.txt
文件:
测试工作阶段报告.doc
文件:
测试用例.xls
文件:
测试问题报告.doc
文件:
测试需求.xls
文件:
系统测试报告.doc
文件:
系统测试计划.doc
文件:
缺陷跟踪表.xls
文件:
集成测试报告.doc
文件:
集成测试计划.doc
文件:
验收测试报告.doc
文件:
验收测试计划.doc
方法二输出效果
子文件:
Thumbs.db
总体测试计划.doc
新建文本文档.txt
测试工作阶段报告.doc
测试用例.xls
测试问题报告.doc
测试需求.xls
系统测试报告.doc
系统测试计划.doc
缺陷跟踪表.xls
集成测试报告.doc
集成测试计划.doc
验收测试报告.doc
验收测试计划.doc
子目录:
001
002
003
004
列出指定目录中所有扩展名为.txt的文件。
public class Demo04 { public static void main(String[] args) { String file="F:\\007"; fileName(file, ".txt"); } public static void fileName(String path,String fileType){ File dir=new File(path); File [] files=dir.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isFile()) {//判断是否是文件 if (files[i].getName().endsWith(fileType)) {//判断文件后缀 System.out.println("指定目录下的文件:"+files[i].getName()); } } } } }
指定目录下的文件:新建文本文档.txt
递归基本概念
递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。递归算法,其实说白了,就是程序的自身调用。它表现在一段程序中往往会遇到调用自身的那样一种coding策略,这样我们就可以利用大道至简的思想,把一个大的复杂的问题层层转换为一个小的和原问题相似的问题来求解的这样一种策略。递归往往能给我们带来非常简洁非常直观的代码形势,从而使我们的编码大大简化,然而递归的思维确实很我们的常规思维相逆的,我们通常都是从上而下的思维问题, 而递归趋势从下往上的进行思维。这样我们就能看到我们会用很少的语句解决了非常大的问题,所以递归策略的最主要体现就是小的代码量解决了非常复杂的问题。
递归算法解决问题的特点:
1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
public class testFile { public static void main(String[] args) { File file=new File("F:\\FTP服务器"); listFile(file,"|----"); } public static void listFile(File file,String space){ File listDir []=file.listFiles(); for (File file2 : listDir) { if (file2.isFile()) { System.out.println(space+file2.getName()); } else if(file2.isDirectory()){ System.out.println(space+file2.getName()); listFile(file2,"| "+space); } } } }
递归练习5的阶乘。
public static int test(int num){ if(num==1){ return 1; }else { return test(num-1)*num; } }