File

概述:

想要实现IO流操作,就必须要知道硬盘上文件的表现形式

Java提供了一个类让我们操作硬盘上的文件:File。File也就是文件的表现形式

File:文件和目录(文件夹)路径名的抽象表示。

File类的构造方法

public File(String pathname)

通过将给定的路径名字符串转换为抽象路径名来创建新的File实例。 如果给定的字符串是空字符串,则结果是空的抽象路径名。

public File(String parent,String child)

从父路径名字符串和子路径名字符串创建新的File实例。

public File(File parent,String child)

从父抽象路径名和子路径名字符串创建新的File实例。

代码举例:

import java.io.File;public class Demo1 {public static void main(String[] args) {
//        根据一个路径得到一个对象File file = new File("D:\\IdeaProjects\\a.txt");System.out.println(file);
//        根据父子路径得到对象File file1 = new File("D:\\IdeaProjects", "b.txt");System.out.println(file1);
//        将父路径粉装成一个File,再根据父子路径得到对象File file2 = new File("D:\\IdeaProjects");File file3 = new File(file2, "c.txt");System.out.println(file3);}
}

结果:这里得到的结果都是绝对路径

File类的成员方法

创建功能:

public boolean createNewFile()

创建由此抽象路径名命名的目录,如果目标文件夹已经存在,就不创建了,返回false

public boolean mkdir()

当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。

public boolean mkdirs() 创建多级文件夹

代码举例:

import java.io.File;
import java.io.IOException;public class Demo2 {public static void main(String[] args) {File file = new File("D:\\IdeaProjects\\demo");
//        封装成File对象,不需要文件或者目录是否已经存在,它只是将一个路径抽象的用File表示
//        在指定路径下创建一个文件夹demoSystem.out.println(file.mkdir());
//        在demo下创建一个文件a.txt,这里需要对编译时期异常做处理
//        将目标文件封装成一个FileFile file1 = new File("D:\\IdeaProjects\\demo\\a.txt");try {System.out.println(file1.createNewFile());} catch (IOException e) {e.printStackTrace();}
//        创建多级文件夹File file2 = new File("D:\\IdeaProjects\\demo2\\demo3\\demo4");System.out.println(file2.mkdirs());
//        在一个不存在的目录下创建一个文件File file3 = new File("D:\\IdeaProjects\\demo5\\b.txt");try {System.out.println(file3.createNewFile());} catch (IOException e) {e.printStackTrace();}}
}

结果:

在相对应硬盘文件夹中会产生对应操作的结果:

注意:若是想在某个目录下创建文件,前提是该目录必须存在。且需要清楚到底需要创建文件夹还是文件。

删除功能

public boolean delete() 

代码举例:

import java.io.File;
import java.io.IOException;public class Demo4 {public static void main(String[] args) {
//        创建一个文件File file = new File("D:\\IdeaProjects\\a.txt");try {System.out.println(file.createNewFile());} catch (IOException e) {e.printStackTrace();}
//        删除文件System.out.println(file.delete());
//        删除多级文件夹。必须保证被删除的文件夹内容为空File file1 = new File("D:\\IdeaProjects\\demo2\\demo3\\demo4");System.out.println(file1.delete());//删除demo4File file2 = new File("D:\\IdeaProjects\\demo2\\demo3");System.out.println(file2.delete());//删除demo3File file3 = new File("D:\\IdeaProjects\\demo2");System.out.println(file3.delete());//删除demo2}
}

结果:

重命名功能

public boolean renameTo(File dest)

代码举例:

import java.io.File;public class Demo4 {public static void main(String[] args) {File file = new File("D:\\dlam.jpg");File file1 = new File("D:\\哆啦A梦.jpg");System.out.println(file.renameTo(file1));}
}

输出结果:true,相应的文件被更改名字

判断功能

public boolean isDirectory():

判断是否是文件夹

public boolean isFile():

判断是否是文件

public boolean exists():

判断目标文件或者文件夹是否存在

public boolean canRead():

判断是否可读

public boolean canWrite();

判断是否可写

public boolean isHidden():

判断是否隐藏

代码举例:对之前在demo文件夹中创建的a.txt文件进行判断,其属性为可读可写没隐藏

import java.io.File;public class Demo5 {public static void main(String[] args) {File file = new File("D:\\IdeaProjects\\demo\\a.txt");System.out.println(file.isDirectory());System.out.println(file.isFile());System.out.println(file.exists());System.out.println(file.canRead());System.out.println(file.canWrite());System.out.println(file.isHidden());}
}

结果:

获取功能

基本获取功能

public String getAbsolutePath():获取绝对路径

public String getPath():获取相对路径

public String getName():获取名称

public long length():获取文件的字节数

public long lastModified():获取文件的一个时间戳

代码举例:

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;public class Demo6 {public static void main(String[] args) {File file = new File("D:\\IdeaProjects\\demo\\a.txt");System.out.println(file.getAbsolutePath());System.out.println(file.getPath());System.out.println(file.getName());System.out.println(file.length());System.out.println(file.lastModified());
//        该时间戳直接输出的结果无法理解,需要与日期类做转换
//        分配一个 Date对象,并将其初始化为表示自称为“时代”的标准基准时间以后的指定毫秒数,即1970年1月1日00:00:00 GMT。Date date = new Date(file.lastModified());SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String format = sdf.format(date);System.out.println(format);}
}

结果:

高级获取功能

 public String[] list():获取指定目录下的所有文件和文件夹的名称组成的数组

public File[] listFiles():获取指定目录下的所有文件和文件夹形成的File对象数组

代码举例:

import java.io.File;public class Demo7 {public static void main(String[] args) {File file = new File("D:\\IdeaProjects");String[] list = file.list();for(String s : list){System.out.println(s);}System.out.println("-------------");File[] files = file.listFiles();for (File f : files){System.out.println(f);}}
}

结果:

需求:判断D盘下有没有.jpg后缀的文件,如果有,就输出此文件名称

分析:将D盘封装成一个File对象,再获取该目录下的所有文件和文件夹组成的File数组,遍历数组得到每一个File对象,对每一个对象进行判断是否是文件,若是则判断是否以.jpg结尾,是就输出

代码实现:

import java.io.File;public class Demo8 {public static void main(String[] args) {File file = new File("D:\\");File[] files = file.listFiles();for(File f : files){if(f.isFile()){if(f.getName().endsWith(".jpg")){//判断文件名称是否以.jpg结尾System.out.println(f.getName());}}}}
}

结果:D盘下只有一个.jpg文件

另一种实现方法:

文件名称过滤器的实现思想和代码:

public String[] list(FilenameFilter filter)

public File[] listFiles(FilenameFilter filter)

这两个代码都是在获取文件夹和文件组成的数组时,只获取满足条件的数据,不需要遍历,只要获取完直接输出就是满足条件的数据

源码中过滤器是一个接口,其中有一个布尔类型的accept方法,所以在调用时需要重写accept方法

代码实现:

import java.io.File;
import java.io.FilenameFilter;public class Demo9 {public static void main(String[] args) {File file = new File("D:\\");
//        使用匿名内部类创建过滤器对象String[] list = file.list(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {
//                return false;
//                目录下的文件或文件夹获不获取,取决于返回值
//                通过输出测试:dir是文件所在绝对路径,name是文件名称File file1 = new File(dir, name);boolean b = file1.isFile();boolean b1 = name.endsWith(".jpg");return b && b1;}});for (String s : list){System.out.println(s);}}
}

结果:同上述输出结果一样

递归

概述:方法定义中调用方法本身的现象

斐波那契数列(兔子问题)举例:从第三天开始,每天兔子的数量是前两天数量之和,求第20天兔子的数量。

/*递归斐波那契数列(兔子问题)*/
public class FDemo9 {public static void main(String[] args) {int rabbit = Fibonacci(20);System.out.println(rabbit);}public static int Fibonacci(int i){if(i==1 | i==2){return 1;}else{return Fibonacci(i-1)+Fibonacci(i-2);}}}

结果:

递归删除带内容的目录

代码实现:

import java.io.File;/*递归删除带内容的目录分析:1、获取File对象2、获取该目录下所有的文件和文件夹组成的File对象数组3、遍历数组得到每一个File对象4、判断这个File对象是否是文件夹是:返回第二步不是:直接删除*/
public class FDemo3 {public static void main(String[] args) {File file = new File("D:\\IdeaProjects\\Data15\\aaa");deleteFile(file);}public static void deleteFile(File file){File[] files = file.listFiles();for (File f : files){if(f.isDirectory()){deleteFile(f);}else{System.out.println(f.getName()+"---"+f.delete());}}System.out.println(file.getName()+"---"+file.delete());}
}

结果:

IO流

IO流用来处理设备之间的数据传输

IO流的分类:

流向:

输入流 读取数据,从硬盘中读取数据到Java程序中

输出流 写出数据,从Java程序中输出数据到硬盘中

数据类型:

字节流

字节输入流 读取数据 InputStream

字节输出流 写出数据 OutputStream

字符流

字符输入流 读取数据 Reader

字符输出流 写出数据 Writer

字节流:

写数据:

OutputStream FileOutputStream  创建文件输出流以写入由指定的 File对象表示的文件。

需求:往D:\IdeaProjects\demo下的a.txt中输入一行"yyds"。

这里最好使用字符流来操作,但这里使用字节流来操作

这里使用OutputStream,他是一个抽象类,不能直接实例化。

所以需要他的一个子类FileOutputStream

FileOutputStream的构造方法:

FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件。

FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。

代码实现:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;public class IOdemo1 {public static void main(String[] args) throws Exception{File file = new File("D:\\IdeaProjects\\demo\\a.txt");FileOutputStream fos = new FileOutputStream(file);
//      若这里目标文件没有,则会自动创建fos.write("yyds".getBytes());
//        若此时继续执行一遍,会将yyds覆盖掉//释放资源//close()关闭此文件输出流并释放与此流相关联的任何系统资源。fos.close();}
}

输出结果是什么都没有,但此时a.txt文件中以及有了yyds的内容

代码中提到:操作完写数据操作后需要释放资源,否则会一直占用栈内存,若后续还有很多操作,则可能会造成内存溢出。

字节输出流写数据的几种方法:

public void write(int b)

public void write(byte[] b)

public void write(byte[] b,int off,int len):从位于偏移量 off的指定字节数组写入 len字节到该文件输出流。

代码举例:

import java.io.FileOutputStream;public class IOdemo2 {public static void main(String[] args) throws Exception {//创建字节输出流对象FileOutputStream fos = new FileOutputStream("D:\\IdeaProjects\\demo\\a.txt");//public void write(int b)//97,底层存储的二进制,97对应的ASCII码的字符是afos.write(97);fos.write(48);fos.write(65);//public void write(byte[] b)byte[] byts = {97, 98, 99, 100, 101};fos.write(byts);//public void write(byte[] b,int off,int len)//从位于偏移量 off的指定字节数组写入 len字节到该文件输出流。fos.write(byts, 1, 3);//释放资源fos.close();}
}

输出结果:需要在a.txt中查看:

当在释放资源后,再次使用FileOutputStream创建一个新的对象时,再向其中添加内容时,之前的内容会被覆盖。或者当在一个原本就含有内容的文件中写数据时,写入的数据会覆盖掉文件中原有的内容,这样就是没有实现追加。

实现追加与换行:当在文件中写入数据后,文件中原本的内容不会被覆盖

FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。 true表示的是可以追加写入数据

代码举例:

import java.io.FileOutputStream;public class IOdemo3 {public static void main(String[] args) throws Exception{FileOutputStream fos = new FileOutputStream("D:\\IdeaProjects\\demo\\a.txt",true);
//            实现换行,只需要加入换行符即可fos.write("\r\n今天下雪了\r\n".getBytes());fos.write("但没有积雪".getBytes());fos.close();}
}

输出结果:

什么情况下,用字节流还是字符流,如果你操作的是记事本打开能看懂的数据,就用字符流,如果看不懂就用字节流
如果你不知道用什么流,就用字节流,字符流是建立在字节流的基础上出现的。

Day22 Java IO流 File、IO流的字节输出流相关推荐

  1. Java API(2) File IO 异常 多线程 01-05

    文章目录 day01 File类 创建一个新文件 删除一个文件 创建目录 删除目录 访问一个目录中的所有子项 获取目录中符合特定条件的子项 Lambda表达式 day02 JAVA IO Java定义 ...

  2. Java笔记整理六(File类,递归,字节流IO,字符流IO,流中的异常处理,属性集Properties,缓冲流,转换流,序列化,打印流)

    1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 文件和目录路径名的抽象表示 java把文件和文件夹封装位为一个File类,我们可 ...

  3. Java基础(三)IO流和对象流

    文件及IO流 File类 1.来自于java.io包 2.是文件和目录路径名的抽象表示 3.文件和目录可以通过File封装为对象 4.对于File而言,封装的不是真正存在的文件,仅仅是封装一个路径,路 ...

  4. java之高级的IO流,字符流与字节流

    IO流 今日内容介绍  标准输入流 & 转换流 & 打印流  对象操作流  Properties集合 第1章标准输入流 & 转换流 & 打印流 1.1标准输入输出 ...

  5. IO流基本知识总结【字节输入输出流、字符输入输出流、转换流、对象流】

    1.概述: 流是可以承载东西的数据流:java中io流也是用来承载运输数据的. 2.分类: 1.按流向分:[参考内存:进入内存叫做输入,出内存叫做输出] 1.输入流:承载数据进入内存的流叫做输入流 2 ...

  6. Java I/O流(File、字节流、字符流、过滤流、对象流)详解

    File以及I/O流 一.File类的使用 java.io.File类 代表硬盘上的一个文件或者目录 java.io.File类作用: 每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文 ...

  7. 01-21 IO流(字符流与字节流)

    IO流(字符流与字节流) 今日内容介绍  标准输入流 & 转换流 & 打印流  对象操作流  Properties集合 第1章标准输入流 & 转换流 & 打印流 ...

  8. java(十)【属性集,缓冲流、转换流、序列化流】

    day10[缓冲流.转换流.序列化流] 今日目标 IO资源的处理. finnally释放资源 jdk 1.7开始的新技术 try-with-resources 缓冲流 提高字节流和字符流读写数据的性能 ...

  9. 缓冲流,转换流,序列化流,网络编程

    一,缓冲流 能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等.这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,相当于是对基本流对象的一种增强.1.1 概述 缓冲 ...

  10. (字节流与字符流)OutputStream字节输出流

    字节输出流:OutputStream 字节的数据是以byte类型为主实现的操作,在进行字节内容输出的时候可以使用OutPutStream完成,这个类的基本定义如下: public abstract c ...

最新文章

  1. agc018B Sports Festival
  2. xpath提取html属性,xpath提取 html标签的文字内容
  3. MySQL - 库表设计之IP和TIMESTAMP的处理
  4. html 设置视频尺寸,如何使用CSS控制视频的宽高?
  5. why-use-getters-and-setters
  6. pat 1034. Head of a Gang (30)
  7. UVA - 11846 Finding Seats Again (DFS搜索对象)
  8. 云开发新能力,支持 HTTP 调用 API
  9. python移动平均线绘图_对python pandas 画移动平均线的方法详解
  10. Python深入06 Python的内存管理
  11. 好用到爆!轻松获取PNG透明图片!
  12. 前景看淡,移动医疗九成或将成炮灰
  13. python knn预测双色球_用KNN和回归分析进行预测(python)
  14. html滑动验证到最右边,jQuery滑块拖动到最右边验证插件
  15. NLP自然语言处理-文本摘要简述
  16. Agile Scrum WaterFall通俗易懂的全过程整理
  17. 循环结构(计算0到100之间的奇数和偶数的和)
  18. 19年深圳杯D题之爬取电视收视率排行榜
  19. 移动端与PC端设计的几项要点
  20. 期货手续费标准和保证金比例

热门文章

  1. Volecity模板引擎学习笔记一
  2. Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java12 的新特性
  3. 查看cuda版本以及torch版本
  4. 如果一个网站的服务器停了还可以解绑域名么,关于域名,怎么解除危险网站
  5. Spring Cloud Stream消息中间件通过RabbitMQ实现消息推送
  6. 对Spring AOP的理解
  7. 锐捷网络交换机配置命令大全,网络工程师收藏!
  8. 一个Netfilter nf_conntrack流表查找的优化-为conntrack增加一个per cpu cache
  9. 再读苹果《Threading Programming Guide》笔记(一):初识线程
  10. latex 字母加粗