IO流1. File1.1 File类概述和构造方法 File类介绍 File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。
File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。 public static void main(String[] args) {
//File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File f1 = new File("D:\\练习\\java.txt");
System.out.println(f1);
//File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。
File f2 = new File("D:\\练习","java.txt");
System.out.println(f2);
//File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。
File f3 = new File("D:\\练习");
File f4 = new File(f3,"java.txt");
System.out.println(f4);
}1.2 File类创建功能 File类创建功能:
public boolean createNewFile():当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
如果文件不存在,就创建文件,并返回true
如果文件存在,就不创建文件,并返回false
public boolean mkdir():创建由此抽象路径名命名的目录//只能创建单级目录 不能创建多级目录
如果目录不存在,就创建目录,并返回true
如果目录存在,就不创建目录,并返回false
public boolean mkdirs():创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
如果目录不存在,就创建目录,并返回true
如果目录存在,就不创建目录,并返回false创建目录就要用创建目录的方法,创建文件就要用创建文件的方法 public static void main(String[] args) throws IOException {
//需求1:我要在E:\\itcast目录下创建一个文件java.txt
File f1 = new File("E:\\test\\java.txt");
System.out.println(f1.createNewFile());
System.out.println("---------");
//需求2:我要在E:\\itcast目录下创建一个目录JavaSE
File f2 = new File("E:\\test\\JavaSE");
System.out.println(f2.mkdir());//不带s的mkdir方法是创建单级目录
System.out.println("---------");
//需求3:我要在E:\\itcast目录下创建一个多级目录JavaWEB\\HTML
File f3 = new File("E:\\test\\JavaWEB\\\\HTML");
System.out.println(f3.mkdirs());
System.out.println("---------");
}1.3 File类判断和获取功能 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():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组 public static void main(String[] args) {
// public boolean isDirectory():测试此抽象路径名表示的File是否为目录
// public boolean isFile():测试此抽象路径名表示的File是否为文件
// public boolean exists():测试此抽象路径名表示的File是否存在
File f1 = new File("File1\\java");
System.out.println(f1.isDirectory());//判断是否为目录
System.out.println(f1.isFile());//判断是否为文件
System.out.println(f1.exists());//判断文件或者目录是否存在下
// public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
//// public String getPath():将此抽象路径名转换为路径名字符串
//// public String getName():返回由此抽象路径名表示的文件或目录的名称
System.out.println(f1.getAbsolutePath());//显示该路径的绝对路径 全部路径
System.out.println(f1.getPath());//显示包装的路径名
System.out.println(f1.getName());//返回抽象路径名下的文件或者目录名
System.out.println("---------");
File f2 = new File("E:\\File1");
// public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
//// public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组
String[] list = f2.list();
for (String s : list){
System.out.println(s);
}
System.out.println("-------");
File[] files = f2.listFiles();
for (File f : files){
System.out.println(f.getName());
}
}
}1.4 File类删除功能File类删除功能 : 绝对路径和相对路径的区别 绝对路径 : 完整的路径名 , 不需要任何其他信息就可以定位它所表示的文件. 例如: E:\\itcast\\java.txt 相对路径 : 必须使用取自其他路径名的信息进行解释. 例如 : myFile\\java.txt
删除目录时的注意事项 创建文件之前要先创建目录,不然无法创建文件,系统会报错 public static void main(String[] args) throws IOException {
//1.在当前模块目录下创建一个文件java.txt
File file = new File("day08\\java.txt");
// System.out.println(file.createNewFile());
//2.删除当前模块目录下的文件java.txt
System.out.println(file.delete());
System.out.println("----------");
//3.在当前模块目录下创建一个目录itcast
File file1 = new File("day08\\itcast");
// System.out.println(file1.mkdir());
//4.删除当前模块目录下的目录itcast
System.out.println(file1.delete());
System.out.println("------");
//5.在当前模块目录下创建一个目录itcast,然后再该目录下再创建一个java.txt文件
File file2 = new File("day08\\itcast");
File file3 = new File("day08\\itcast\\java.txt");
// System.out.println(file2.mkdir());
// System.out.println(file3.createNewFile());
//6.删除当前模块目录下的目录itcast (删除前要把删除的该目录下的内容删除,才能删除目录)
System.out.println(file3.delete());
System.out.println(file2.delete());
}1.5 递归1.5.1 递归的概述(不死神兔)递归概述 : 以编程的角度来看,递归指的是方法定义中调用方法本身的现象
递归解决问题的思路 : 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 递归策略只需少量的程序就可描叙出解题过程所需要的多次重复计算
递归解决问题要找到两个内容 : 递归出口 : 否则会出现内存溢出 递归规则 : 与原问题相似的规模较小的问题
public static void main(String[] args) {
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < arr.length; i++) {
arr = arr[i - 1] + arr[i - 2];
}
System.out.println(arr[19]);
System.out.println(f(20));
}
public static int f(int n){
if (n==1 || n== 2){
return 1;
} else {
return f(n-1) + f(n-2);
}
}1.5.2 递归求阶乘需求: 用递归求5的阶乘,并把结果在控制台输出思路: 1:定义一个方法,用于递归求阶乘,参数为一个int类型的变量 2:在方法内部判断该变量的值是否是1 是:返回1 不是:返回n*(n-1)! 3:调用方法 4:输出结果public static void main(String[] args) { System.out.println(f(5));}public static int f (int n){ if (n==1){ return 1; } else { return n*f(n-1); }}1.5.3 递归遍历目录需求: 需求:给定一个路径(E:\\itcast),请通过递归完成遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台思路: 1:根据给定的路径创建一个File对象 2:定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象 3:获取给定的File目录下所有的文件或者目录的File数组 4:遍历该File数组,得到每一个File对象 5:判断该File对象是否是目录 是:递归调用 不是:获取绝对路径输出在控制台 6:调用方法public class DiGuiBianLiDemo { public static void main(String[] args) { File f1 = new File("D:\\练习"); fa(f1); } public static void fa (File f1){ File[] files = f1.listFiles(); for (File f : files){ if (f.isDirectory()){ fa(f); } else { System.out.println(f.getAbsolutePath()); } } }}
2. 字节流2.1 IO流概述和分类 IO流概述 :
IO流分类 : 按照数据的流向 输入流 : 读数据 输出流 : 写数据 按照数据类型来分 字节流 : 字节输入流; 字节输出流 字符流 : 字符输入流; 字符输出流 一般来说,我们说IO流的分类是按照数据类型来分的 两种流的使用情况 :
如果数据通过Window自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流, 否则使用字节流.如果你不知道该使用那种类型的流,就使用字节流 字节流是万能流
2.2 字节流写数据 字节流抽象基类 InputStream : 这个抽象类是表示字节输入流的所有类的超类 OutputStream : 这个抽象类是表示字节输出流的所有类的超类 子类名特点 : 子类名称都是以其父类名作为子类名的后缀 FileOutputStream : 文件输出流用于将数据写入File
FileOutputStream (String name) : 创建文件输出流以指定的名称写入文件创建字节输出流对象做的三件事情 1. 调用系统功能创建了文件 2. 创建了字节输出流对象 3.让字节输出流对象指向创建好的文件viod write(int b) : 将指定好的字节写入此文件输出流 写入文件会按照码表对应值来写入 所有和IO操作相关的内容最后都要释放资源 viod close();关闭此文件输出流并释放与此流相关联的任何系统资源. IO流写数据三个步骤 1.创建对象(创建字节输出流对象) 2.写入数据(调用字节输出流对象的写数据方法) 3.释放资源(调用close方法)2.3 字节流写输入的三种方式构造方法: FileOutputStream(String name):创建文件输出流以指定的名称写入文件 FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件写数据的三种方式: void write(int b):将指定的字节写入此文件输出流 一次写一个字节数据 void write(byte[] b):将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据 void write(byte[] b, int off, int len):将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据 byte[] getBytes(): 返回字符串对应的字节数组 public static void main(String[] args) throws IOException { FileOutputStream f = new FileOutputStream("day08\\shabi.txt");// f.write(91);// f.write(92);// f.write(93); byte[] b = "97,98,99".getBytes(); f.write(b);// f.write(b,1,2); }2.4 字节流写数据的两个小问题① 字节流写数据如何实现换行 不同系统识别的换行符 window : \r \n linux : \n mac : \r 实现换行 : 写完数据后,加换行符即可
② 字节流写数据如何实现追加写入 public FileOutputStream(String name,boolean append) 创建文件输出流以指定的名称写入文件。 如果第二个参数为true ,则字节将写入文件的末尾而不是开头new FileOutputStream("文件的路径",true);在对象的第二个参数添加true即可. 2.5 字节流写数据加异常处理 finally : 在异常处理时提供finally块来执行所有清楚操作.比如说IO流中的释放资源 特点 : 被finally控制的语句一定会执行 2.6 字节流读数据(一次读一个字节数据)需求: 把文件fos.txt中的内容读取出来在控制台输出FileInputStream:从文件系统中的文件获取输入字节 FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名使用字节输入流读数据的步骤: 1:创建字节输入流对象 2:调用字节输入流对象的读数据方法 3:释放资源 //调用字节输入流对象的读数据方法 //int read():从该输入流读取一个字节的数据public static void main(String[] args) throws IOException { FileInputStream i = new FileInputStream("day08\\for.txt"); int by; while ((by=i.read())!= -1){ System.out.print((char)by);// by=i.read(); } i.close(); }(案例)复制文本文件需求: 把“E:\\itcast\\窗里窗外.txt”复制到模块目录下的“窗里窗外.txt” 数据源: E:\\itcast\\窗里窗外.txt --- 读数据 --- InputStream --- FileInputStream 目的地: myByteStream\\窗里窗外.txt --- 写数据 --- OutputStream --- FileOutputStream思路: 1:根据数据源创建字节输入流对象 2:根据目的地创建字节输出流对象 3:读写数据,复制文本文件(一次读取一个字节,一次写入一个字节) 4:释放资源public static void main(String[] args) throws IOException { //创建输入流 FileInputStream f1 = new FileInputStream("D:\\练习\\测试.txt"); //创建输出流 FileOutputStream f2 = new FileOutputStream("day08\\测试.txt"); //读写数据,复制文本, int by; while ((by=f1.read()) != -1){ f2.write(by); } //释放资源 f1.close(); f2.close();}2.7 字节流读数据(一次读一个字节数组数据)需求:把文件fos.txt中的内容读取出来在控制台输出使用字节输入流读数据的步骤: 1:创建字节输入流对象 2:调用字节输入流对象的读数据方法 3:释放资源public static void main(String[] args) throws IOException { //输入 FileInputStream fis = new FileInputStream("E:\\File1\\java.txt"); //输出 byte[] b = new byte[1024]; int l ; while ((l=fis.read(b))!=-1){ System.out.print(new String(b,0,l)); } fis.close(); }
(案列) 复制图片 需求: 把E:\\itcast\\mn.jpg复制到模块目录下的mn.jpg 思路: 1:根据数据源创建字节输入流对象 2:根据目的地创建字节输出流对象 3:读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组) 4:释放资源
public static void main(String[] args) throws IOException { //创建输出流对象 FileInputStream fis = new FileInputStream("D:\\就业班课程\\就业班se\\day08\\视频\\138_字节流复制图片.avi"); //创建输入流对象 FileOutputStream fos = new FileOutputStream("day08\\138_字节流复制图片.avi"); byte[] by = new byte[1024]; int len; while ((len=fis.read())!=-1){ fos.write(by,0,len); } fos.close(); fis.close(); } |