IO:input / output
定义:
- input(输入):把数据从磁盘中读取到内存中进行处理为输入
- output(输出):将内存中的数据保存到磁盘中为输出
File
定义:提供了文件属性,文件创建/删除,目录列表操作的方法;封装一个磁盘路径的字符串:文件路径,文件夹路径,不存在的路径。
代码如下:
public static void main(String[] args) {
String path = null;
// path = "D:/aaa";//存在的文件夹
// path = "D:/XshellCore.exe";//存在的文件
// path = "K:/AAA";//不存在的路径
File f = new File(path);
//文件或文件夹属性
System.out.println(f.exists()); /** File.exists() 是否存在 */
System.out.println(f.isFile()); /** File.isFile() 是否为文件 */
System.out.println(f.isDirectory()); /** File.exists() 是否为文件夹 */
System.out.println(f.getName()); /** File.exists() 获取文件名/文件夹名 */
System.out.println(f.getParent()); /** File.exists() 获取父目录 */
System.out.println(f.getAbsolutePath()); /** File.exists() 获取完整路径 */
System.out.println(f.length()); /** File.exists() 获取字节量, 对目录无效 */
}
public static void main(String[] args) throws Exception {
File f1 = new File("d:/aaa/aaa");
File f2 = new File(f1,"f1");
//创建/删除文件或文件夹
f1.mkdirs(); /** File.mkdirs:根据路径创建文件夹;File.mkdir:只能创建一层文件夹 */
f2.createNewFile(); /** File.createNewFile:创建文件,如果文件已经存在,返回false;但是路径不存在会报错 */
f1.delete(); f2.delete(); /** File. delete:根据路径删除指定文件;根据路径删除指定文件夹(必须为空文件夹)*/
}
public static void main(String[] args) throws Exception {
//D:/aaa/aaa //文件夹路径 //答案是 string = null file = null
//D:/aaa/aaa/timg.jpg //文件路径 //答案是 string = null file = null
//D:/bbb/aaa //不存在的路径 //答案是 string = null file = null
//asdsadas //错误的路径 //答案是 string = null file = null
//C:/PerfLogs //没有权限访问的文件 //答案是 string = 2019 / f1 / timg.jpg file = D:\aaa\aaa\2019 | D:\aaa\aaa\f1 | D:\aaa\aaa\timg.jpg
//注:想要获取file中其他的文件信息,需要调用file自带的方法
String s = "D:/aaa/aaa";
File dir = new File(s);
String[] list = dir.list();
for (String string : list) { System.out.println(string);}
File[] listFiles = dir.listFiles();
for (File file : listFiles) {System.out.println(file);}
}
public static void main(String[] args) throws Exception {
File file = new File("D:/aaa/aaa/a.txt");
/** 如果该文件存在,则会将原来的文件覆盖掉,创建一个新的文件 */
FileOutputStream out = new FileOutputStream(file);
/**
* true:如果文件不存在,则会创建,若已经存在,则不会创建
* false:默认,和上面创建的方法一样
*/
FileOutputStream put = new FileOutputStream(file,false);
}
public static void main(String[] args) throws Exception {
File file = new File("D:/aaa/aaa/a.txt");
FileInputStream in = new FileInputStream(file);
int read = in.read();
System.out.println(read);
//读取文件方法1
int a; while(true) {a=in.read();
if(a==-1) {break;} System.out.println(a);}
//读取文件方法2
int b; while((b=in.read()) != -1) {System.out.println(b);}
//释放资源
in.close();
}
文件夹列表
- List:获得String数组,只包含文件和文件夹名称的字符串
- ListFile:获得一个File数组,包含每个文件和文件夹的封装的File实例(文件的所有信息都包含在内)
注意:文件路径列表可能存在null值,原因可分为以下几点
3. 输入的是文件的路径
4. 输入的是不存在的文件路径
5. 输入的是没有权限进入的文件夹
Stream
定义:简称流;把字节数据的读写理解为数据在管道中流动只能是单向流动。而Stream又分为OutputStream(输出流)和InputStream(输入流)
原理图:
InputStream(输入流):就只能从磁盘中读取数据到内存中
OutputStream(输出流):就只能从内存中写出数据到磁盘中
数据在管道中流动只能是单向流动:输入/输出 的文件字节只能在Stream中流动一次,当文件字节全部流动完成后,Stram也就失去了作用,如果还想要在 输入/输出 文件的话就只能重新创建一个Stream
FileInputStream/FileOutputStream
定义:直接插在文件上读写文件数据
ObjectInputStream / ObjectOutputStream
定义:序列化 和 反序列化
代码:
public static void main(String[] args) throws Exception {
/*
* OIS--FIS--f2
*/
ObjectInputStream in = new ObjectInputStream(new FileInputStream("d:/abc/f2"));
//反序列化, 读取,恢复实例
Object readObject = in.readObject();
System.out.println(readObject);
in.close();
}
}
public static void main(String[] args) throws Exception {
/*
* OOS--FOS--d:/abc/f2
*
* 先新建 FOS 插在文件上,
* 再新建 OOS 插在文件流上
* OOS负责把对象转成一串字节值 ——> (序列化)
* FOS负责向文件输出这些数据
*/
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("d:/abc/f2"));
out.writeObject("asd");
out.close();
}
}
public static void main(String[] args) throws Exception {
/*
* OOS--FOS--d:/abc/f2
*
* 先新建 FOS 插在文件上,
* 再新建 OOS 插在文件流上
* OOS负责把对象转成一串字节值 ——> (序列化)
* FOS负责向文件输出这些数据
*/
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("d:/abc/f2"));
out.writeObject("asd");
out.close();
}
}
InputStreamReader / OutputStreamWriter
定义:读取编码字符转成Unicode 和 把Unicode转成其他编码
原理图:
代码:
public static void main(String[] args) throws Exception {
/*
* 读取,转成Unicode编码
*/
f("d:/abc/f3", "UTF-8");
f("d:/abc/f4", "GBK");
}
private static void f(
String path, String charset) throws Exception {
// ISR--FIS--path
InputStreamReader in = new InputStreamReader(new FileInputStream(path), charset);
int c; // 00 00 xx xx, 后面两个字节,是char
while ((c = in.read()) != -1) {
char c1 = (char) c;//强转成char类型
System.out.print(c1);
}
in.close();
}
public static void main(String[] args) throws Exception {
/*
* OSW--FOS--f3 保存UTF-8编码
* OSW--FOS--f4 保存GBK编码
*/
f("d:/abc/f3", "UTF-8");
f("d:/abc/f4", "GBK");
}
/*在这里插入图片描述
* 字符编码 encoding
* 字符集 charset
*/
private static void f(String path,String charset) throws Exception {
//字符由OSW做编码转换
//转码的结构交给FOS向文件输出
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(path),charset);//需要指定转换的编码
int count = 0;
for (char i = '\u4e00'; i <='\u9fa5'; i++) {
out.write(i);
count++;
}
out.close();
}
额外试题:计算文件夹大小
public static void main(String[] args) throws Exception {
String s = "D:/aaa/aaa";
File dir = new File(s);
long size = dirLength(dir);
System.out.println(size);
}
private static long dirLength(File dir) {
File[] files = dir.listFiles();
if(files == null) {return 0;}
long sum = 0;
System.out.println(sum);
for (File file : files) {
System.out.println(file.getName());
if(file.isFile()) {
sum += file.length();
}else {sum += dirLength(file);}}
System.out.println();
return sum;
}