File 和IO
- 实现永久的存储
文件在那里?
- IO 读写
- File读写文件在哪
IO流是什么
- 数据读取从本地文件
- 可以将数据从内存保存到本地文件
File类
- 告诉虚拟机要操作的文件在哪
File 类
文件和目录路径名的抽象
文件可以通过File封装成对象
package Class_1;
import java.io.File;
public class main {
public static void main(String[] args) {
// String path = "c:\\data.txt";
// File file = new File(path);
// System.out.println(file);
// String path1 = "c:\\";
// String path2 = "data.txt";
// File file = new File(path1,path2); //两个路径的拼接
// System.out.println(file);
// File file = new File("C:\\");
// File path = new File(file,"data1.txt"); // file 与 string 拼接
// System.out.println(path);
}
}
绝对路径 和相对路径
- 绝对路径从 盘符开始,位置开始就不变了
- 相对路径: 相对于当前项目下的路径
// 模块下的路径
File file3 = new File("模块名称\\文件")
File类创建功能
- 如果文件不存在则直接创建出来
CreateNewFeile
- 如果文件存在返回 false
- 如果不存在创建成功 返回 true
makedir
- 创建单级目录
makedirs
- 创建多级目录
// File file1 = new File("C:\\java.txt");
// boolean debugs = file1.createNewFile();
// System.out.println(debugs);
File file1 = new File("C:\\bb\\aa");
file1.mkdirs();
File类删除
- 删除直接没了
- 删除文件直接删除
- 删除文件只能删除空文件夹
有内容的文件夹,只能先进入到文件夹把里面的全部删除才能删除
只能删除文件和空文件夹
File file1 = new File("C:\\java.txt");
boolean result = file1.delete();
System.out.println(result);
删除单级文件
File file1 = new File("C:\\bb\\aa"); boolean result = file1.delete(); System.out.println(result);
File类的获取和判断功能
- isDirectory() 是否是目录
- isFile() 是否是文件
- exisits() File 是否存在
getName() 返回文件或者路径名的名称
- 调用的是文件: 获取的是文件名
- 调用的是文件夹: 获取的是文件夹的名字【单个】
private static void is_file_or_isdirectory() {
File file1 = new File("C:\\bb");
boolean result1 = file1.isDirectory(); //是不是目录
boolean result2 = file1.isFile(); // 是不是文件
System.out.println(result1+" " +result2);
}
File file1 = new File("a.txt"); // 当前项目下的文件
boolean result = file1.exists(); //文件/路径是否存在
System.out.println(result);
File类的遍历
listFiles() //返回一个Files的类型 的数组
包括隐藏文件
- 当调用者是一个文件时 返回null长度
- 当调用者时一个空文件夹时返回0长度
File file = new File("C:\\");
File[] path = file.listFiles();
for (File a : path) {
System.out.println(a.getName());
}
E:\Soft_IDE\Java-IDE\bin\java.exe "-javaagent:E:\Soft_IDE\Intellij\IntelliJ IDEA 2021.3.2\lib\idea_rt.jar=1500:E:\Soft_IDE\Intellij\IntelliJ IDEA 2021.3.2\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Aurora\Desktop\Learn\Java\code\Class9\out\production\Class9 Class_1.main
$Recycle.Bin
$SysReset
$Windows.~WS
$WinREAgent
AMTAG.BIN
ASC.PTL
bb
bootmgr
bootTel.dat
Config.Msi
data.txt
Documents and Settings
Drcom
DRMsoft
DumpStack.log
DumpStack.log.tmp
ESD
F87179DA0A50
GB2312.PTL
hiberfil.sys
Intel
OneDriveTemp
pagefile.sys
PerfLogs
Program Files
Program Files (x86)
ProgramData
Recovery
SOLIDWORKS Data
SolidWorks_Flexnet_Server
swapfile.sys
System Volume Information
this
Users
Windows
迅雷下载进程已结束,退出代码0
IO流
分类
- 字节流
- 字符流
- 概念: 读写文件
IO流分类
按流向来分
IO流 ---> 输出流
--->输入流
- 数据类型来分
IO流 ---> 字节流 --->字符流
字节流---->操作所有类型的文件
字符流---->只能操作纯文本文件
字节流
字节流写数据
- 创建字节输出流对象 FileOutputStream
- 写数据
释放资源
如果文件不存在会帮忙创建,如果文件存在则清空
public static void main(String[] args) throws IOException { FileOutputStream src = new FileOutputStream("C:\\data.txt"); // 文件打开 src.write(97); //写入一个字节 src.close();//关闭 }
字节流写数据的三种方式
- write(int b) 一次写一个字节数据
- write(byte[]b) 一次写一个字节数组的数据
- write(byte[] b,int off//开始索引,int len) 一次写一个字节数组的部分数据
FileOutputStream src = new FileOutputStream("data.txt");
byte[] s = {96,99,97,98,99,100};
src.write(s,0,2);
保证不被替换开关
new FileOutputStream("data.txt",true);
字节流读数据
FileInputStream
读取方法 Read
- 一次读入一个字节
- 如果想得到字符得强转成char
try {
FileInputStream a = new FileInputStream("data.txt");
int x =a.read();
System.out.println((char)x);
} catch (Exception e){
System.out.println("文件不存在");
}
读入多个字节
FileInputStream file1 = new FileInputStream("data.txt"); int x; while( (x = file1.read())!= -1){ System.out.println((char) x); }
复制
String aim = "C:\\data.txt"; String Src = "data.txt"; FileOutputStream file1 = new FileOutputStream(aim); FileInputStream file2 = new FileInputStream(Src); int data; while((data = file2.read())!=-1){ file1.write(data); }
- 如果字节过多需要执行多次,造成速度慢
- 解决方法,创建数组一次读取多个写入多个
- public int read(byte[] b); 返回的是实际读取的字节数
String aim = "C:\\data.txt"; String Src = "data.txt"; FileOutputStream file1 = new FileOutputStream(aim); FileInputStream file2 = new FileInputStream(Src); byte [] temp_data = new byte[1024]; int len; while((len = file2.read(temp_data))!=-1){ file1.write(temp_data,0,len); }
字节缓冲流
- BufferOutputStream
BufferedInputStream
- 仅仅是提供一个缓冲区,不能直接操作字节流中的数据
拷贝一个字节
// 用缓冲流拷贝文件
BufferedInputStream bit = new BufferedInputStream(new FileInputStream("data.txt"));
//字节缓冲输出流
BufferedOutputStream ins = new BufferedOutputStream(new FileOutputStream("D:\\copy.txt"));
int b;
while((b = bit.read())!=-1){
ins.write(b);
}
ins.close();
bit.close();
方法再底层默认创建一个8192的字节数组
拷贝一个数组
BufferedInputStream src = new BufferedInputStream(new FileInputStream("data.txt"));
BufferedOutputStream outs = new BufferedOutputStream(new FileOutputStream("D:\\data.txt"));
byte [] datas = new byte[1024];
int len;
while((len = src.read(datas))!=-1){
outs.write(datas,0,len);
}
src.close();
outs.close();
字符流
- 如果利用字节流把中文读入内存出现乱码
- 写出去也可能乱码
存入-》编码,读取-》解码
中文乱码原因
字节流只读一个字节,因为中文是多字节,所以会产生乱码
字符流写出
创建字符输出流对象
写数据
释放资源
FileWrite
构造方法 FileWriter(File file/String) 给 File
写一个FileWriter
,使用平台的 default charset)
数据流写入的五种方式
void write
- 参数
- int c
- char[] cbuf
- char cbuf,int off,int len
- string str
- string str,int off, int len
package Class_4_Filewrite;
import java.io.FileWriter;
import java.io.IOException;
public class main {
public static void main(String[] args) throws IOException {
FileWriter file1 = new FileWriter("a.txt",true);
file1.write(97);
file1.write("\n这就是中文吗",0,4);
file1.close();
});
}
}
注意事项: 要确保使用完毕后释放资源
字符流的刷新流和关闭流
- flush() 刷新流,还可以写数据
- close()关闭流,释放资源,但是在关闭之前会刷新流,一旦关闭,就不能再写数据。