Java基础day17

  • Java基础day17-File&递归&字节流
  • 1.File类
    • 1.1File类概述和构造方法
    • 1.2File类创建功能
    • 1.3File类判断和获取功能
    • 1.4File类删除功能
  • 2.递归
    • 2.1递归
    • 2.2递归求阶乘
    • 2.3递归遍历目录
  • 3.IO流
    • 3.1 IO流概述和分类
    • 3.2字节流写数据
    • 3.3字节流写数据的三种方式
    • 3.4字节流写数据的两个小问题
    • 3.5字节流写数据加异常处理
    • 3.6字节流读数据(一次读一个字节数据)
    • 3.7字节流复制文本文件
    • 3.8字节流读数据(一次读一个字节数组数据)
    • 3.9字节流复制图片

Java基础day17-File&递归&字节流

1.File类

1.1File类概述和构造方法

  • File类介绍
    它是文件和目录路径名的抽象表示
    文件和目录是可以通过File封装成对象的
    对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以
    是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
  • File类的构造方法
方法名 说明
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例
import java.io.File;public class test1 {public static void main(String[] args) {//File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。File f1 = new File("E:\\itcast\\java.txt");System.out.println(f1);//File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。File f2 = new File("E:\\itcast","java.txt");System.out.println(f2);//File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File 实例。File f3 = new File("E:\\itcast");File f4 = new File(f3,"java.txt");System.out.println(f4);}

1.2File类创建功能

  • 方法分类
方法名 说明
public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
public boolean mkdir() 创建由此抽象路径名命名的目录
public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
import java.io.File;
import java.io.IOException;public class test2 {public static void main(String[] args) throws IOException {//需求1:我要在E:\\itcast目录下创建一个文件java.txtFile f1 = new File("E:\\itcast\\java.txt");System.out.println(f1.createNewFile()); System.out.println("------");//需求2:我要在E:\\itcast目录下创建一个目录JavaSEFile f2 = new File("E:\\itcast\\javase");System.out.println(f2.mkdir());System.out.println("------");//需求3:我要在E:\\itcast目录下创建一个多级目录JavaWEB\\HTMLFile f3 = new File("E:\\itcast\\JavaWEB\\HTML");System.out.println(f3.mkdirs());System.out.println("-------");//需求4:我要在E:\\itcast目录下创建一个文件javase.txtFile f4 = new File("E:\\itcast\\javase.txt");System.out.println(f4.createNewFile());}
}

1.3File类判断和获取功能

  • 判断功能
方法名 说明
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对象数组
import java.io.File;public class test3 {public static void main(String[] args) {//创建一个File对象File f = new File("myFile\\java.txt");// public boolean isDirectory():测试此抽象路径名表示的File是否为目录System.out.println(f.isDirectory());// public boolean isFile():测试此抽象路径名表示的File是否为文件System.out.println(f.isFile());// public boolean exists():测试此抽象路径名表示的File是否存在System.out.println(f.exists());// public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串System.out.println(f.getAbsoluteFile());// public String getPath():将此抽象路径名转换为路径名字符串System.out.println(f.getPath());// public String getName():返回由此抽象路径名表示的文件或目录的名称System.out.println(f.getName());System.out.println("-------");// public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组// public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组File f2 = new File("E:\\itcast");String[] list = f2.list();for (String s : list){System.out.println(s);}System.out.println("------");File[] files = f2.listFiles();for (File file :files){//            System.out.println(file);
//            System.out.println(file.getName());if (file.isFile()){System.out.println(file.getName());}}}
}

1.4File类删除功能

  • 方法分类
方法名 说明
public boolean delete() 删除由此抽象路径名表示的文件或目录
  • 示例代码
import java.io.File;
import java.io.IOException;public class test4 {public static void main(String[] args) throws IOException {//需求1:在当前模块目录下创建java.txt文件File f1 = new File("src\\java.txt");System.out.println(f1.createNewFile());//需求2:删除当前模块目录下的java.txt文件System.out.println(f1.delete());System.out.println("----");//需求3:在当前模块目录下创建itcast目录File f2 = new File("src\\itcast");System.out.println(f2.mkdir());//需求4:删除当前模块目录下的itcast目录System.out.println(f2.delete());System.out.println("--------");//需求5:在当前模块下创建一个目录itcast,然后在该目录下创建一个文件java.txtFile f3 = new File("src\\itcast");f3.mkdir();File f4 = new File("src\\itcast\\java.txt");System.out.println(f4.createNewFile());//需求6:删除当前模块下的目录itcastSystem.out.println(f4.delete());System.out.println(f3.delete());
}
}
  • 绝对路径和相对路径的区别
    绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\itcast\java.txt
    相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\java.txt

2.递归

2.1递归

  • 递归的介绍
    以编程的角度来看,递归指的是方法定义中调用方法本身的现象
    把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
    递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
  • 递归的基本使用
public class test5 {public static void main(String[] args) {//回顾不死神兔问题,求第20个月兔子的对数//每个月的兔子对数:1,1,2,3,5,8,...int[] arr = new int[20];arr[0] = 1;arr[1] = 1;for (int i = 2; i < arr.length; i++) {arr[i] = arr[i - 1] + arr[i - 2];}System.out.println(arr[19]);System.out.println(f(20));}/*递归解决问题,首先就是要定义一个方法:定义一个方法f(n):表示第n个月的兔子对数那么,第n-1个月的兔子对数该如何表示呢?f(n-1)同理,第n-2个月的兔子对数该如何表示呢?f(n-2)StackOverflowError:当堆栈溢出发生时抛出一个应用程序递归太深*/public static int f(int n) {if (n == 1 || n == 2) {return 1;} else {return f(n - 1) + f(n - 2);}}
}
  • 递归的注意事项
    递归一定要有出口。否则内存溢出
    递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出

2.2递归求阶乘

  • 案例需求
    用递归求5的阶乘,并把结果在控制台输出
  • 代码实现
public class test6 {public static void main(String[] args) {//调用方法int s = f(5);System.out.println(s);}//定义一个方法,用于递归求阶乘,参数为一个int类型的变量public static int f(int i) {if (i == 1) {return 1;} else {return  i*f(i-1);}}
}

2.3递归遍历目录

  • 案例需求
    给定一个路径(E:\itcast),通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台
  • 代码实现
import java.io.File;public class test7 {public static void main(String[] args) {//根据给定的路径创建一个File对象File f1 = new File("E:\\itcast");//调用方法getAllFilePath(f1);//定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象}//定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象private static void getAllFilePath(File f1) {//获取给定的File目录下所有的文件或者目录的File数组File[] files = f1.listFiles();//遍历该File数组,得到每一个File对象if (files != null){for (File file : files){//判断该File对象是否是目录if (file.isDirectory()){getAllFilePath(file);}else {System.out.println(file.getAbsolutePath());}}}}
}

3.IO流

3.1 IO流概述和分类

- IO流介绍IO:输入/输出(Input/Output)流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载
- IO流的分类按照数据的流向输入流:读数据输出流:写数据按照数据类型来分字节流字节输入流字节输出流字符流字符输入流字符输出流
- IO流的使用场景如果操作的是纯文本文件,优先使用字符流如果操作的是图片、视频、音频等二进制文件。优先使用字节流如果不确定文件类型,优先使用字节流。字节流是万能的流

3.2字节流写数据

  • 字节流抽象基类
    InputStream:这个抽象类是表示字节输入流的所有类的超类
    OutputStream:这个抽象类是表示字节输出流的所有类的超类
    子类名特点:子类名称都是以其父类名作为子类名的后缀
  • 字节输出流
    FileOutputStream(String name):创建文件输出流以指定的名称写入文件
  • 使用字节输出流写数据的步骤
    创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
    调用字节输出流对象的写数据方法
    释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
  • 示例代码
import java.io.FileOutputStream;
import java.io.IOException;public class test8 {public static void main(String[] args) throws IOException {//创建字节输出流对象//FileOutputStream(String name):创建文件输出流以指定的名称写入文件FileOutputStream fos = new FileOutputStream("src\\fos.txt");/* 做了三件事情:A:调用系统功能创建了文件B:创建了字节输出流对象C:让字节输出流对象指向创建好的文件 *///void write(int b):将指定的字节写入此文件输出流fos.write(97);fos.write(55);//最后都要释放资源//void close():关闭此文件输出流并释放与此流相关联的任何系统资源。fos.close();}
}

3.3字节流写数据的三种方式

  • 写数据的方法分类
方法名 说明
void write(int b) 将指定的字节写入此文件输出流 一次写一个字节数据
void write(byte[] b) 将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据
void write(byte[] b, int off, int len) 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流一次写一个字节数组的部分数据
  • 示例代码
import java.io.FileOutputStream;
import java.io.IOException;public class test9 {public static void main(String[] args) throws IOException {//FileOutputStream(String name):创建文件输出流以指定的名称写入文件FileOutputStream fos = new FileOutputStream("src\\fos.txt");//void write(int b):将指定的字节写入此文件输出流fos.write(97);fos.write(98);fos.write(99);fos.write(100);fos.write(101);
//      void write(byte[] b):将 b.length字节从指定的字节数组写入此文件输出流//byte[] bys = {97, 98, 99, 100, 101};//byte[] getBytes():返回字符串对应的字节数组byte[] bys = "abcdef".getBytes();//fos.write(bys);//void write(byte[] b, int off, int len):将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流
//        fos.write(bys,0,bys.length);fos.write(bys,0,3);//释放资源fos.close();}
}

3.4字节流写数据的两个小问题

  • 字节流写数据如何实现换行
    windows:\r\n
    linux:\n
    mac:\r
  • 字节流写数据如何实现追加写入
    public FileOutputStream(String name,boolean append)
    创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头
  • 示例代码
import java.io.FileOutputStream;
import java.io.IOException;public class test10 {public static void main(String[] args) throws IOException {//创建字节输出流对象FileOutputStream fos = new FileOutputStream("src\\fos.txt",true);//写数据for (int i = 0;i<10;i++){fos.write("hello".getBytes());fos.write("\r\n".getBytes());}//释放资源fos.close();}
}

3.5字节流写数据加异常处理

  • 异常处理格式
    try-catch-finally
try{可能出现异常的代码;
}catch(异常类名 变量名){ 异常的处理代码;
}finally{ 执行所有清除操作;
}
finally特点被finally控制的语句一定会执行,除非JVM退出
  • 示例代码
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class test11 {public static void main(String[] args) {//加入finally来实现释放资源FileOutputStream fos = null;try {fos = new FileOutputStream("src\\fos.txt");fos.write("hello".getBytes());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
}

3.6字节流读数据(一次读一个字节数据)

  • 字节输入流
    FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream ,该文件由文
    件系统中的路径名name命名
  • 字节输入流读取数据的步骤
    创建字节输入流对象
    调用字节输入流对象的读数据方法
    释放资源
  • 示例代码
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class test12 {public static void main(String[] args) throws IOException {//创建字节输入流对象//FileInputStream(String name)FileInputStream fis = new FileInputStream("src\\fos.txt");int by;/*fis.read():读数据by=fis.read():把读取到的数据赋值给byby != -1:判断读取到的数据是否是-1*/while ((by = fis.read()) != -1){System.out.println((char)by);}//释放资源fis.close();}
}

3.7字节流复制文本文件

  • 案例需求
    把“E:\itcast\窗里窗外.txt”复制到模块目录下的“窗里窗外.txt”
  • 实现步骤
    复制文本文件,其实就把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)
    数据源:
    E:\itcast\窗里窗外.txt — 读数据 — InputStream — FileInputStream
    目的地:
    myByteStream\窗里窗外.txt — 写数据 — OutputStream — FileOutputStream
  • 代码实现
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class test13 {public static void main(String[] args) throws IOException {//根据数据源创建字节输入流对象FileInputStream fis = new FileInputStream("E:\\itcast\\窗里窗外.txt");//根据目的地创建字节输出流对象FileOutputStream fos = new FileOutputStream("src\\窗里窗外.txt");//读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)int by;while ((by = fis.read()) != -1){fos.write(by);}//释放资源fos.close();fis.close();}
}

3.8字节流读数据(一次读一个字节数组数据)

  • 一次读一个字节数组的方法
    public int read(byte[] b):从输入流读取最多b.length个字节的数据
    返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
  • 示例代码
import java.io.FileInputStream;
import java.io.IOException;public class test14 {public static void main(String[] args) throws IOException {//创建字节输入流对象FileInputStream fis = new FileInputStream("src\\fos.txt");/*hello\r\nworld\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();}
}

3.9字节流复制图片

  • 案例需求
    把“E:\itcast\mn.jpg”复制到模块目录下的“mn.jpg”

  • 实现步骤
    根据数据源创建字节输入流对象
    根据目的地创建字节输出流对象
    读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
    释放资源

  • 代码实现

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class test15 {public static void main(String[] args) throws IOException {//根据数据源创建字节输入流对象FileInputStream fis = new FileInputStream("E:\\itcast\\mn.jpg");//根据目的地创建字节输出流对象FileOutputStream fos = new FileOutputStream("src\\mn.jpg");//读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)byte[] bys = new byte[1024]; //1024及其整数倍int len;while ((len=fis.read(bys))!=-1) {fos.write(bys,0,len);}//释放资源fos.close();fis.close();}
}

Java基础day17相关推荐

  1. Java基础 DAY17

    1 抽象类 1.1 抽象类引出 当一个类中存在抽象方法时,需要将该类声明为abstract类 所谓抽象方法就是没有实现的方法(没有方法体) 一般来说,抽象类会被继承,有其子类来实现抽象方法. pack ...

  2. 视频教程-清华-尹成老师-java基础-Day17-Java

    清华-尹成老师-java基础-Day17 毕业于清华大学,曾担任Google算法工程师,微软人工智能领域全球最具价值专家,微软Tech Ed 大会金牌讲师. 精通C/ C++,Python ,Go语言 ...

  3. java基础学习_IO流03_字符流、IO流小结、案例_day21总结

    java基础学习_IO流03_字符流.IO流小结.案例_day21总结 ================================================================ ...

  4. Java基础入门语法和安装

    1. Java概述 1.1 Java语言背景介绍(了解) 语言:人与人交流沟通的表达方式 计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言 Java语言是美国Sun公司(Stanford Un ...

  5. Java笔记整理-02.Java基础语法

    1,标识符 由英文字母.数字._(下划线)和$组成,长度不限.其中英文字母包含大写字母(A-Z)和小写字母(a-z),数字包含0到9. 标识符的第一个字符不能是数字(即标识符不能以数字开头). 标识符 ...

  6. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

  7. Java基础概念性的知识总结

    属于个人的所学的知识总结,不是全面的 1.JDK.JRE和JVM三者的区别 01.JDK:(Java Development ToolKit)Java开发工具包,是整个Java的核心.包括了Java的 ...

  8. 我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:hsm_computer www.cnblogs.com/J ...

  9. 叮!您收到一份超值Java基础入门资料!

    摘要:Java语言有什么特点?如何最大效率的学习?深浅拷贝到底有何区别?阿里巴巴高级开发工程师为大家带来Java系统解读,带你掌握Java技术要领,突破重点难点,入门面向对象编程,以详细示例带领大家J ...

最新文章

  1. 数据管理、数据治理、数据管控的概念区别和范围是什么?
  2. Unity Time的使用
  3. Windows Socket 最大连接数
  4. pymysql 写入数据
  5. 面试 Java 高级后端开发,要准备哪些知识点?
  6. 机械硬盘提示操作无法完成,因为磁盘管理控制台视图不是最新状态要如何办啊...
  7. RabbitMQ远程不能访问问题的解决
  8. 【最优解法】1087 有多少不同的值 (20分)_17行代码AC
  9. MySql,Sql Server分区技术浅析
  10. java飞行_运行java飞行记录器JFR(java flight recorder)
  11. 二叉树的创建与遍历(C++)
  12. CSDN送你互联网大厂面试机会啦!
  13. 光声光谱技术和激光、红外技术的优劣势对比
  14. Java开发者必备十大学习网站
  15. 编辑为什么建议转投_为何投文章总被拒?听听期刊编辑的干货建议
  16. 【论文笔记】Question Answering with Subgraph Embeddings
  17. 手把手教会搭建网站详细全过程(从域名到网站部署)
  18. 回味陈年老酒----DOS
  19. QT comboBox设置下拉菜单()
  20. 如何制作京东自提点地图?

热门文章

  1. 【Ray Tracing in One Weekend 超详解】 光线追踪1-7 Dielectric 半径为负,实心球体镂空技巧...
  2. 【tomcat】手动部署动态JavaWeb项目到tomcat
  3. Android程序员的进阶之路
  4. js 继承的几种方式
  5. PHP使用GD库封装验证码类
  6. 渗透测试网络环境搭建
  7. Scala, Groovy, Clojure, Jython, JRuby and Java ----我们的工作语言
  8. 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组
  9. 精灵方向移动问题[math.floor]
  10. iOS开发基础-九宫格坐标(4)