IO流
FIle类
-
File介绍
- 是文件和目录路径名的抽象表示
- 文件和目录是可以通过File类封装成对象
- 对File而言,这里的封装的并不是一个真正存在的文件,仅是一个路径而已。它可以是存在的,也可以是不存在的。将来要通过具体的操作把这个路径的内容转换成具体存在的
-
File类的构造方法
方法名 说明
File(String pathname) 通过将给定的路径名 字符串转换为抽象路径名来创建新的File实例
File(String parent,String child) 从父路径名字符串和子路径名字符串创建新的File实例
File(File parent,String child) 从父抽象路径名和子路径名字符串创建新的File实例
public class FtestDemo { public static void main(String[] args) { File f1 = new File("/Users/edz/Practice"); System.out.println(f1); File f2 = new File("/Users/edz/Practice", "java.txt"); System.out.println(f2); // File(File parent,String child) // 从父抽象路径名和子路径名字符串创建新的File实例 File f3 = new File("/Users/edz/Practice"); //父类抽象路径 File f4 = new File(f3,"java.txt"); System.out.println(f4); } }
无论文件是否存在都会输出当前抽象的路径名
File类创建功能
-
方法分类
方法名 说明
creatNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
Mkdir() 创建由此抽象路径名命名的目录
mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
public class FtestDemo1 { public static void main(String[] args) throws IOException { //创建一个文件的抽象类对象 File f1 = new File("/Users/edz/Practice/java.txt"); //创建文件 System.out.println(f1.createNewFile()); System.out.println("---------"); //创建目录 File f2 = new File("/Users/edz/Practice/JavaSE"); System.out.println(f2.mkdir()); //创建一个父目录不存在的子文件 File f3 = new File("/Users/edz/Practice/Html/js.txt"); System.out.println(f3.mkdirs()); } }File类判断和获取功能
-
判断功能
Public boolean isDirectory() 测试此抽象路径名表示的是否是目录
public boolean isFile() 测试此抽象路径名表示的是否是文件
public boolean exixts() 测试此抽象路径名表示的是否存在
-
获取功能
public String getAbsolutePath() 返回此抽象路径的绝对路径名字符串
public String getPath() 将此抽象路径名转换为路径名字符串
Public String getName() 返回由此抽象路径名表示的文件或目录的名称
public String[] list() 返回此抽象路径名表示的目录中的文件和目录名字的名称字符串数组
public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录名字的名称字符串数组
public class FTestDEmo2 {
public static void main(String[] args) {
File f1 = new File("/Users/edz/Practice");
String[] list = f1.list();
// 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
for (String s : list) {
System.out.println(s);
}
// 返回此抽象路径名表示的目录中的文件和目录的File对象数组
System.out.println("--------");
File f2 = new File("/Users/edz/Practice");
File[] files = f2.listFiles();
for (File file : files) {
// System.out.println(file);
// System.out.println(file.getName());
if (file.isDirectory()){//判断对象是否是目录,只打印目录
System.out.println(file.getName());
}
}
}
}
File类删除功能
-
方法分类
public boolean delete() 删除由此抽象路径表示的文件或目录
-
绝对路径和相对路径的区别
- 绝对路径:完整的路径名,不需要任何其他信息就可以定位它表示的文件。
- 相对路径:必须使用取自其他路径名的信息进行解释。
递归
- 递归的介绍
- 从编程的角度来看,递归就是指方法定义中调用方法本体的现象
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
- 递归只需要少量的程序就可以描述出解题过程中所需要的多次重复计算
- 递归的使用
public class DGDemo{
public static void main(String[] args){
//增长规律: 1 1 2 3 5 8 13 。。。。。
int [] arr = new int [20];
arr[0]=1;
arr[1]=1;
for(i=2;i < arr.lenght;i++){
arr[i]=arr[i-1]+arr[i-2]
}
System.out.println(arr[19]);
/*
递归解决问题,首先就是要定义一个方法:
定义一个f(n):表示第n个值
第n-1的值 f(n-1)
第 n-2的值 f(n-2)
*/
public static int f(int n){
if(n==1 || n==2){ //给递归方法一个出口
return 1;
}else{
return f(n-1)+f(n-2);
}
}
}
}
- 递归注意事项
- 递归一定要有一个出口,否则就会溢出
- 递归虽然有出口,但是递归的次数也不能太多,否则内存溢出
递归求阶乘
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);
}
}
}
递归遍历目录
public class DiGuiDemo02 {
public static void main(String[] args) {
//根据给定的路径创建一个File对象
//File srcFile = new File("/Users/edz/Practice");
File srcFile = new File("/Users/edz/Practice");
//调用方法
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());
}
}
}
}
}
Io流
- Io流介绍
- IO: 输入/输出(Input/output)
- 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
- IO流就是用来处理设备间数据传输的问题。常见的应用:文件复制;文件上传;文件下载
- IO流的分类
- 按照数据的流向
- 输入流:读数据
- 输出流:写数据
- 按照数据类型来分
- 字节流
- 字节输入流
- 字节输出流
- 字符流
- 字符输入流
- 字符输出流
- 字节流
- 按照数据的流向
- IO就的使用场景
- 如果操作的是纯文本文件,优先使用字符流
- 如果操作的是图片,视频文件,音频等二进制文件,优先使用字节流
- 如果不确定文件的类型,优先使用字节流。字节流是万能的流
字节流写数据
- 字节流抽象基类
- InputStream: 这个抽象类是表示字节输入流的所有超类
- OutputStream:是表示字节输出流的所有类的超类
- 子类名特点:子类名称都是以父类名作为子类名的后缀
- 字节输出流
- 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();
}
}
字节流写数据的三种方式
void write(int b) 将指定的字写入此文件输出流,一次写一个字节数据
void write(byte[] b) 将b.length字节从指定的字节数组写入此文件输出流一次写一个字节数组数据
void write(byte[] b ,int off,int len) 将len字节从指定的字节数组开始,从偏移量off开始写入此文件输入流 一次写一个字节数组部分数据
-
字节流写数据如何实现追加写入
- public FileOutputStream(String name,boolean append)
- 创建文件输出流一指定的名称写入文件,如果第二个参数为true,则字节将写入文件的末尾而不是开头。
FileOutputStream fos = new FileOutputStream("xxx",true);
字节流写数据加异常处理
-
异常处理格式
- try-catch-finally
try{ 可能出现异常的代码; }catch{ 异常的处理代码; }finally{ 执行清楚操作; }- finally 特点
- 被finally控制的语句一定会执行,除非JVM退出
字节流读数据(一次读一个字节数据)
- 字节输入流
- FileInputStream(String name): 通过打开与实际文件的来创建一个FileInputStream,该文件有文件系统中的路径名name命名
- 字节输入流读取数据的步骤
- 创建字节输入流对象
- 调用字节输入流的读数据方式
- 释放资源
public class FileInp {
public static void main(String[] args) throws IOException {
FileInputStream fin = new FileInputStream("/Users/edz/Practice/1.txt");
/*
* fin.read(): 读数据
* read=fin.read();把读到的数据复制给read
* read !=-1;判断数据是否是-1,也就是判断是否已经读完
*
* */
int read;
while ((read=fin.read())!=-1){
System.out.println((char) read);
}
fin.close();
}
}
字节流复制文本文件
-
实现步骤
- 复制文本文件,就是把一个文件中的内容读取出来,再写入另外一个文件中
public class CopyDemo{ public static void main(String[] args )throws IOException{ //创建字节输入流完成文件的读取 FileInputStream fis=new FileInputStream("xxx.txt"); //创建字节输入流对象,完成数据的写入 FielOutputStream fos = new FileOutputStream("xx1.txt") int by; while((by=fis.read())!=-1){ //如果没有读到最后就将文件内容写入新的文件 fos.write(by); } //释放资源 fos.close; fis.close; } }
字节流读取数据(一次读一个字节数组数据)
- 一次读一个字节数组的方法
- public int read(byte[] b): 从输入流读取最多b.length个字节的数据
- f返回的是读入缓冲区的总·字节数,也就是实际读取字节个数
public class FileInputStreamDemo02 {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("xxx/fos.txt");
/*
hello\r\n
world\r\n
第一次:hello
第二次:\r\nwor
第三次:ld\r\nr
*/
byte[] bys = new byte[1024]; //1024及其整数倍
int len;
while ((len=fis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
//释放资源
fis.close();
}
}
浙公网安备 33010602011771号