既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
观察 get 系列的特点和差异
import java.io.File;
import java.io.IOException;
public class Test01 {
public static void main(String[] args) throws IOException {
//绝对路径
File f = new File("g:/test.txt");
System.out.println(f.getParent());//获取到文件的父目录
System.out.println(f.getName());//获取到按文件名
System.out.println(f.getPath());//构造File的时候,指定的路径
System.out.println(f.getAbsolutePath());//获取到绝对路径
System.out.println(f.getCanonicalPath());//获取到绝对路径
System.out.println("=====================");
//相对路径
File f2 = new File("./test.txt");
System.out.println(f2.getParent());//获取到文件的父目录
System.out.println(f2.getName());
System.out.println(f2.getPath());//构造File的时候,指定的路径
//获取到绝对路径在基准路径的基础上,又把相对路径给拼接上来了
System.out.println(f2.getAbsolutePath());
System.out.println(f2.getCanonicalPath());//获取到的是化简过的绝对路径
}
}
输出结果:
绝对路径创建的文件就在指定的路径下面:
通过相对路径创建文件,一定得先明确一个"基准路径",如果是通过IDEA
的方式来运行程序,此时基准路径就是当前java项目所在的路径。
在IDEA中直接运行,基准路径就是上述目录,此处写的"./test.txt
"在IDEA中运行,意思就是找javaIO
目录下的test.txt
。
一旦文件路径指定错误,很容易出现找不到文件的情况。
普通文件的创建、删除
import java.io.File;
import java.io.IOException;
public class Test09 {
public static void main(String[] args) throws IOException {
File file = new File("hello.txt"); 要求该文件不存在,才能看到不一样现象
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println("创建文件");
file.createNewFile();//创建文件时抛出异常
System.out.println("创建文件结束");
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.createNewFile());//已经创建过的文件不能重复创建
}
}
输出结果:
普通文件的删除
package File;
import java.io.File;
import java.io.IOException;
public class Test10 {
public static void main(String[] args) throws IOException {
File file = new File("g:/hello.txt");
System.out.println(file.exists());
file.createNewFile();
System.out.println(file.exists());
file.delete();
System.out.println(file.exists());
}
}
输出结果:
目录的创建
创建目录的时候,使用mkdir
只能创建一级目录,要想一次创建多级,需要使用mkdirs
:
mkdir()
的时候,如果中间目录不存在,则无法创建成功; mkdirs()
可以解决这个问题。
import java.io.File;
public class Test10 {
public static void main(String[] args) {
File file = new File("./aaa/bbb/ccc/ddd");
// file.mkdir();
file.mkdirs();
System.out.println(file.isDirectory());//true
}
}
返回File对象代表的目录下的所有文件名
package File;
import java.io.File;
import java.util.Arrays;
public class Test11 {
public static void main(String[] args) {
File file = new File("./");
//返回File 对象代表的目录下的所有文件名
// System.out.println(Arrays.toString(file.list()));
//返回File对象代表的目录下的所有文件,以File对象表示
System.out.println(Arrays.toString(file.listFiles()));
}
}
输出结果:
文件重命名
import java.io.File;
public class Test11 {
public static void main(String[] args) {
File file1 = new File("./aaa");
File file2 = new File("./sss");
file1.renameTo(file2);
}
}
输出结果:
三、文件内容的读写 —— 数据流
针对文件内容的读写,Java标准库提供了一组类,首先按照文件的内容,分成了两个系列:
1)字节流对象,针对二进制文件,是以字节为单位进行读写的;读:InputStream
,写:OutputStream
,上述都是抽象类,实际使用的往往是这些类的子类:FileInputStream、FileOutputStream.
2)字符流对象,针对文本文件,是以字符为单位进行读写的;读:Reader
,写:Writer
,实际上使用的是这些抽象类的子类:FileReader、FileWriter
.
抽象类既可以针对普通文件的读写,也可以针对特殊文件(网卡,socket文件)进行读写;其子类只能针对普通文件进行读写。
为啥上述内容叫做"流”对象?
流Stream,这是一个形象的比喻。此处我们说的流,就像水流一样,打开开关,就源源不断的感觉。
例如:想通过这个流对象,来读取100个字节.可以一次读10个字节,分10次读完;
也可以一次读20个字节,分5次读完;还可以一次读100个字节,分1次读完。
InputStream 方法
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
int | read() | 读取一个字节的数据,返回 -1 代表已经完全读完了 |
int | read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,把读到的结果放到参数中指定的数组中,返回实际读到的数量;-1 代表以及读完了 |
int | read(byte[] b,int off, int len) | 最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了 |
void | close() | 关闭字节流 |
读文件–一次读取一个字节
import java.io.\*;
//读文件
public class Test12 {
public static void main(String[] args) {
try(InputStream inputStream = new FileInputStream("g:/test.txt")){
while (true){
int len = inputStream.read();
if(len == -1){
break;
}
System.out.println(len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
文件里面的内容:
输出结果:
在这个代码中,没有显式的调用close
但是try
会帮我们自动调用。
当代码执行完这里的try语句块之后,就会自动的调用close。
得符合一定的条件,才能放到try ( )中.实现Closeable
这个interface
,所有的流对象,都实现了Closeable
,所以就可以直接放了.
读文件–一次读取若干个文件
package File;
import java.io.\*;
public class Test02 {
public static void main(String[] args) {
try(InputStream inputStream = new FileInputStream("g:/test.txt")){
while (true){
//一次读取若干个字节
//这个操作是把读出来的结果放到 buffer这个数组中了.
//相当于是使用参数来表示方法的返回值.这种做法称为“输出型参数"
//这种操作在Java中比较少见.C++中遍地都是~~
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
if(len == -1){
break;
}
for (int i = 0; i < len; i++) {
System.out.println(buffer[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用字节流写文件
package File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test03 {
public static void main(String[] args) {
try(OutputStream outputStream = new FileOutputStream("g:/test.txt")){
//一次写入一个字节
// outputStream.write(97);
// outputStream.write(98);
// outputStream.write(99);
//一次写入多个字节
byte[] buffer = new byte[]{97,98,99,100};
outputStream.write(buffer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用字符来读
package File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Test04 {
public static void main(String[] args) {
try(Reader reader = new FileReader("g:/test.txt")){
//按照字符来读
while (true){
char[] buffer = new char[1024];
int len = reader.read(buffer);
if(len == -1){
break;
}
// for (int i = 0; i < len; i++) {
// System.out.println(buffer[i]);
// }
String s = new String(buffer,0,len);
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果:
按照字符来写
package File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
//按照字符来写
public class Test05 {
public static void main(String[] args) {
try(Writer writer = new FileWriter("g:/test.txt")){
writer.write("xyz");
} catch (IOException e) {
e.printStackTrace();
}
}
}
应用1:实现查找文件并删除
扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录), 并且后续询问用户是否要删除该文件。
package File;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
/\*\*
\* 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),
\* 并且后续询问用户是否要删除该文件
\*/
public class Test06 {
private static void scanDir(File rootDir,String toDeleteName){
//列出rootDir中的内容
File[] files = rootDir.listFiles();
if(files == null){
return;
}
for(File f : files){
if(f.isFile()){
if(f.getName().contains(toDeleteName)){
// 不要求名字完全一样, 只要文件名中包含了关键字即可删除
deleteFile(f);
}
}else if(f.isDirectory()){
scanDir(f,toDeleteName);
}
}
}
private static void deleteFile(File f) {
try {
System.out.println(f.getCanonicalPath() + "确定要删除吗?Y/y");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
if(str.equals("Y") || str.equals("y")){
f.delete();
System.out.println("文件删除成功!");
}else {
System.out.println("文件取消删除!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//1.输入要遍历的目录,以及要删除的文件名
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要扫描的路径:");
String rootDirPath = scanner.next();
System.out.println("请输入要删除的文件名:");
String toDeleteName = scanner.next();
File rootDir = new File(rootDirPath);
if(!rootDir.isDirectory()){
System.out.println("输入的路径有误!!!");
return;
}
//2.遍历目录, 把 指定目录 中的所有文件和子目录都遍历一遍, 从而找到要删除的文件
scanDir(rootDir,toDeleteName );
}
}
文件原来存放位置为G盘下 test.txt.
输出结果:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
b20aca3cd14b2794020da23810bed1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2l5a2m5Lmg55qE5bCP5byg,size_12,color_FFFFFF,t_70,g_se,x_16)
[外链图片转存中…(img-o7yBV9HT-1715563955799)]
[外链图片转存中…(img-3wTUDB8c-1715563955799)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新