简单易懂讲文件
注意事项
如果运行代码的时候找不到文件,但是文件的的确确又存在,检查下 idea 的工作路径
路径
Path
Path 对象是将一个路径封装成一个对象,然后通过这个对象来执行路径的一些操作,所有的方法如下。具体的方法功能通过名称也能猜得八九不离十,不了解的查 API 文档。所有下面的方法都可以通过 idea 进入对应的类点击 alt + 7 查看
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 文档。
Files 对象
Files 对象可以操作对象路径下的文件,也可以操作这个路径,这里的路径是被包装成 Path 对象的。
文件查找
通过 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());
}
}
输出:
文件太大怎么办
读取
通过 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();
}
}
输出:
文章为本人学习过程中的一些个人见解,漏洞是必不可少的,希望各位大佬多多指教,帮忙修复修复漏洞!!!
进入本人语雀文档体验更好哦
https://www.yuque.com/docs/share/e91bfe3d-1d76-4ef2-99a5-543d79e20c38?# 《文件》
参考资料:java 编程思想
你可能还想阅读以下文章:
简单易懂讲IO