public class FileDemo {
public static void main(String[] args) {
File dir = new File(“E:\a”);
getAllDir(dir);
}
// 定义方法,实现目录的全遍历
private static void getAllDir(File dir) {
//调用方法listFiles()对目录,dir进行遍历
File[] fileArr = dir.listFiles();
for(File f : fileArr){
//判断变量f表示的路径是不是文件夹,是,则递归遍历
if(f.isDirectory()){
getAllDir(f);
}else{
System.out.println(f);
}
}
}
}
##二、IO流
###1. 概述
IO流用来处理设备之间的 数据传输
Java对数据的操作是通过 流 的方式
Java用于操作流的对象都在 IO包 中(input/output)
Output操作:把内存中的数据存储到持久化设备上这个动作称为输出(写)
Input操作:把持久设备上的数据读取到内存中的这个动作称为输入(读)
流的分类:
流按流向分为两种:
输出流:内存——>外设(写出数据)
输入流:磁盘——>内存(读入数据)
流按操作类型分为两种:
字节流:字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
字符流:字符流只能操作纯字符数据,比较方便。
###2. IO流常用父类
字节流的抽象父类:InputStream ,OutputStream
字符流的抽象父类:Reader , Writer
##三、字节输出流
###1. 概述
java.io.OutputStream 此抽象类,是表示输出字节流的所有类的超类。操作的数据都是 字节
##2. OutputStream 的核心方法:
void close(): 关闭此输出流并释放与此流有关的所有系统资源。
close的常规协定:该方法将关闭输出流。关闭的流不能执行输出操作,也不能重新打开。
如果流对象建立失败了,需要关闭资源吗?
new 对象的时候,失败了,没有占用系统资源;释放资源的时候,对流对象判断null,变量不是null,对象建立成功,需要关闭资源
write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流
write(byte[] b, int off, int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
write(int b): 将指定的字节写入此输出流。write 的常规协定:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。
###3. FileOutputStream 类
####(1) 构造方法
FileOutputStream(File file) :创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append): 创建一个向指定 File 对象表示的文件中写入数据的文件输出流,以追加的方式写入。
FileOutputStream(String name) :创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append) :创建一个向具有指定 name 的文件中写入数据的输出文件流,以追加的方式写入。
####(2) 流对象的使用步骤:
创建流子类的对象,绑定数据目的
调用流对象的方法write写
close释放资源
注意事项:流对象的构造方法,可以创建文件,如果文件存在,直接覆盖
public class IoDemo {
public static void main(String[] args) throws IOException {
//创建流子类的对象,绑定数据目的
FileOutputStream fos = new FileOutputStream(“E:\a.txt”);
//用write方法写数据
//写一个字节
fos.write(100); //d
//写字节数组
byte[] bytes = {65,66,67,68}; //ABCD
fos.write(bytes);
//写字节的一部分,开始索引,写几个
fos.write(bytes,1,1); //B
//写入字节数组的简便方式
//写字符串
fos.write(“Hello”.getBytes());
//关闭资源
fos.close();
}
}
###4. 文件的续写和换行
####(1)实现数据的换行
在文件中,写入换行符号换行: \r\n
\r\n 可以写在上一行的末尾, 也可以写在下一行的开头
fos.write(“hello\r\n”.getBytes());
####(2)关于数据的追加写入
默认情况下,当一个文件输出流对象,指向一个文件的时候,会清空文件内容
必须使用特殊的构造方法实现文件的追加写入,FileOutputStream构造方法, 的第二个参数中加入 true
//实现追加写入:
FileOutputStream fos = new FileOutputStream(file, true);
###5. IO异常的处理
一些细节:
保证流对象变量,作用域足够
catch里面处理异常
输出异常的信息,目的看到哪里出现了问题,停下程序,从新尝试
如果流对象建立失败了,需要关闭资源吗
new 对象的时候,失败了,没有占用系统资源;释放资源的时候,对流对象判断 null;变量不是 null,对象建立成功,需要关闭资源
public class FileOutputStreamDemo3 {
public static void main(String[] args) {
File file = new File(“c:\file.txt”);
//try 外面声明变量,try 里面建立对象,为了提升流对象作用域
//定义FileOutputStream的引用
FileOutputStream fos = null;
try {
//创建FileOutputStream对象
fos = new FileOutputStream(file);
//写出数据
fos.write(“abcde”.getBytes());
} catch (IOException e) {
System.out.println(e.toString() + “----”);
throw new RuntimeException(“文件写入失败,重试”);
} finally {
//一定要判断fos是否为null,只有不为null时,才可以关闭资源
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
throw new RuntimeException(“关闭资源失败”);
}
}
}
}
}
##四、字节输入流
###1. 概述
java.io.InputStream: 此抽象类是表示字节输入流的所有类的超类。读取任意文件,每次只读取1个字节
###2. 核心方法
abstract int read():读取一个字节
read()方法的特点:read() 执行一次,就会自动读取下一个字节,返回值是读取到的字节, 读取到结尾返回 -1
public class IoDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流的子类对象
FileInputStream fis = new FileInputStream(“E:\a.txt”); //ABCD
//读取一个字节,调用read方法,返回int
//使用循环方式,读取文件,循环结束的条件:read() 返回 -1
int len = 0; //接收read()的返回值
while((len = fis.read()) != -1){
System.out.print((char)len); //可以转换成字符
}
//关闭资源
fis.close();
}
}
int read(byte[] b):读取一定数量的字节,并将其存储在缓冲区数组 b 中
int read(byte[] b, int off, int len) :读取最多 len 个字节,存入 byte 数组。
数组的作用:缓冲的作用, 提高效率
read 返回的 int,表示读取到多少个有效的字节数
public class IoDemo {
public static void main(String[] args) throws IOException {
//创建字节输入流的子类对象
FileInputStream fis = new FileInputStream(“E:\a.txt”);
//创建字节数组
byte[] b = new byte[1024];
int len = 0;
while((len = fis.read(b)) != -1){
System.out.print(new String(b,0,len)); //使用String的构造方法,转为字符串
}
//关闭资源
fis.close();
}
}
###3. FileInputStream 类
####(1)构造方法
为这个流对象 绑定数据源
FileInputStream(File file)
FileInputStream(String name)
参数:File对象 和 String对象
####(2)输入流读取文件的步骤
创建字节输入流的子类对象
调用读取方法 read 读取
关闭资源
####(3)读取数据的方式:
第一种方式:一次读取一个字节数据
第二种方式:一次读取一个字节数组
第二种方式效率更高,每次读取都会和操作系统发生一次交互,第二种方式每次可以读取多个数据,提高了操作效率
####4、释放资源的另一种方式
//1.第一种释放资源的方式 closeQuietly
//释放输入流资源
closeQuietly(fis);
//释放输出流对象
closeQuietly(fos);
private static void closeQuietly(Closeable close) {
if(close != null) {
try {
close.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//2.jdk7 中引入的 try-with-resource语句
try(放申请资源的语句){
}catch() {
}
// 一旦资源的申请放在try-with-resource语句的()中,那么资源会保证一定自动被释放
##五、字节流文件复制
###1. 读取单个字节
public class Copy {
public static void main(String[] args) {
long s = System.currentTimeMillis();
//定义两个流的对象变量
FileInputStream fis = null;
FileOutputStream fos = null;
try{
//建立两个流的对象,绑定数据源和数据目的
fis = new FileInputStream(“D:\test.mp3”); //8,003,733 字节
fos = new FileOutputStream(“d:\test.mp3”);
//字节输入流,读取1个字节,输出流写1个字节
int len = 0 ;
while((len = fis.read())!=-1){
fos.write(len);
}
}catch(IOException e){
System.out.println(e);
throw new RuntimeException(“文件复制失败”);
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException e){
throw new RuntimeException(“释放资源失败”);
}finally{
try{
if(fis!=null)
fis.close();
}catch(IOException e){
throw new RuntimeException(“释放资源失败”);
}
}
}
long e = System.currentTimeMillis();
System.out.println(e-s);
}
}
//耗时:61817
###2. 读取字节数组
public class Copy_1 {
public static void main(String[] args) {
long s = System.currentTimeMillis();
FileInputStream fis = null;
FileOutputStream fos = null;
try{
fis = new FileInputStream(“D:\test.mp3”);
fos = new FileOutputStream(“E:\test.mp3”);
//定义字节数组,缓冲
byte[] bytes = new byte[1024*10];
//读取数组,写入数组
int len = 0 ;
while((len = fis.read(bytes))!=-1){
fos.write(bytes, 0, len);
}
}catch(IOException e){
System.out.println(e);
throw new RuntimeException(“文件复制失败”);
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException e){
throw new RuntimeException(“释放资源失败”);
}finally{
try{
if(fis!=null)
fis.close();
}catch(IOException e){
throw new RuntimeException(“释放资源失败”);
}
}
}
long e = System.currentTimeMillis();
System.out.println(e-s);
}
}
//耗时:41
##六、字符输出流
###1. 概述
java.io.Writer 所有字符输出流的超类。写文件,写 文本文件
###2. 方法介绍
void write(int c):写入单个字符
void write(String str) :写入字符串
void write(String str, int off, int len):写入字符串的某一部分
void write(char[] cbuf):写入字符数组
abstract void write(char[] cbuf, int off, int len) :写入字符数组的某一部分
###3. FileWriter 类
Writer 类是抽象类,找到子类对象 FileWriter
构造方法:参数也是 File 类型对象 和 String 文件名
字符输出流,写数据的时候,必须要运行一个功能,刷新功能:flush()
public class WriterDemo {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter(“c:\1.txt”);
//写1个字符
fw.write(100);
fw.flush();
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
《MySql面试专题》
《MySql性能优化的21个最佳实践》
《MySQL高级知识笔记》
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
关注我,点赞本文给更多有需要的人
82)]
[外链图片转存中…(img-LEUIlieH-1711948254782)]
[外链图片转存中…(img-3v8z7ENG-1711948254782)]
[外链图片转存中…(img-AojGQLjE-1711948254783)]
[外链图片转存中…(img-DzOmurZb-1711948254783)]
[外链图片转存中…(img-u736BQAz-1711948254784)]
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
[外链图片转存中…(img-zljKWqYb-1711948254784)]
关注我,点赞本文给更多有需要的人