目录
File类
路径
绝对路径
相对路径
InputStream和OutputStream的使用
InputStream基本用法
OutputStream基本用法
功能实现
我们先来尝试着使用一些File类完成一些基本操作
我们查看这个文本是否存在 如果不存在我们创建一个新的文本出来
在当前文件夹中创建一个新的目录级别的文件
我们尝试查找一下D盘下的所有文件名
尝试读取一个文本中的内容
输入内容推送到文本文件中
实现方法2
实现一个磁盘检索内容功能(会查找文本中的内容)
实现将A文件中的内容拷贝到B文件中
👑作者主页:Java冰激凌
📖专栏链接:JavaEE
File类的用法和InputStream、OutputStream的用法都是Java编程中非常常见的操作,它们都可以帮助我们进行文件的读写和操作。本篇博客将对这些类的用法进行总结,方便Java初学者更好地学习和应用。
File类
Java中的File类用于表示文件名和路径的抽象表示 并且可以对于文件进行基本的操作
- 文件的创建 删除 重命名等基本操作
- 文件信息的获取 如文件的路径 名称 大小等
- 文件目录的操作 列出当前目录下的所有文件
- 文件的过滤和搜索 可以按照文件的大小 文件的类型 文件的修改时间 甚至文件的内容
File的方法也是很多的 我们介绍一下基本用法
下面是我们File类的基本用法
Flie(String path) 根据指定文件路径创建File对象
getParent() 返回File对象的父目录文件路径
getName() 返回File对象的纯文件名称
getPath() 返回File对象的文件路径
getAbsolutePath() 返回File对象的绝对路径
getCanonicalPath() 返回File对象修饰过的绝对路径
exists()判断File对象描述的文件是否存在
isDirectory() 判断File对象代表的文件是否是一个目录
isFile() 判断File对象代表的文件是否是一个普通文件
delete() 根据File对象 删除该文件
list() 返回File对象代表的目录下的所有文件名
createNewFile() 创建文件
路径
我们不得不来介绍一下我们路径
在Java中,我们可以使用File类来读写文件。在操作文件时,路径是非常重要的,路径可以指定要读写的文件的位置。Java中可以使用绝对路径和相对路径来指定文件的位置
而且在File中 我们使用到的路径分为两种 绝对路径和相对路径
绝对路径
从根目录开始的完整路径,包括盘符或者根路径和文件名。在Windows平台上,绝对路径通常以盘符开始,如C:\Program Files\Java\jdk1.8.0_211\bin\java.exe;在Linux平台上,绝对路径通常以斜杠(/)开始,如/usr/java/jdk1.8.0_211/bin/java。其中有意思的是 windouws是支持两种/或者\\的 那么这是为啥 其实这是一个历史遗留的问题 当初为了做出windouws的特色 就这么规定了 导致现在在win系统对于这个左斜杠和右斜杠的使用没有统一起来 当然win现在是都支持的
相对路径
相对路径是相对于当前工作目录的路径。在Java中,当前工作目录是指Java虚拟机运行的目录。在命令行中启动Java程序时,当前工作目录通常是启动命令所在的目录。在Eclipse等IDE中运行Java程序时,当前工作目录通常是Java项目的根目录。我们可以使用.表示当前目录,..表示上一级目录,例如./src/表示当前目录下的src目录,../src/表示当前目录的上一级目录下的src目录。
使用绝对路径和相对路径都可以指定文件的位置,但是相对路径受到工作目录的限制,如果当前工作目录发生了变化,相对路径的指向也会发生变化。因此,使用相对路径时需要留意当前工作目录的位置,建议使用绝对路径以保证文件路径的正确性。
InputStream和OutputStream的使用
InputStream和OutputStream分别是输入流和输出流 所以说 InputStream是对应的输入流 OutputStream是输出流 他们是Java IO的核心之一 InputStream用于读取数据 OutputStream用于写入数据 这两个类也是JavaIO中最基本的抽象类 其他更高级的IO类都是建立在他们之上的
InputStream基本用法
·read():从输入流中读取一个字节的数据
·read(byte[] b):从输入流中读取数据到字节数组中(此方法的做法在Java中并不常见 传入一个数组然后在方法中进行填充)
·available():返回输入流中可用的字节数
·close():关闭输入流
OutputStream基本用法
·write():写入一个字节的数据
·write(byte[] b):写入字节数组b到输入流中(也是比较特殊 但是是比较常用的之一)
·flush():刷新缓存池/将所有缓存的数据写入输出流中
·close():关闭输出流
功能实现
我们来尝试着使用以上来完成一些操作
我们先来尝试着使用一些File类完成一些基本操作
public static void main (String[] args) throws IOException {
File f = new File("./hello.txt");
System.out.println(f.getParent());
System.out.println(f.getPath());
System.out.println(f.getName());
System.out.println(f.getAbsoluteFile());
System.out.println(f.getCanonicalFile());
}
我们查看这个文本是否存在 如果不存在我们创建一个新的文本出来
public static void main (String[] args) throws IOException {
File file = new File("./baga.txt");
System.out.println(file.isFile());
System.out.println(file.isDirectory());
System.out.println(file.exists());//是否存在
if(!file.exists()){//如果不存在我们创建一个新的baga文本
file.createNewFile();
}
System.out.println(file.isFile());
System.out.println(file.isDirectory());
System.out.println(file.exists());//是否存在
}
在当前文件夹中创建一个新的目录级别的文件
public static void main (String[] args) {
File file = new File("./aaa/bbb/ccc");
//file.mkdir();
//如果要创建多级目录 那么使用mkdir会创建失败 要使用mkdirs
file.mkdirs();
}
效果展示
我们尝试查找一下D盘下的所有文件名
list不会带索引 返回的是一个文件名 listFiles会带索引 返回的是文件
public static void main (String[] args) {
File file = new File("d:/");
String[] list = file.list();
System.out.println(Arrays.toString(list));
File[] files = file.listFiles();
System.out.println(Arrays.toString(files));
}
尝试读取一个文本中的内容
public static void main (String[] args) {
try(InputStream inputStream = new FileInputStream("d://hello.txt")){
while(true){
int b = inputStream.read();
if(b == -1){
break;
}
System.out.print(b + " ");
}
} catch (IOException e) {
e.printStackTrace();
}
}
输入内容推送到文本文件中
public static void main (String[] args) throws IOException {
OutputStream outputStream = new FileOutputStream("D:\\hello.txt");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
outputStream.write(str.getBytes());
outputStream.flush();
}
实现方法2
public static void main (String[] args) {
try(OutputStream outputStream = new FileOutputStream("D://hello.txt")) {
PrintWriter printWriter = new PrintWriter(outputStream,true);
//此处将printWriter设置为了自动刷新 就不需要最后的刷新了
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
printWriter.println(str);
//printWriter.flush();
System.out.println("写入成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
实现一个磁盘检索内容功能(会查找文本中的内容)
public static void main (String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查找的路径(绝对路径或相对路径都可以)");
File file = new File(scanner.next());
System.out.println("请输入要索引的内容");
String str = scanner.next();
if(!file.isDirectory()){//如果当前索引的不是一个目录 则直接返回
System.out.println("您输入的路径不是一个目录!");
return ;
}
//使用一个函数递归去查找
isFiles(file,str);
}
private static void isFiles (File file , String str) throws IOException {
if(file == null){
return ;
}
File[] files = file.listFiles();
for(File f : files){
if(f.isFile()){//如果当前是一个普通文件 则打开进行访问
//查找是否存在
if(isContentContains(f,str)){
System.out.println(f.getCanonicalFile() + "存在索引的内容");
}
}else if(f.isDirectory()){//如果当前是一个目录 则进入递归
//递归
isFiles(f,str);
}else {
continue;
}
}
}
private static boolean isContentContains (File f , String str) {
if(f == null){
return false;
}
StringBuilder stringBuilder = new StringBuilder();
try(InputStream inputStream = new FileInputStream(f)) {
while(true){
int b = inputStream.read();
if(b == -1){
break;
}
stringBuilder.append((char)b);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString().contains(str);
}
我们这么写是比较低效率的 此处会存在大量的递归
实现将A文件中的内容拷贝到B文件中
public static void main (String[] args) {
try(InputStream inputStream = new FileInputStream("D://shuai.txt");
OutputStream outputStream = new FileOutputStream("D://hello.txt")) {
byte[] bytes = new byte[1024];
inputStream.read(bytes);
outputStream.write(bytes);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}