学习日志12 java
一段时间没更新了,再忙也要抽空写一下博客才行,大前天身体不适休息一天,前天写数模弄晚了睡迟了,昨天又睡多了,很爱睡觉了.....其实是在下软件什么的报错弄了半天,总是有这个阶段的,会进步的!!
其实这个草稿开头日期又改了,时间不等人,一晃又拖了一天。。。
快学java!今天(笔者写在此行字的时候,又变成昨天了)学习文件!平时不要摸鱼太多,期末最后会不能摸鱼的!!6月就要来了!!啊!
1 Java 文件操作的关键知识
1. 文件系统与路径
路径表示
- 绝对路径:完整路径,如
C:\Users\test.txt
(Windows)或/home/user/test.txt
(Linux/macOS)。 - 相对路径:相对于当前工作目录,如
./data/config.txt
。
java.nio.file.Path
与 PathMatcher
Path
:Java 7 引入的路径接口,替代旧的File
类,提供更灵活的路径操作。import java.nio.file.Path; import java.nio.file.Paths;Path path = Paths.get("src", "main", "java", "App.java");
PathMatcher
:支持通配符匹配路径,如glob:*.java
或regex:.*\.java
。
2. 文件与目录操作
传统 java.io.File
类
- 创建文件:
File file = new File("test.txt"); boolean created = file.createNewFile();
- 检查文件状态:
boolean exists = file.exists(); boolean isDir = file.isDirectory();
- 删除文件:
boolean deleted = file.delete();
Java 7+ 的 java.nio.file.Files
工具类
- 创建文件 / 目录:
Files.createFile(Paths.get("test.txt")); Files.createDirectories(Paths.get("data/subdir"));
- 复制 / 移动 / 删除:
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); Files.move(source, target); Files.deleteIfExists(path);
- 文件属性:
long size = Files.size(path); boolean hidden = Files.isHidden(path);
3. 输入输出流(I/O Streams)
字节流 vs 字符流 !!!!!
- 字节流:处理二进制数据,如图片、音频。
InputStream
/OutputStream
FileInputStream
/FileOutputStream
- 字符流:处理文本数据,自动处理字符编码。
Reader
/Writer
FileReader
/FileWriter
缓冲流
- 包装基础流以提高效率,如
BufferedReader
、BufferedWriter
。try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);} }
序列化(Serialization)
- 将对象转换为字节序列,用于存储或网络传输。
class Person implements Serializable {private String name;// ... }// 序列化 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser")); oos.writeObject(person);// 反序列化 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser")); Person restored = (Person) ois.readObject();
4. 文件读写最佳实践
使用 try-with-resources
自动关闭资源,避免内存泄漏:
try (FileWriter fw = new FileWriter("output.txt")) {fw.write("Hello, World!");
} // 自动关闭 fw
文件编码处理
指定字符编码(如 UTF-8):
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt"), StandardCharsets.UTF_8))) {bw.write("中文内容");
}
Java 8+ 的 Files
简化读写
// 读取文本文件全部内容
List<String> lines = Files.readAllLines(Paths.get("input.txt"), StandardCharsets.UTF_8);// 写入文本
Files.write(Paths.get("output.txt"), "Hello".getBytes(StandardCharsets.UTF_8));
5. 目录遍历与文件查找
递归遍历目录
Files.walk(Paths.get("data")).filter(Files::isRegularFile).forEach(path -> System.out.println(path));
查找特定文件
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.{java,class}");
Files.find(Paths.get("src"), 10, (path, attrs) -> matcher.matches(path.getFileName())).forEach(System.out::println);
6. 临时文件与文件锁
创建临时文件
File tempFile = File.createTempFile("prefix", ".tmp");
tempFile.deleteOnExit(); // JVM退出时自动删除
文件锁
- 防止多进程同时修改文件:
try (RandomAccessFile file = new RandomAccessFile("data.txt", "rw");FileChannel channel = file.getChannel();FileLock lock = channel.lock()) { // 或使用 tryLock() 非阻塞// 安全地修改文件 }
7. 常见问题与注意事项
-
路径分隔符:
- Windows 使用
\
,Linux/macOS 使用/
。 - 使用
File.separator
或Paths.get()
自动处理。
- Windows 使用
-
权限问题:
- 创建文件前检查目录是否可写:
file.getParentFile().mkdirs()
。
- 创建文件前检查目录是否可写:
-
大文件处理:
- 使用缓冲流或 NIO 的
MappedByteBuffer
避免内存溢出。
- 使用缓冲流或 NIO 的
-
字符编码:
- 读写文本时显式指定编码(如
UTF-8
),避免乱码。
- 读写文本时显式指定编码(如
总结
Java 的文件操作经历了从 java.io
到 java.nio.file
的演进,后者提供了更现代、更高效的 API。实际开发中,建议优先使用 Files
、Path
等 NIO 工具类,并注意资源管理和编码处理。
2 有关命令行控制文件io流的心得
折腾两天的结果,自己记录一下。学的东西并不多但是贵在多摸索了,没有放弃
1 环境变量
在调试千次万次代码无果的时候,可以回头看一下最基础的jdk环境是否兼容。
在经过学习以后,我把初始下载更无知的阶段jdk1.8版本卸载重装,当时跟练的博客已经太久远了。
下载选择openjdk21,这个版本的jdk环境稳定,在github上也会有更多的开源代码。然后idea配置项目的jdk环境和电脑配置的系统环境变量一致,这样,我们的代码才能成功在命令行运作。
可以在win R 输入regedit 找到jdk地址设置好环境变量,控制面板或者cmd命令行看是不是配好了
关于python库的配置也是差不多,pip install 库,然后可以在pycharm里面生成一个test.py
简单调用一下库随便写一个print version 的语句试试呢,如果安装好了就是可以跑起来的,不能的话直接在ide里面装也可,不过我试过还是先在cmd指令里装好,pycharm才比较容易成功安装,不然有时候会抽风,一开始怎么也装不上,可能是版本编译器的问题,更新了ide的版本编译器和系统环境一致就可以了,想来自己在这些最基础的地方还是太忽视,经验不足,不过才开始一切错误都是财富。
2 有关命令行提示符
cd \d 代码存储目录 (存储路径复制了以后删掉代码的名字)
可以导入把我的c盘转到我存的另一个盘里面,cd ..\退一个目录
javac生成源代码------------使用javac
命令编译.java
文件,出现一个新的class文件
然后java文件 打开文件名 生成文件名
注意文件所在目录 要找对路径 多试试几次就熟练了,最好有try异常处理交互,就很明白是不是输错路径了,这块代码要多练多练。