注意事项

如果运行代码的时候找不到文件,但是文件的的确确又存在,检查下 idea 的工作路径

简单易懂讲文件_文件查找

路径

Path

Path 对象是将一个路径封装成一个对象,然后通过这个对象来执行路径的一些操作,所有的方法如下。具体的方法功能通过名称也能猜得八九不离十,不了解的查 API 文档。所有下面的方法都可以通过 idea 进入对应的类点击 alt + 7 查看

简单易懂讲文件_ide_02

Paths

获取 Path 对象的工具类,一共两个重载方法

  • Path get(String first, String... more) 允许接收一个或者多个字符串,从而构造出一个 Path 对象
  • Path get(URI uri) 允许接收一个 uri 对象,从而构造出一个 Path 对象
import java.nio.file.Path;
import java.nio.file.Paths;

class PathDemo {
public static void demo() {
// 重载方法一,允许接受一个或者多个参数
Path path1 = Paths.get("Main.java");
System.out.println(path1.toAbsolutePath());
Path path2 = Paths.get("E","1.base","workspace","slime");
System.out.println(path2.toAbsolutePath());
// 重载方法二,允许接受一个 URI 对象
Path urlPath = Paths.get(path1.toUri());
System.out.println(urlPath.toAbsolutePath());
}
}

public class Main {
public static void main(String[] args) {
PathDemo.demo();
}
}


输出:

E:\1.base\workspace\slime\file_io\src\main\java\cyrus\file_io\file\Main.java
E:\1.base\workspace\slime\file_io\src\main\java\cyrus\file_io\file\E\1.base\workspace\slime
E:\1.base\workspace\slime\file_io\src\main\java\cyrus\file_io\file\Main.java


文件

File

文件是将文件构造成一个 File 对象,然后通过操作这个对象来对文件进行读取,新增,更新,删除等操作。具体 API 如下,根据名字也能猜个七八分,具体 API 用法可以查看 API 文档。

简单易懂讲文件_3d_03简单易懂讲文件_ide_04

Files 对象

Files 对象可以操作对象路径下的文件,也可以操作这个路径,这里的路径是被包装成 Path 对象的。

简单易懂讲文件_文件查找_05简单易懂讲文件_3d_06

简单易懂讲文件_3d_07

文件查找

通过 FileSystems 类来进行文件查找,例子如下:

在 matcher 中,glob 表达式开头的 **/ 表示“当前目录及所有子目录”,这在当你不仅仅要匹配当前目录下特定结尾的 Path 时非常有用。单 * 表示“任何东西”,然后是一个点,然后大括号表示一系列的可能性---我们正在寻找以 .tmp 或 .txt 结尾的东西。您可以在 getPathMatcher() 文档中找到更多详细信息。

class Find {
public static void demo() {
Path test = Paths.get("test");
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/*.{temp,txt}");
try {
Files.walk(test).filter(matcher::matches).forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}

public class Main {
public static void main(String[] args) {
Find.demo();
}
}


输出:

test\123.temp
test\dsaioh.txt
test\test\345.temp
test\test\qwe.txt


文件读写

读取

使用 Files 工具类进行操作,以下例子使用 readAllLines(Path path) 方法将整个 Main.java 文件读取并且打印到控制行中。

public class Main {
public static void main(String[] args) throws IOException {
List<String> list = Files.readAllLines(Paths.get("Main.java"));
list.stream().forEach(System.out::println);
}
}


输出:

package cyrus.file_io.file;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;


public class Main {
public static void main(String[] args) throws IOException {
List<String> list = Files.readAllLines(Paths.get("Main.java"));
list.stream().forEach(System.out::println);
}
}


写入

这里先创建个文件 1.txt 然后通过 Path write() 方法写入文档,该方法需要一个路径 Path 以及写入的 byte 数组

public class Main {
public static void main(String[] args) throws IOException {

File file = new File("test" + File.separator + "test" + File.separator + "1.txt");
if (!file.exists()) {
file.createNewFile();
}
String str = "input something";
Files.write(file.toPath(), str.getBytes());
}
}


输出:

简单易懂讲文件_当前目录_08

文件太大怎么办

读取

通过 Files.lines() 将文件一行一行读取,每一行都是一个 Stream 流。

public class Main {
public static void main(String[] args) throws IOException {
Stream<String> lines = Files.lines(Paths.get("Main.java"));
lines.forEach(System.out::println);
}
}


输出:

package cyrus.file_io.file;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Stream;


public class Main {
public static void main(String[] args) throws IOException {
Stream<String> lines = Files.lines(Paths.get("Main.java"));
lines.forEach(System.out::println);
}
}


写入

也是先通过Files.lines() 将文件一行一行读取,然后一行行写入

public class Main {
public static void main(String[] args) throws IOException {
String name = "test" + File.separator + "test" + File.separator + "Main.txt";
PrintWriter printWriter = new PrintWriter(name);
Files.lines(Paths.get("Main.java")).forEach(printWriter::println);
printWriter.close();
}
}


输出:

简单易懂讲文件_当前目录_09

文章为本人学习过程中的一些个人见解,漏洞是必不可少的,希望各位大佬多多指教,帮忙修复修复漏洞!!!