Day22 Java IO流 File、IO流的字节输出流
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流的字节输出流相关推荐
- Java API(2) File IO 异常 多线程 01-05
文章目录 day01 File类 创建一个新文件 删除一个文件 创建目录 删除目录 访问一个目录中的所有子项 获取目录中符合特定条件的子项 Lambda表达式 day02 JAVA IO Java定义 ...
- Java笔记整理六(File类,递归,字节流IO,字符流IO,流中的异常处理,属性集Properties,缓冲流,转换流,序列化,打印流)
1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 文件和目录路径名的抽象表示 java把文件和文件夹封装位为一个File类,我们可 ...
- Java基础(三)IO流和对象流
文件及IO流 File类 1.来自于java.io包 2.是文件和目录路径名的抽象表示 3.文件和目录可以通过File封装为对象 4.对于File而言,封装的不是真正存在的文件,仅仅是封装一个路径,路 ...
- java之高级的IO流,字符流与字节流
IO流 今日内容介绍 标准输入流 & 转换流 & 打印流 对象操作流 Properties集合 第1章标准输入流 & 转换流 & 打印流 1.1标准输入输出 ...
- IO流基本知识总结【字节输入输出流、字符输入输出流、转换流、对象流】
1.概述: 流是可以承载东西的数据流:java中io流也是用来承载运输数据的. 2.分类: 1.按流向分:[参考内存:进入内存叫做输入,出内存叫做输出] 1.输入流:承载数据进入内存的流叫做输入流 2 ...
- Java I/O流(File、字节流、字符流、过滤流、对象流)详解
File以及I/O流 一.File类的使用 java.io.File类 代表硬盘上的一个文件或者目录 java.io.File类作用: 每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文 ...
- 01-21 IO流(字符流与字节流)
IO流(字符流与字节流) 今日内容介绍 标准输入流 & 转换流 & 打印流 对象操作流 Properties集合 第1章标准输入流 & 转换流 & 打印流 ...
- java(十)【属性集,缓冲流、转换流、序列化流】
day10[缓冲流.转换流.序列化流] 今日目标 IO资源的处理. finnally释放资源 jdk 1.7开始的新技术 try-with-resources 缓冲流 提高字节流和字符流读写数据的性能 ...
- 缓冲流,转换流,序列化流,网络编程
一,缓冲流 能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等.这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,相当于是对基本流对象的一种增强.1.1 概述 缓冲 ...
- (字节流与字符流)OutputStream字节输出流
字节输出流:OutputStream 字节的数据是以byte类型为主实现的操作,在进行字节内容输出的时候可以使用OutPutStream完成,这个类的基本定义如下: public abstract c ...
最新文章
- agc018B Sports Festival
- xpath提取html属性,xpath提取 html标签的文字内容
- MySQL - 库表设计之IP和TIMESTAMP的处理
- html 设置视频尺寸,如何使用CSS控制视频的宽高?
- why-use-getters-and-setters
- pat 1034. Head of a Gang (30)
- UVA - 11846 Finding Seats Again (DFS搜索对象)
- 云开发新能力,支持 HTTP 调用 API
- python移动平均线绘图_对python pandas 画移动平均线的方法详解
- Python深入06 Python的内存管理
- 好用到爆!轻松获取PNG透明图片!
- 前景看淡,移动医疗九成或将成炮灰
- python knn预测双色球_用KNN和回归分析进行预测(python)
- html滑动验证到最右边,jQuery滑块拖动到最右边验证插件
- NLP自然语言处理-文本摘要简述
- Agile Scrum WaterFall通俗易懂的全过程整理
- 循环结构(计算0到100之间的奇数和偶数的和)
- 19年深圳杯D题之爬取电视收视率排行榜
- 移动端与PC端设计的几项要点
- 期货手续费标准和保证金比例
热门文章
- Volecity模板引擎学习笔记一
- Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java12 的新特性
- 查看cuda版本以及torch版本
- 如果一个网站的服务器停了还可以解绑域名么,关于域名,怎么解除危险网站
- Spring Cloud Stream消息中间件通过RabbitMQ实现消息推送
- 对Spring AOP的理解
- 锐捷网络交换机配置命令大全,网络工程师收藏!
- 一个Netfilter nf_conntrack流表查找的优化-为conntrack增加一个per cpu cache
- 再读苹果《Threading Programming Guide》笔记(一):初识线程
- latex 字母加粗