(点击跳转即可哦)
主要操作
- 构造方法使用
- createNewFile() 以节点为单位
- delete() 删除文件
- exists() 判断文件是否存在
- isDirectory() 文件存在 且 文件是文件夹
- isFile() 文件存在 且 文件是普通文件
File file = new File("D:\\java\\javastudy\\Java_EE课堂代码\\test.txt"); System.out.println(file.exists()); System.out.println(file.isDirectory()); System.out.println(file.isFile());
- absolute path: 一般的绝对路径
- canonical path: 标准的绝对路径
- getName() 得到文件名
- getParent() 得到父目录
File file = new File("D:\\java\\.\\.\\\\\\javastudy\\Java_EE课堂代码\\test.txt"); //返回值都是 String System.out.println(file.getCanonicalPath()); System.out.println(file.getAbsolutePath()); System.out.println(file.getName()); System.out.println(file.getParent()); 输出结果: D:\java\javastudy\Java_EE课堂代码\test.txt D:\java\.\.\javastudy\Java_EE课堂代码\test.txt test.txt D:\java\.\.\javastudy\Java_EE课堂代码
-
lastModified() 得到该文件最后一次被修改的时间(以时间戳 timestamp形式表现)
-
listRoots 返回一个 File[] 列出可用的文件系统根
-
File[] listFiles[] 返回目录下的所有孩子
-
boolean mkdir() 创建一个目录文件, 失败原因:文件已经存在,路径上的祖先不存在
-
boolean mkdirs() 可以一并把路径中目前还不存在的目录都创建出来
-
boolean renameTo(File dest) 文件的重命名
File 类常见方法总结
一、 构造方法 绝对路径 or 相对路径
二、 判断文件属性
- 是否存在 exists()
- 是否是目录 isDirectory()
- 是否是普通文件 isFile()
三、 获取文件标准路径
- getCanonicalPath() throws IOException
四、 对于文件树结构的修改
- 创建节点
1)创建目录 mkdirs() 2) 创建普通文件 createNewFile()
- 删除结点 delete()
- 移动节点(重命名结点) renameTo()
五、针对目录,可以获取目录下的所有孩子文件
- listFiles() 如果对一棵树进行遍历(深度优先(更常见) or 广度优先)
JDK 中 只提供了针对结点的操作,没有提供针对一棵树的操作!!
一切针对树的操作,都需要我们自己写代码搞定!
delete() 是不进入回收站的删除,是真正的删除
删除目录:1. 通过遍历的方式,把这个目录变成空目录(递归把子孙全部删掉) 2. 删除这个空目录
windows 上的回收站是删除,实际上只是把文件剪切到一个固定目录
相对路径: 最基本的相对路径, 进程运行时的工作目录,JVM下,通常就是进程启动时的目录。
关于 内容 的读写
关于读取
- 直接读取(以二进制数据的方式读取,表现在代码中 byte 为 单位)
- 文本读取
步骤
- java.io.InputStream 输入流
- 本身是一个抽象类,真正使用过程中 要依赖这个抽象的具体实现子类
FileInputStream
关于文件的输入流- 抽象模型 进行一个接水操作
- 关闭 is.close
注意:除了要接水之外,我们还需要一个明确的信号(说明肯定不会有新的数据了)
是 暂时没水了 还是以后永远没水了
EOS 在我们的代码中,使用-1 去表示
文本读取
abstract int read()
只接一滴水:返回的是下个字节的数据
当返回值是 EOS (-1) 的时候,表示,以后永远都没有水了
public static void main(String[] args) throws Exception { InputStream is = new FileInputStream("D:/java/javastudy/Java_EE课堂代码/test.txt"); while (true){ int data = is.read(); if(data == -1){ //返回值为 -1 时,表示 所有的数据已经被读完了 break; } //否则 data 就是我们取到的数据 byte b = (byte) data; System.out.printf("%02x\n",b); } is.close(); }
int read(byte[] b)
一次接很多水,需要提前准备好桶(byte[])
返回值,本次接到多少水, n >= 0 && n <= byte.length
当返回值是EOS (-1),表示 以后永远没有水了
public static void main(String[] args) throws Exception { InputStream is = new FileInputStream("D:\\java\\javastudy\\Java_EE课堂代码\\test.txt"); //准备的水桶 byte[] buf = new byte[1024]; //去接水, n <= 1024 && n >= 0 //真正的数据放在 buf[] int n = is.read(buf); byte[] bytes = Arrays.copyOf(buf,n); for(byte b : bytes){ System.out.printf("%02x\n",b); } is.close(); }
//水桶的大小 小于 水龙头的容量 public static void main(String[] args) throws Exception { InputStream is = new FileInputStream("D:/java/javastudy/Java_EE课堂代码/test.txt"); byte[] bur = new byte[2]; while (true){ int n = is.read(bur); if(n == -1){ break; } // n == 0 只是本次没数据,以后还有 // n == -1 本次没数据,以后也没数据了 for(byte b: bur){ System.out.printf("%02x\n",b); } } is.close(); }
try-with-resources
语法
InputStream is = null;
try{
is = ...;
}catch (SomeException e){
...
}finally{
if(is != null){
is.close();
}
}
就等价于
*.java
try(InputStream is = ...){//try(定义变量 = ...)
...
}catch(SomeException e){
...
}//编译的时候自动添加了 is.close()
直接读取(二进制读取)
如何利用InputStream 进行二进制数据的直接读取
1 一个字节 2 一次读取一批 3 EOS (-1)
public String (byte bytes[], int offset,int length,String charsetName)
offset: bytes 的开始下标
public Scanner(InputStream source,String charsetName)
System.in 的类型 就是一个InputStream
处理文本数据(字符数据)
ASCII、Unicode、UTF-8、GBK
字符集(char set)
字符编码规则(char encoding)
如果每个人都定义自己的字符集,实际上没有任何的意义,所以,总是有标准委员会来规定好 一个字符集,大家一起遵守!,所以才会有各种各样的标准字符集的出现
ASCII [0 - 128] 表示的范围有限,一个字节 ASCII是Unicode 的子集
Unicode [0,2^32] 一千万亿 4个字节 ,如果真的每个字都用4个字节,就会有很多空间浪费,就有了不同的编码规则。UTF-8 UTF-32 UTF-16
GB(国标)GB2312 GB18030 GBK 中文英文 都是 2个字节
UTF-8:变长的编码规则,一个字符占用的空间 1~4不等,ASCII 范围内的,还是1 个字节,中文的字 一般是 3个字节
public static void main(String[] args) throws Exception{
try (InputStream is = new FileInputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
byte[] buf = new byte[1024];
int n = is.read(buf);
String s = new String(buf,0,n,"UTF-8");
System.out.println(s);
}
}
public static void main1(String[] args) throws Exception{
try(InputStream is = new FileInputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
try (Scanner sc = new Scanner(is,"UTF-8")){
while (sc.hasNextLine()){
String line = sc.nextLine();
System.out.println("|" + line +"|");
}
}
}
}
写 (OutputStream)
内存的写速度 远远快于 硬盘的写速度的,所以,为了平衡这个速度之差,一般通过“缓冲区 buffer”来处理
- 缓冲区满了 或者达到一定阈值
- 时间过了一段时间了
- 进程主动刷盘 关闭之前,统一做一次手动刷盘
OutputStream os = new FileOutputStream(./test.test);
如果文件之前不存在,则会进行创建(创建可能会失败,1 权限 2 路径上的目录不存在)
如果文件之前存在,会清空之前的文件内容,重新写入
public static void main(String[] args) throws Exception{
try(OutputStream os = new FileOutputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
os.write(0x20); //空格
os.write(0x0d); // '\r'
os.write(0x0a); //'\n'
os.write(0x65);
os.write(0x65);
os.write(0x65);
//确保把缓冲区内可能遗留的数据全部写入 Output 设备中
os.flush();
}
}
public static void main(String[] args) throws Exception{
try(OutputStream os = new FileOutputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
byte[] buf = {0x65, 0x65, 0x20, 0x65, 0x0d, 0x0a, 0x65};
os.write(buf);
os.flush();
}
}
Writer 抽象类 OutputStreamWriter 实现类
public static void main(String[] args) throws Exception{
try(OutputStream os = new FileOutputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
try(Writer writer = new OutputStreamWriter(os,"UTF-8")){
writer.write("爱好\r\n");
writer.write("单位");
writer.flush();
}
}
}
public static void main(String[] args) throws Exception{
try(OutputStream os = new FileOutputStream("D:/java/javastudy/Java_EE课堂代码/test.txt")){
try(Writer writer = new OutputStreamWriter(os,"UTF-8")){
try(PrintWriter printWriter = new PrintWriter(writer)){
printWriter.println("将飞机往返");
printWriter.print(222);
printWriter.flush();
}
}
}
}
小结
InputStream 输入流, 背后就是输入设备(模拟的输入设备)
- read() / read(byte[])
- EOS(-1)
- Scanner(is,“UTF-8”)
OutputStream 输入流,背后就是输出设备(模拟的输出设备)
- write(int) / write(byte[])
- flush() 缓存区 (buffer) 平衡写入次数
- OutputStreamWriter(做字符集编码处理) + PrintWriter(使用我们熟悉的 print/println/printf)
要是对大家有所帮助的话,请帮我点个赞吧。