File类
File类:表示文件或者目录的路径的抽象表现形式. IO流就是对文件进行操作的
File类的三个构造方法
public File(String pathname):表示pathname的抽象路径表现的形式 (开发中使用这种方式)
例如 File f1 = new File(“D:\\word\\abc.txt”);
public File(String parent,String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例
例如:File f2 = new File(“D:\\word”,”abc.txt”);
public File(File parent, String child):根据一个file对象和一个文件路径来构造File实例
以上三种方式构造的对象直接输出的结构是该抽象路径
跟创建相关的功能:
public boolean createNewFile():创建文件,当文件不存在的时候,创建此抽象路径下的文件
//当你定义的是 “H:\\Demo\\a.txt” 若是Demo文件夹不存在会出现错误
错误类型:java.io.IOException: 系统找不到指定的路径。
public boolean mkdir():创建一个文件夹,如果文件夹存在,不创建 返回一个false
如果父目录不存在也会创建失败返回一个false
public boolean mkdirs():创建文件夹,如果父目录不存在,会创建此目录
删除功能
public boolean delete() :删除文件或者文件夹(目录不能是空的) :逐一删除文件或者目录的
File类的判断功能
public boolean isDirectory():判断是否是文件夹
public boolean isFile() :判断是否是文件
public boolean canRead(): 是否可读
public boolean canWriter():是否可写
public boolean exists():是否存在
public boolean isHidden():是否是隐藏文件
File类的获取功能:
public String getAbsolutePath():获取抽象文件的绝对路径
public String getPath():获取相对路径的字符串
public String getName()返回由此抽象路径名表示的文件或目录的名称
public long length()返回由此抽象路径名表示的文件的长度。
public long lastModified():文件最后一次被修改的时间(时间毫秒值)
/
File的高级功能(!!)
public String[] list() :获取当前某个路径下的所有的文件夹以及文件名称的字符串数组
public File[] listFiles() :获取当前某个路径下所有的文件夹以及文件的File数组
具体应用
判断E盘目录下是否有后缀名为.txt的文件,如果有,就输出此文件名称
H盘下:图片文件
思路:
1)使用File对象表示e盘的根目录
2)File[] listFiles() ;String[] list() 获取当前盘符下所有的文件以及文件夹的File数组
3)对File数组对象进行非空判断,判断他是否为null,不是null,遍历
4)如果他是文件,并还有满足是否以.jpg结尾
满足就可以进行输出文件名称
方法一:利用File的高级方法
private static void filter1(File f) {
File [] FileArr = f.listFiles();
//判断内容不为空
if( FileArr !=null ) {
//循环该数组
for(File s :FileArr) {
//判断是否是文件
if(s.isFile()) {
//判断文件是否以.txt结尾
if(s.getName().endsWith(".txt")) {
//输出文件名
System.out.println(s.getName());
}
}
}
}
}
方式二:在高级方法中调用文件名称过滤器 (用匿名内部类的方式)
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
FilenameFilter:一个接口: 文件名称过滤器
boolean accept(File dir, String name)测试指定文件是否应该包含在某一文件列表中。
文件是否包含在文件列表中,取决于返回值,true;false表示不包含
*/
//通过过滤器
private static void filter2(File f) {
//调用过滤器
File[] f1 = f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//创建封装对象
File f = new File(dir,name);
boolean flag = f.isFile();
boolean flag2 = name.endsWith(".txt");
return flag && flag2;
}
});
//遍历该数组
for(File s :f1) {
System.out.println(s.getName());
}
}
}
IO:在设备和设备之间的一种数据传输!
IO流的分类:
按流的方向分:
输入流: 读取文件 (e:\\a.txt):从硬盘上文件读取出来后输出这个文件的内容
输出流: 写文件:将e:\\a.txt 内容读出来--->写到f盘下
按数据的类型划分:
字节流
字节输入流:InputStream:读取字节
字节输出流:OutputStream:写字节
字符流
字符输入流:Reader:读字符
字符输出流:Writer:写字符
需求:在当项目下输出一个文件,fos.txt文件(文本文件)
只要文本文件,优先采用字符流,字符流在字节流之后出现的
使用字节流进行操作
无法创建字节输出流对象:OutputSteam :抽象类,不能实例化
又学习过File类,并且当前是对文件进行操作,子类:FileOutputSteam进行实例化
File+InputStream
File+OutputStream
FileXXX (FileReader)
FileXXX (FileWriter)
开发步骤:
1)创建字节输出流对象
2)写数据
3)关闭资源
示例:
//先创建对象,由于它OutputStream是抽象类,故而应用它的实类或者多态的方式创建
//多态 OutputStream os = new OutputStream() ;
//子实类:
FileOutputStream fos = new FileOutputStream("demo") ;
//写数据 写的时候只接受int类型的数据或者是byte[]类型的数据
fos.write("你好".getBytes());
//关闭资源
/**
1)将文件和流对象不建立关系了 (fos对象不指向fos.txt)
2)及时释放掉流对象所占用的内存空间
*/
fos.close();
//如果关闭流对象了,那么就不能对流对象进行操作了
需求:输出文本文件,给文本文件中添加一些数据
问题:
写一些数据,这些数据并没有换行,如何实现换行的效果...
针对不同的操作系统,里面的换行符合不一样的
windows: \r\n
Linx:\n
mac:\r
一些高级记事本针对任意的换行会有换行的效果
Day22.2文件
IO流中加入异常处理(try...catch...)
方式1) 分别进行异常处理
创建字节文件输出流对象
//方式一,分别进行try---catch操作
FileOutputStream fos = null;
//对创建对象进行操作
try {
fos = new FileOutputStream("day22.3.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//对写数据进行操作
try {
fos.write(("猪最重要的就是开心").getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//堆释放资源进行操作
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
方式2: 一起处理 (针对整个资源没有释放,不好)
try {
FileOutputStream fos = new FileOutputStream("day22.3.1.txt");
fos.write(("做猪最重要的是开心").getBytes());
fos.close();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}方式3:经常这样使用:try...catch...finally...
// finally中访问这个对象,需要将对象放到try语句外面
//方式三
FileOutputStream fos = null;
try {
fos = new FileOutputStream("day22.3.1.txt");
fos.write(("做猪最重要的是开心").getBytes());
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//运用finally使得无论如何都会进行资源释放的操作
finally {
if ( fos != null ) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
FileInputStream
需求:去读取当前项目下的fis.txt这个文件内容,将文件的内容输出在控制台上
InputStream抽象类:字节输入流
FileInputStream
构造方法:
public FileInputStream(String name)
开发步骤:
1)创建字节文件输入流对象
2)读数据
3)释放资源
读数据方式:
public abstract int read():一次读取一个字节
public int read(byte[] b):一次读取一个字节数组 (读取实际的字节数)
重点(往后常用的模版代码)
//最终版代码
指定字节数组的长度是:1024或者1024的倍数
byte[] bys2 = new byte[1024] ;
int len2 = 0 ;
while((len2=fis.read(bys2))!=-1) { //判断,赋值,循环
System.out.println(new String(bys2, 0, len2)); //带上len的用法
}
复制文本文件。
将当前项目下的a.txt文件的内容读取出来,复制到b.txt文件中
源文件:a.txt---> 读取文件的内容---->FileInputStream
目的地文件:b.txt---->输出文件--->FileOutputStream
方法 1.本身读写操作:
读取一个字节,写一个字节,针对不会出现中文乱码的问题..
public static void main(String[] args) throws Exception {
//封装目的地文件和源文件
FileInputStream fis = new FileInputStream("a.txt") ;
FileOutputStream fos = new FileOutputStream("b.txt") ;
//进行读写操作
//一次读取一个字节
int by = 0 ;
while((by=fis.read())!=-1) {
//第一个字节,写个一个字节
fos.write(by);
}
System.out.println("------");
//一次读取一个字节数组
//释放资源
fis.close();
fos.close();
}
}
方法2读写操作,读入整个数组,写的时候写入整个数组
public static void main(String[] args) throws Exception {
//封装目的地文件和源文件
FileInputStream fis = new FileInputStream("c:\\a.txt") ;
FileOutputStream fos = new FileOutputStream("d:\\b.txt") ;
//读写操作
int by = 0 ;
while((by=fis.read())!=-1) {
//不断写数据
fos.write(by);
}
//释放资源
fos.close();
fis.close();
}
递归
递归:只的是方法调用方法本身的一种现象
Math类:max()方法Math.max(10,Math.max(15,20)); 方法嵌套
举例
方法递归:
public void show(int n){
if(n<0){
System.exit(0) ;//jvm退出了
}
System.out.println(n) ;
show(n--) ;
}
方法递归的三个必要条件:
1)方法递归必须有出条件
2)必须满足一些规律
3)一定要写方法
注意:构造方法不存在方法递归的
举例
从前有座山,山里有个庙,庙里有个老和尚和小和尚,老和尚给老和尚讲了一个故事是:
从前有座山,山里有个庙,庙里有个老和尚和小和尚,老和尚给老和尚讲了一个故事是:
从前有座山,山里有个庙,庙里有个老和尚和小和尚,老和尚给老和尚讲了一个故事是:
从前有座山,山里有个庙,庙里有个老和尚和小和尚,老和尚给老和尚讲了一个故事是:
条件结束:山塌了,或者和尚挂了
具体应用:
需求:求5的阶乘
5! = 5 * 4 * 3 * 2*1
5! = 5 * 4!
方式:
1)普通for循环
2)用递归的方式去写
1)方法递归必须有出条件
2)必须满足一些规律
3)一定要写方法
Private static void jiecheng(int n ){
///当n 等于1 时,该递归已经计算完毕,记为出口条件
If (n == 1){
return 1 ;
}
Else{
//根据规律写出具体描述
Return n * jiecheng(n-1);
}
}