File类
概念
File类是文件和目录路径的描述是一个抽象表示,主要用于文件和目录的创建,查找和删除等操作
构造方法
File(String path) 通过给定指定路径字符串,创建文件对象
File(String path,String child) 在指定的父目录中创建子文件或目录
常用方法
方法名 | 描述 |
---|---|
getPath() | 获取到文件或目录的相对路径 |
getAbsolutePath() | 获取到绝对路径 |
getName() | 获取到名称 |
length() | 文件大小 |
exists() | 判断目录是否存在 |
mkdirs() | 创建目录,如果父目录存在,则直接创建子目录,不存在则创建整个目录 |
createNewFile() | 创建文件 |
delete() | 删除文件或目录 |
isDirectory() | 是否为目录 |
isFile() | 是否为文件 |
创建目录及文件
public class FileDemo {
@Test
public void createFile() {
File file = new File("E:\\Java\\test");
//判断目录是否存在,不存在则创建
if(!file.exists())
//创建目录
file.mkdirs();
//在已创建的目录中创建hello.txt文件
File newFile = new File(file, "hello.txt");
boolean flag = false;
try {
//文件夹可能不存在
flag = newFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if(flag) {
System.out.println("文件创建成功!");
System.out.println("本文件的路径为:"+newFile.getPath());
System.out.println("本文件的绝对路径:"+newFile.getAbsolutePath());
System.out.println("文件的名称:"+newFile.getName());
}
}
}
删除文件或目录
@Test
public void delete() {
File file = new File("E:"+File.separatorChar+"Java"+File.separatorChar+"test"+File.separatorChar+"hello.txt");
System.out.println(file.getPath());
//使用delete方法删除文件
if(file.delete()) {
System.out.println("删除文件成功!");
}else {
System.out.println("删除文件失败!");
}
}
递归:查询目录中的文件
递归: 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来解决
递归策略只需要少量的程序就可以描述出解决问题所需要的多次重复计算
//查询目录及文件
@Test
public void findFile() {
//获取到硬盘根目录,返回一个文件目录数组
File[] roots = File.listRoots();
System.out.println("电脑中的盘符有:"+Arrays.toString(roots));
//获取到指定盘符
File e = roots[1];
//获取到E盘下所有目录及文件
// File[] files = e.listFiles();
// System.out.println("E盘下的所有文件及目录:"+Arrays.toString(files));
//获取E盘中所有的文件,及文件个数
long num = showFile(e);
System.out.println("E盘中所有文件的个数为:"+num);
}
private long showFile(File e) {
long num = 0;
//从传入目录中获取到所有子目录及文件
File[] files = e.listFiles();
if(files!=null) {
//循环每一个子目录或文件
for(File file : files) {
//判断是否为目录
if(file.isDirectory()) {
//以当前目录为根,再次调用showFile方法遍历子目录及子文件
//方法的递归调用
num += showFile(file);
}else {
num++;
System.out.println(file.getPath());
}
}
}
return num;
}
IO流
流的概念
表示从一端流入到另一端这个过程叫做流,设备与设备之间,数据从一端流向另一端的过程叫做数据流
IO流的概念
IO: 输入/输出(input /output)
表示两个以上的设备之间数据的流入流出这就是IO流, IO的流入与流出是相对的
IO分类
按流向分: 输入流 读取数据
输出流 写出数据
按照数据单元分:
字节流: 字节的流入与流出
字符流: 字符流流入流出
字节流
字节流读取数据
字节流抽象基类
InputStream : 这个抽象类表示字节输入流的所有类的超类
OutputStream: 这个抽象类表示字节输出流的所有类的超类
子类实现类
FileInputStream(String name): 创建文件字节输入流,并指定要读取文件的名称
FileOutputStream(String name): 创建文件字节输出流,并指定数据输出的指定文件
常用方法
read() 从输入流中读取单个字节,并返回字节,如果读不到内容返回-1
read(byte[] b) 从输入流中读取一个缓冲区的数据,并返回每次读取的长度
步骤:
1.创建字节输入流
2.调用字节输入流对象的读取方法
3.释放资源
public class InputStreamDemo {
//使用字节输入流读取单个字节内容
public static void main(String[] args) {
// 创建输入流对象
InputStream in = null;
try {
in = new FileInputStream("e:/Java/test/hello.txt");
//调用方法读取内容
int b;
//通过循环每次读取一个字节赋值给b
while((b=in.read())!=-1) {
System.out.print((char)b);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
使用缓冲区读取输入流,每次返回读取长度
public class InputStreamDemo1 {
//使用输入流一次读取多个字节
public static void main(String[] args) {
// 创建输入流对象
InputStream in = null;
try {
in = new FileInputStream("e:/Java/test/hello.txt");
//设置一个自定义缓冲区
byte[] bs = new byte[10];
//初始化每次读取的长度
int len=0;
//通过循环每次读取一个缓冲区内容,放置在bs中,并返回长度
while((len=in.read(bs))!=-1) {
//有可能最后一个读取的内容无法完全覆盖数组,所以需要输出对应读取长度的内容
System.out.print(new String(bs,0,len));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节输出流
常用方法: write(byte) write(byte[])
public class OutputStreamDemo {
//使用字节输出流向文件输入数据
public static void main(String[] args) {
// 创建输出流对象
OutputStream out = null;
try {
//构造方法中,第二个参数表示为是否追加数据到内容末尾,true表示追加 默认为false
//out = new FileOutputStream("e:/Java/test/java.txt",true);
out = new FileOutputStream("e:/Java/test/java.txt");
//准备数据
byte[] bs = "helloworld".getBytes();
//通过write方法输出单个字节
//out.write(bs[1]);
//输出多个字节
// out.write(bs);
out.write(bs, 0, 5);
out.flush(); //刷新缓存
System.out.println("输出成功");
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
案例需求
把E:/Java/test/图片 复制到 E:/Java 文件夹中,所有的文件复制都可以使用字节流
public class CopyStremDemo {
public static void main(String[] args) {
//在JDK1.7之后,可以将流放入try后面的括号中,使用完成后自动关闭
try(InputStream in = new FileInputStream("E:\\Java\\test\\1.pptx");
OutputStream out = new FileOutputStream("E:\\Java\\天气.pptx");) {
//设置缓存空间
byte[] bs = new byte[200];
//设置读取长度
int len;
while((len=in.read(bs))!=-1) {
//将读取的内容写出到指定文件
out.write(bs, 0, len);
out.flush();
}
System.out.println("复制成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符流
字符流: 用于读取字符的输入输出流,这种流无法读取字节数据
字符流抽象基类:
Reader : 表示字符输入流所有类的超类
Writer : 表示字符输出流所有类的超类
字符输入流子类: FileReader 字符输入流
常用方法: read() read(char[])
public class ReaderDemo {
//使用字符流读取文本内容
public static void main(String[] args) {
try(Reader r = new FileReader("E:\\Java\\test\\hello.txt");) {
//while循环读取字符,每次读取一个
// int c;
// while((c=r.read())!=-1) {
// System.out.print((char)c);
// }
//使用自定义缓冲区读取字符
char[] cs = new char[10];
int len;
while((len=r.read(cs))!=-1) {
System.out.print(new String(cs, 0, len));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符输出流
子类实现类: FileWriter 字符输出流
常用方法: writer(char[]) writer(String)
public class WiterDemo {
public static void main(String[] args) {
// 创建字符输出流
try(Writer w = new FileWriter("E:\\Java\\test\\hello.txt");) {
//1.准备数据
// char[] cs = "今天我们要去做核酸,还好今天没太阳".toCharArray();
// //使用输出流输出内容
// w.write(cs);
String str = "卡拉手机电脑覅卡萨丁喝咖啡你不卡的时间发哈市\n还能覅卡士大夫你卡的就是男方";
w.write(str);
//刷新缓存
w.flush();
System.out.println("输出成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符流的复制
public class CopyCharDemo {
//使用字符流读取文本内容
public static void main(String[] args) {
try(Reader r = new FileReader("E:\\Java\\test\\hello.txt");
Writer w = new FileWriter("E:\\Java\\2.txt");) {
//使用自定义缓冲区读取字符
char[] cs = new char[100];
int len;
while((len=r.read(cs))!=-1) {
w.write(cs, 0, len);
}
System.out.println("复制成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
字节流与字符流使用场景
字节流因为单元特殊,可以应用于任何文件的读取,但是效率略低
字符流只能读取文本文件,但是读取字符过程中效率会略高