文章目录
- 一、File类
- 1.1 File对象的构造
- 1.2 File对象的常见方法
- 判断功能的方法
- 获取功能的方法
- 绝对路径和相对路径
- 创建删除功能的方法
- 1.3 ==File的常用遍历方法==
- 1.4 File获取并遍历的其他方法
- 1.5 用法举例
- 二、IO流
- 2.1 IO的分类
- 2.2 字节流的方法概述
- 2.2.1 FileOutputStream
- 2.2.2 FileInputStream
一、File类
File对象主要是为了对文件进行简单的处理和存储
1.1 File对象的构造
构造File对象的时候既可以有路径,也可以没有
public static void main(String[] args) {//1.根据字符串表示的路径,变成File对象String str = "C:\\Users\\Desktop\\a.txt";File f1 = new File(str);System.out.println(f1);//C:\Users\Desktop\a.txt//2.父级路径:C:\Users\Desktop//子级路径:a.txtString parent = "C:\\Users\\Desktop";String child = "a.txt";File f2 = new File(parent,child);System.out.println(f2);//C:\Users\Desktop\a.txtFile f3 = new File(parent + "\\" + child); //可以替代方法二System.out.println(f3);//C:\Users\Desktop\a.txt//3.把一个File表示的路径和String表示路径进行拼接File parent2 = new File("C:\\Users\\Desktop");String child2 = "a.txt";File f4 = new File(parent2,child2);System.out.println(f4);//C:\Users\Desktop\a.txt}
注意:此时new只是生成了File对象,还需要用创建方法将其实实在在地创建在电脑的内存中
1.2 File对象的常见方法
判断功能的方法
public boolean exists()
:此File表示的文件或目录是否实际存在。public boolean isDirectory()
:此File表示的是否为目录。public boolean isFile()
:此File表示的是否为文件。
方法演示,代码如下:
public class FileIs {public static void main(String[] args) {File f = new File("d:\\aaa\\bbb.java");File f2 = new File("d:\\aaa");// 判断是否存在System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists()); //d:\aaa\bbb.java 是否存在:trueSystem.out.println("d:\\aaa 是否存在:"+f2.exists()); //d:\aaa 是否存在:true// 判断是文件还是目录System.out.println("d:\\aaa 文件?:"+f2.isFile()); //d:\aaa 文件?:falseSystem.out.println("d:\\aaa 目录?:"+f2.isDirectory()); //d:\aaa 目录?:true}
}
获取功能的方法
-
public String getAbsolutePath()
:返回此File的绝对路径名字符串。 -
public String getPath()
:将此File转换为路径名字符串。 -
public String getName()
:返回由此File表示的文件或目录的名称。 -
public long length()
:返回由此File表示的文件的长度。方法演示,代码如下:
public class FileGet {public static void main(String[] args) {File f = new File("d:/aaa/bbb.java"); System.out.println("文件绝对路径:"+f.getAbsolutePath()); //文件绝对路径:d:\aaa\bbb.javaSystem.out.println("文件构造路径:"+f.getPath()); //文件构造路径:d:\aaa\bbb.javaSystem.out.println("文件名称:"+f.getName()); //文件名称:bbb.javaSystem.out.println("文件长度:"+f.length()+"字节"); //文件长度:636字节File f2 = new File("d:/aaa"); System.out.println("目录绝对路径:"+f2.getAbsolutePath()); //目录绝对路径:d:\aaaSystem.out.println("目录构造路径:"+f2.getPath()); //目录构造路径:d:\aaaSystem.out.println("目录名称:"+f2.getName()); //目录名称:aaa目System.out.println("目录长度:"+f2.length()); //目录长度:4096}}
API中说明:
length()获取文件的大小,单位是字节,该方法不能获取文件夹的大小
getName()的调用者是文件夹返回文件夹的名字,若是文件返回文件名加文件的扩展名
绝对路径和相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径。
- 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
public class FilePath {public static void main(String[] args) {// D盘下的bbb.java文件File f = new File("D:\\bbb.java");System.out.println(f.getAbsolutePath());// 项目下的bbb.java文件File f2 = new File("bbb.java");System.out.println(f2.getAbsolutePath());}
}
输出结果:
D:\bbb.java
D:\idea_project_test4\bbb.java
创建删除功能的方法
public boolean createNewFile()
:当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。public boolean delete()
:删除由此File表示的文件或目录。public boolean mkdir()
:创建由此File表示的目录。public boolean mkdirs()
:创建由此File表示的目录,包括任何必需但不存在的父目录。
方法演示,代码如下:
public class FileCreateDelete {public static void main(String[] args) throws IOException {// 文件的创建File f = new File("aaa.txt");System.out.println("是否存在:"+f.exists()); // falseSystem.out.println("是否创建:"+f.createNewFile()); // trueSystem.out.println("是否存在:"+f.exists()); // true// 目录的创建File f2= new File("newDir"); System.out.println("是否存在:"+f2.exists());// falseSystem.out.println("是否创建:"+f2.mkdir()); // trueSystem.out.println("是否存在:"+f2.exists());// true// 创建多级目录File f3= new File("newDira\\newDirb");System.out.println(f3.mkdir());// falseFile f4= new File("newDira\\newDirb");System.out.println(f4.mkdirs());// true// 文件的删除System.out.println(f.delete());// true// 目录的删除System.out.println(f2.delete());// trueSystem.out.println(f4.delete());// false}
}
注意:
- createNewFile():
如果当前路径的文件不存在创建成功,存在则创建失败
如果父级路径不存在会产生IOException的异常
该方法创建的一定是文件,不会是文件夹(可以是一个没有后缀名的文件)- mkdir():
路径的创建一定是惟一的
该方法每次只能创建单级文件夹,多级文件夹会创建失败- mkdirs():
在底层会先尝试创建单级文件夹- delete():
可以删除文件或文件夹
如果此File表示目录,则目录必须为空才能删除
1.3 File的常用遍历方法
public static void main(String[] args) {//public File[] listFiles() 获取当前该路径下所有内容//1.创建File对象File f = new File("D:\\aaa");//2.listFiles方法//作用:获取aaa文件夹里面的所有内容,把所有的内容放到数组中返回File[] files = f.listFiles();for (File file : files) {//file依次表示aaa文件夹里面的每一个文件或者文件夹System.out.println(file);}}
1.4 File获取并遍历的其他方法
public static void main(String[] args) {/*public static File[] listRoots() 列出可用的文件系统根public String[] list() 获取当前该路径下所有内容public String[] list(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容(掌握)public File[] listFiles() 获取当前该路径下所有内容public File[] listFiles(FileFilter filter) 利用文件名过滤器获取当前该路径下所有内容public File[] listFiles(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容*///1.listRoots 获取系统中所有的盘符File[] arr = File.listRoots();System.out.println(Arrays.toString(arr));//[C:\, D:\]//2.list() 获取当前该路径下所有内容(仅仅能获取名字)File f1 = new File("D:");String[] arr2 = f1.list();for (String s : arr2) {System.out.println(s);}//注意其返回的是string类型的数组//3.list(FilenameFilter filter) 利用文件名过滤器获取当前该路径下所有内容//需求:我现在要获取D:\\aaa文件夹里面所有的txt文件File f2 = new File("D:\\aaa");//accept方法的形参,依次表示aaa老肉肉文件夹里面每一个文件或者文件夹的路径//参数一:父级路径//参数二:子级路径//返回值:如果返回值为true,就表示当前路径保留// 如果返回值为false,就表示当前路径舍弃不要String[] arr3 = f2.list(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {File src = new File(dir,name);return src.isFile() && name.endsWith(".txt");}});System.out.println(Arrays.toString(arr3));}
1.5 用法举例
1 创建文件
public static void main(String[] args) throws IOException {//需求:在当前模块下的aaa文件夹中创建一个a.txt文件//1.设置a.txt的父级路径File file = new File("myfile\\aaa");//2.创建父级路径//如果aaa是存在的,那么此时创建失败的。//如果aaa是不存在的,那么此时创建成功的。file.mkdirs();//3.拼接父级路径和子级路径File src = new File(file,"a.txt");boolean b = src.createNewFile();if(b){System.out.println("创建成功");}else{System.out.println("创建失败");}}
2 判断文件类型
判断当前目录中是否有txt文件
File[] files = file.listFiles();
//遍历数组获取里面的每一个元素
for (File f : files) {//f:依次表示aaa文件夹里面每一个文件或者文件夹的路径if(f.isFile() && f.getName().endsWith(".txt")){return true;}
}
3 删除文件夹的通用方式
前面所讲的delete只能删除空的文件夹或文件
/** 作用:删除src文件夹* 参数:要删除的文件夹* */public static void delete(File src){//1.先删除文件夹里面所有的内容//进入srcFile[] files = src.listFiles();//遍历for (File file : files) {//判断,如果是文件,删除if(file.isFile()){file.delete();}else {//判断,如果是文件夹,就递归delete(file);}}//2.当前文件夹为空时,删除自己src.delete();
二、IO流
IO流指的是数据的传输流,按照流动的方向,以内存为基准,分为
输入input
和输出output
,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用java.io
包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
2.1 IO的分类
根据数据的流向分为:输入流和输出流。
- 输入流 :把数据从
其他设备
上读取到内存
中的流。 - 输出流 :把数据从
内存
中写出到其他设备
上的流。
格局数据的类型分为:字节流和字符流。
- 字节流 :以字节为单位,读写数据的流,针对所有类型的文件。
- 字符流 :以字符为单位,读写数据的流,针对纯文本文件。
其中的四个蓝框中的类都是抽象类,在使用时常使用其子类
2.2 字节流的方法概述
一切文件在存储时,都是以一个一个的字节二进制数字的形式保存,同理在传输时也是以二进制比特的形式存储的。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
2.2.1 FileOutputStream
它是OutputStream的子类,即对该抽象类的具体实现
该类的基础用法
public static void main(String[] args) throws IOException {/*字节输出流的细节:1.创建字节输出流对象细节1:参数是字符串表示的路径或者是File对象都是可以的细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。细节3:如果文件已经存在,则会清空文件2.写数据细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符97-->a 3.释放资源每次使用完流之后都要释放资源,否则该文件会一直被java占用*///1.创建对象FileOutputStream fos = new FileOutputStream("D:\\a.txt");//2.写出数据fos.write(97);fos.write(55);//3.释放资源fos.close();//while(true){}//让程序不断保持运行去看看他的运行情况}
FileOutputStream的三种写出方式:
public static void main(String[] args) throws IOException {/*void write(int b) 一次写一个字节数据void write(byte[] b) 一次写一个字节数组数据void write(byte[] b, int off, int len) 一次写一个字节数组的部分数据数组 起始索引 个数*///1.创建对象FileOutputStream fos = new FileOutputStream("myio\\a.txt");//2.写出数据fos.write(97); // afos.write(98); // bbyte[] bytes = {97, 98, 99, 100, 101};fos.write(bytes);fos.write(bytes,1,2);// b c//3.释放资源fos.close();}
换行和续写
public static void main(String[] args) throws IOException {/*换行写:再次写出一个换行符就可以了windows: \r\n回车换行符老肉肉Linux: \nMac: \r细节:/在windows操作系统当中,java对回车换行进行了优化。虽然完整的是\r\n,但是我们写其中一个\r或者\n,java也可以实现换行,因为java在底层会补全。续写:如果想要续写,打开续写开关即可开关位置:创建对象的第二个参数默认false:表示关闭续写,此时创建对象会清空文件手动传递true:表示打开续写,此时创建对象不会清空文件*///1.创建对象FileOutputStream fos = new FileOutputStream("D:\\a.txt",true);//此处的参数表示追加写//2.写出数据String str = "zaixiedain";byte[] bytes1 = str.getBytes();fos.write(bytes1);//再次写出一个换行符就可以了String wrap = "\r\n";byte[] bytes2 = wrap.getBytes();fos.write(bytes2);String str2 = "666";byte[] bytes3 = str2.getBytes();fos.write(bytes3);//3.释放资源fos.close();}
2.2.2 FileInputStream
用于将文件中的数据读取出来
基本的文件读取
public static void main(String[] args) throws IOException {/** 实现步骤:* 创建对象* 读取数据* 释放资源* */ //1.创建对象FileInputStream fis = new FileInputStream("myio\\a.txt");//2.读取数据int b1 = fis.read();System.out.println((char)b1);int b2 = fis.read();System.out.println((char)b2);int b3 = fis.read();System.out.println((char)b3);int b4 = fis.read();System.out.println((char)b4);int b5 = fis.read();System.out.println((char)b5);int b6 = fis.read();//当读到的数据为空时返回-1System.out.println(b6);//-1//3.释放资源fis.close();}
注意:
- 如果文件不存在,在读取时会直接报错
- 每次读取一个字符,读完后指针自动后移,读到空时返回-1
循环读取
int b;//此处需要自定义一个第三方变量记录读取的值
while ((b = fis.read()) != -1) {System.out.println((char) b);
}
如果在程序中同时开启多个流进行操作,一般先创建的流最后释放
IO流的多行读取
在读取时一次可以进行多行的读取,增加读写的速度(含参的读对象)
//1.创建对象
FileInputStream fis = new FileInputStream("myio\\a.txt");
//2.读取数据
byte[] bytes = new byte[2];
//一次读取多个字节数据,具体读多少,跟数组的长度有关
//返回值:本次读取到了多少个字节数据
int len = fis.read(bytes);
System.out.println(len);//2
String str1 = new String(bytes,0,len);
System.out.println(str1);