File
1.File类的概述和构造方法
File:它是文件和目录路径名抽象的表示
-
文件和目录是可以通过File封装成对象的
-
对于File而言,其封装的并不是一个真实存在的文件,仅仅是一个路径名而已。他可以是存在的,也可以是不存在的。将来是要通过具体操作把这个号路径的内容转换为具体存在的
方法名 | 说明 |
---|---|
File(String pathname) | 通过给定的路径名字字符串转换为抽象路径来创建新的File实例 |
File(String parent,String child) | 从父路径名字字符串和子路径名字字符串创建新的File实例 |
File(File parent,String child) | 从父抽象路径名和子路径名字符串创建新的File实例 |
2.File类创建功能
方法名 | 说明 |
---|---|
public boolean createNewFile() | 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 |
public boolean mkdir() | 创建由此抽象路径名命名的目录 |
public boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必须但不存在的父目录 |
public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
-
如果文件不存在,创建文件返回True
-
如果文件存在。不创建文件,返回False
public boolean mkdir() 创建由此抽象路径名命名的目录
-
如果目录不存在,创建目录,返回True
-
如果目录存在。不创建目录,返回False
public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必须但不存在的父目录
-
如果目录不存在,创建目录,返回True
-
如果目录存在。不创建目录,返回False
3.File类判断和获取方法
方法名 | 说明 |
---|---|
public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
public boolean exists() | 测试此抽象路径名表示的File是否存在 |
public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
public String getPath() | 将此抽象路径名转换为路路径名字符串 |
public String getName() | 返回由此抽象路路径名表示的文件或目录的名称 |
public String[] list() | 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 |
publiuc File[] listFile() | 返回此抽象路径名表示的目录中的文件和目录的File对象数组 |
4.File类删除功能
方法名 | 说明 |
---|---|
pubilc boolean delete() | 删除由此抽象路路径名表示的文件或目录 |
绝对路径和相对路径的区别
-
绝对路径:完整的路径名,不需要任何其他信息就可以定位他所表示的文件。
-
相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\\JAVA.TXT
递归
递归的概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象
-
递归解决问题的思路
-
把一个复杂问题层层转化为一个与原问题相似的规模较小的问题来求解
-
递归的策略只需少量程序就可以描述出解题过程所需要的多次重复计算
-
递归解决问题要找到两个内如:
-
递归出口:否侧会出现递归溢出
-
递归规则:与原问题相似的规模较小的问题
字节流
1. IO流概述:
-
IO:输入/输出(Input/Output)
-
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
-
IO流就是用来处理设备间数据传输问题的
-
常见的应用:文件复制;文件上传;文件下载
2.IO流的概述和分类
IO流分类:
-
按照数据的流向
-
输入流:读数据
-
输出流:写数据
-
-
按照数据类型来分
-
字节流 字节输入流;字节输出流
-
字符流 字符输入流;字符输出流
-
-
一般来说,我们说IO流的分类是按照数据类型来分的
-
那么这两种流都在什么情况下使用呢?
如果数据通过Window自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流,
否则使用字节流。如果你不知道该使用哪种类型的流,就使用字节流
3.字节流写数据
字节流抽象基类
-
InputStream:这个抽象类是表示字节输入流的所有类的超类
-
OutputStream:这个抽象类是表示字节输出流的所有类的超类
-
子类名特点:子类名称都是以其父类名作为子类名的后缀
FileOutputStream:文件输出流用于将数据写入File
-
FileOutputStream(String name):创建文件输出流以指定的名称写入文件
使用字节输出流写数据的步骤:
-
创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
-
调用字节输出流对象的写数据方法
-
释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
-
package com.itheima_01; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /* FileOutputStream:文件输出流用于将数据写入File FileOutputStream(String name):创建文件输出流以指定的名称写入文件 */ public class FileOutputStreamDemo01 { public static void main(String[] args) throws IOException { //创建字节输出流对象 //FileOutputStream(String name):创建文件输出流以指定的名称写入文件 FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt"); /* 做了三件事情: A:调用系统功能创建了文件 B:创建了字节输出流对象 C:让字节输出流对象指向创建好的文件 */ //void write(int b):将指定的字节写入此文件输出流 fos.write(97); // fos.write(57); // fos.write(55); //最后都要释放资源 //void close():关闭此文件输出流并释放与此流相关联的任何系统资源。 fos.close(); } }
//byte[] getBytes():返回字符串对应的字节数组
4.字节流写数据的3种方式
方法 | 说明 |
---|---|
void write(int b) | 将指定的字节写入此文件输出流 一次写一个字节数据 |
void write(byte[] b) | 将 b.length字节从指定的字节数组写入此文件输出流一次写一个字节数组数据 |
void write(byte[] b, int off, int len) | 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流一次写一个字节数组的部分数据 |
5.字节流写数据的两个小问题
字节流写数据如何实现换行呢?
-
写完数据后,加换行符 windows:\r\n linux:\n mac:\r
-
字节流写数据如何实现追加写入呢? public FileOutputStream(String name,boolean append) 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头
6.字节流写数据加异常处理
finally:在异常处理时提供finally块来执行所有清除操作。比如说IO流中的释放资源 特点:被finally控制的语句一定会执行,除非JVM退出
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}finally{
执行所有清除操作;
}
7.字节流读数据(一次读一个字节数据)
需求:把文件fos.txt中的内容读取出来在控制台输出
FileInputStream:从文件系统中的文件获取输入字节
-
FileInputStream(String name):通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名
使用字节输入流读数据的步骤:
-
创建字节输入流对象
-
调用字节输入流对象的读数据方法
-
释放资源
package com.itheima_02; import java.io.FileInputStream; import java.io.IOException; /* 需求: 把文件fos.txt中的内容读取出来在控制台输出 FileInputStream:从文件系统中的文件获取输入字节 FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名 使用字节输入流读数据的步骤: 1:创建字节输入流对象 2:调用字节输入流对象的读数据方法 3:释放资源 */ public class FileInputStreamDemo01 { public static void main(String[] args) throws IOException { //创建字节输入流对象 //FileInputStream(String name) FileInputStream fis = new FileInputStream("myByteStream\\fos.txt"); //调用字节输入流对象的读数据方法 //int read():从该输入流读取一个字节的数据 /* //第一次读取数据 int by = fis.read(); System.out.println(by); System.out.println((char)by); //第二次读取数据 by = fis.read(); System.out.println(by); System.out.println((char)by); //再多读取两次 by = fis.read(); System.out.println(by); by = fis.read(); System.out.println(by); //如果达到文件的末尾, -1 */ /* int by = fis.read(); while (by != -1) { System.out.print((char)by); by = fis.read(); } */ //优化上面的程序 int by; /* fis.read():读数据 by=fis.read():把读取到的数据赋值给by by != -1:判断读取到的数据是否是-1 */ while ((by=fis.read())!=-1) { System.out.print((char)by); } //释放资源 fis.close(); } }
8.字节流读数据(一次读一个字节数组数据)
需求:把文件fos.txt中的内容读取出来在控制台输出
使用字节输入流读数据的步骤:
-
创建字节输入流对象
-
调用字节输入流对象的读数据方法
-
释放资源
一次读一个字节数组的方法:
-
public int read(byte[] b):从输入流读取最多b.length个字节的数据
-
返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
案例
递归求阶乘
package com.itheima_02; /* 需求: 用递归求5的阶乘,并把结果在控制台输出 思路: 1:定义一个方法,用于递归求阶乘,参数为一个int类型的变量 2:在方法内部判断该变量的值是否是1 是:返回1 不是:返回n*(n-1)! 3:调用方法 4:输出结果 */ public class DiGuiDemo01 { public static void main(String[] args) { //调用方法 int result = jc(5); //输出结果 System.out.println("5的阶乘是:" + result); } //定义一个方法,用于递归求阶乘,参数为一个int类型的变量 public static int jc(int n) { //在方法内部判断该变量的值是否是1 if(n == 1) { //是:返回1 return 1; } else { //不是:返回n*(n-1)! return n*jc(n-1); } } }
遍历目录
package com.itheima_02; import java.io.File; /* 需求: 需求:给定一个路径(E:\\itcast),请通过递归完成遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台 思路: 1:根据给定的路径创建一个File对象 2:定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象 3:获取给定的File目录下所有的文件或者目录的File数组 4:遍历该File数组,得到每一个File对象 5:判断该File对象是否是目录 是:递归调用 不是:获取绝对路径输出在控制台 6:调用方法 */ public class DiGuiDemo02 { public static void main(String[] args) { //根据给定的路径创建一个File对象 // File srcFile = new File("E:\\itcast"); File srcFile = new File("E:\\itheima"); //调用方法 getAllFilePath(srcFile); } //定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象 public static void getAllFilePath(File srcFile) { //获取给定的File目录下所有的文件或者目录的File数组 File[] fileArray = srcFile.listFiles(); //遍历该File数组,得到每一个File对象 if(fileArray != null) { for(File file : fileArray) { //判断该File对象是否是目录 if(file.isDirectory()) { //是:递归调用 getAllFilePath(file); } else { //不是:获取绝对路径输出在控制台 System.out.println(file.getAbsolutePath()); } } } } }
案例:复制文本文件
-
package com.itheima_02; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /* 需求: 把“E:\\itcast\\窗里窗外.txt”复制到模块目录下的“窗里窗外.txt” 数据源: E:\\itcast\\窗里窗外.txt --- 读数据 --- InputStream --- FileInputStream 目的地: myByteStream\\窗里窗外.txt --- 写数据 --- OutputStream --- FileOutputStream 思路: 1:根据数据源创建字节输入流对象 2:根据目的地创建字节输出流对象 3:读写数据,复制文本文件(一次读取一个字节,一次写入一个字节) 4:释放资源 */ public class CopyTxtDemo { public static void main(String[] args) throws IOException { //根据数据源创建字节输入流对象 FileInputStream fis = new FileInputStream("E:\\itcast\\窗里窗外.txt"); //根据目的地创建字节输出流对象 FileOutputStream fos = new FileOutputStream("myByteStream\\窗里窗外.txt"); //读写数据,复制文本文件(一次读取一个字节,一次写入一个字节) int by; while ((by=fis.read())!=-1) { fos.write(by); } //释放资源 fos.close(); fis.close(); } }
案例:复制图片
package com.itheima_02; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /* 需求: 把E:\\itcast\\mn.jpg复制到模块目录下的mn.jpg 思路: 1:根据数据源创建字节输入流对象 2:根据目的地创建字节输出流对象 3:读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组) 4:释放资源 */ public class CopyJpgDemo { public static void main(String[] args) throws IOException { //根据数据源创建字节输入流对象 FileInputStream fis = new FileInputStream("E:\\itcast\\mn.jpg"); //根据目的地创建字节输出流对象 FileOutputStream fos = new FileOutputStream("myByteStream\\mn.jpg"); //读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组) byte[] bys = new byte[1024]; int len; while ((len=fis.read(bys))!=-1) { fos.write(bys,0,len); } //释放资源 fos.close(); fis.close(); } }