一, File
–1,概述
IO技术主要用来解决 Java程序和文件系统的交互
I是指 从磁盘读取数据到Java程序中 的过程-in
O是指 从Java程序中输出到磁盘 的过程-out
两个过程都是相对Java程序而言
由于你操作数据的单位不同txt/jpg/mp4…分为两种流:字节流/字符流
字节流可以读写任何单位的数据 – 重点!!!
字符流 只可以读写txt的数据 – 了解!!!
–2,创建对象
File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
–3,调用方法
package cn.tedu.api;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
//测试 File
public class Test1 {
public static void main(String[] args) throws IOException {
//1,创建对象--参数是文件所在的路径
File file = new File("E:\\iotest\\1.txt");
//2,调用方法
System.out.println( file.length() );//获取字节量
System.out.println( file.exists() );//判断文件是否存在
System.out.println( file.isFile() );//判断是文件吗
System.out.println( file.isDirectory() );//判断是文件夹吗
System.out.println( file.getName() );//获取文件名
System.out.println( file.getParent() );//获取父路径
System.out.println( file.getAbsolutePath() );//获取完整路径
file = new File("E:\\iotest\\2.txt");
System.out.println( file.createNewFile() );//创建新文件
file = new File("E:\\iotest\\a");
System.out.println(file.mkdir());//创建新文件夹
file = new File("E:\\iotest\\x\\y");
System.out.println(file.mkdirs());//创建新多个 文件夹
System.out.println(file.delete());//删除文件或者空的文件夹
//TODO 文件夹列表
file = new File("E:\\iotest");
String[] s = file.list();//列出资源的名字
//[1.txt, 2.txt, a, x]
System.out.println( Arrays.toString(s) );
//列出文件夹里的所有资源,并把每个资源封装成File
File[] files = file.listFiles();
//[E:\iotest\1.txt, E:\iotest\2.txt, E:\iotest\a, E:\iotest\x]
System.out.println( Arrays.toString(files) );
//TODO 模拟File[]
File[] b = new File[3];
b[0] = new File("E:\\iotest\\2.txt") ;
b[1] = new File("E:\\iotest\\1.txt") ;
b[2] = new File("E:\\iotest\\20.txt") ;
for (int i = 0; i < b.length; i++) {//遍历数组
System.out.println(b[i]);//打印数组里的每个File
System.out.println(b[i].getName());//打印每个File名
}
//TODO 列出文件夹里的所有资源,打印文件夹名称,统计所有文件的大小
//1.列出所有资源listFiles()
File dir = new File("E:\\iotest");
File[] a = dir.listFiles();
long sum = 0;//定义变量,记录文件的大小
//遍历数组,获取每个File类型的资源,a[i]
for(int i = 0 ; i < a.length ;i++) {
//2.判断,资源是文件夹吗?-- getName()
if( a[i].isDirectory() ) {
System.out.println(a[i].getName());
}if( a[i].isFile() ) {
//3.判断,资源是文件吗?--求大小
sum = sum + a[i].length();
}
}
System.out.println("文件夹是: "+dir.getAbsolutePath()
+",里面的文件大小是: "+sum);
}
}
--4,递归
现象:方法里调用方法本身
好处:减少了代码
坏处:费内存
package cn.tedu.api;
import java.io.File;
import java.util.Scanner;
//测试 递归
public class Test2 {
public static void main(String[] args) {
//1,自定义目录路径
System.out.println("请输入文件夹 的路径:");
String path = new Scanner(System.in).nextLine();
//2,封装成File
File dir = new File(path);
//3,调用方法,求总大小
long sum = sizeOf(dir);
System.out.println("文件夹是: "+path+",总大小是:"+sum);
}
//定义方法,求总大小
public static long sizeOf(File dir) {
// 1,列出文件夹里的所有资源 listFiles()
File[] a = dir.listFiles();
long sum = 0 ;//定义变量,记录总和
// 2,遍历获取每个资源a[i]
for (int i = 0; i < a.length; i++) {
// 3,判断,如果资源是文件,求大小length()
if(a[i].isFile()) {
sum = sum + a[i].length() ;
}else if(a[i].isDirectory()) {
// 4,判断,如果资源是文件夹
// //重复的执行1 2 3 --递归
sum = sum + sizeOf(a[i]);//--递归
}
}
return sum ;//返回计算的结果sum
}
}
二,读取流
–1,概述
用来读取 磁盘里的数据 -in
字符流只能读字符文件–了解
字节流可以读各种文件–重点
InputStream - FileInputStream - BufferedInputStream
–2,工具类
- InputStream:是父类,被修饰为了抽象类。不能被new,学习共性方法。
abstract int read() 从输入流中读取数据的下一个字节。
int read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
int read(byte[] b, int off, int len)
将输入流中最多 len 个数据字节读入 byte 数组。
void close()
关闭此输入流并释放与该流关联的所有系统资源。
- FileInputStream:是子类,可以使用父类的方法,研究new
FileInputStream(String name)
FileInputStream(File file)
- BufferedInputStream:是子类,可以使用父类的方法,研究new
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream 并保存其参数
–3,测试
package cn.tedu.api;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
//测试 读取流
public class Test3 {
public static void main(String[] args) throws IOException {
// method();//FileInputStream读取
method2();//BufferedInputStream读取
}
//BufferedInputStream读取
public static void method2() throws IOException {
//1,创建多态对象
InputStream in = new BufferedInputStream(
new FileInputStream(
"E:\\iotest\\1.txt"));
//2,读取数据
int b = 0 ;//定义变量,记录读到的数据
while( ( b = in.read() ) != -1) {
System.out.println(b);
}
//3,关闭资源
in.close();
}
//FileInputStream读取
public static void method() throws IOException {
//1,创建多态对象
InputStream in = new FileInputStream("E:\\iotest\\1.txt");//触发String构造方法
// File file = new File("E:\\iotest\\1.txt");
//InputStream in2 = new FileInputStream(file);//触发File构造方法
//InputStream in3 = new FileInputStream(new File("E:\\iotest\\1.txt"));//触发File构造方法
//2,读取数据
// int data = in.read();//一个一个的读
// System.out.println(data);
// System.out.println(in.read());
// System.out.println(in.read());
// //问题2:read()的默认返回值是int类型,非要得到char--强转
// char x = (char)data;
// System.out.println(x);
// //问题1:没数据了,还能读吗?-永远返回-1
// System.out.println(in.read());
//TODO 改造
int b = 0 ;//定义变量,用来记录读到的数据
//read()没数据时,会永远返回-1
while( ( b = in.read() ) != -1){
//打印读到的数据
System.out.println(b);
}
//3,关闭资源
in.close();
}
}