目录
认识文件
文件包含数据内容本身+metadata(文件的头信息,即文件名,修改时间,文件大小等)
树型组织和目录
多子树
文件路径
绝对路径:从根节点到叶子节点的整个路径(windows是从各个磁盘开始)
C:\Go\bin\go.exe
相对路径:从任意一个节点出发,到目的节点
../上一级
./当前目录
从:C:\Go\bin\go.exe
到:C:\Java\jdk1.8.0_192
../../Java\jdk1.8.0_192(从当前文件夹出发,如果是文件,则从当前.exe文件的上一级的文件夹出发)
文本划分
文本类型、二进制类型
打开文本,需要指定的编码格式,保存和打开的时候编码格式要一致,否则就是乱码
文件权限
读、写、执行
文件分割符
windows是\,linux是
但是很多工具,比如java中,写/和\都可以,因为某些工具,java程序会自动转为系统的文件分隔符
Java中的文件操作
java.io.File
属性
构造函数
注意:File f = new File("C:/xxx") 不存在的路径的话,这个File对象还是实例化了,只是不存在(可以通过一个方法来判断)
方法
使用
创建一个文件
package File操作;
import java.io.File;
import java.io.IOException;
public class 创建一个文件 {
public static void main(String[] args) throws IOException {
File f = new File("C:/Test/1.txt");
if(!f.exists()){
f.createNewFile();
}
}
}
创建目录
package File操作;
import java.io.File;
public class 创建目录 {
public static void main(String[] args) {
//创建一级目录
File f = new File("C:/Test/1");
// if(!f.exists()){
f.mkdir();//如果存在也不会保存
// }
//创建多级目录
File f2 = new File("C:/Test/2/3/4");
f2.mkdirs();
}
}
获取下一级子文件或目录
package File操作;
import java.io.File;
import java.util.Arrays;
public class 获取下一级子文件或目录 {
public static void main(String[] args) {
File f = new File("C:/Test/2");
File[] children = f.listFiles();
System.out.println(Arrays.toString(children));
}
}
获取文件信息
package File操作;
import java.io.File;
import java.util.Date;
public class 获取文件信息 {
public static void main(String[] args) {
File f = new File("E:/Test/1.txt");
System.out.println("path: "+f.getPath());
System.out.println("name: "+f.getName());
//返回文件的大小(字节数)
System.out.println("length: "+f.length());
//返回上次修改时间:返回一个Long,可以转换为时间
System.out.println("last modified: "+f.lastModified());
System.out.println("last modified => Date: "+new Date(f.lastModified()));
System.out.println("isFile: "+f.isFile());
System.out.println("isDirectory: "+f.isDirectory());
}
}
获取目录下所有的文件或目录
package File操作;
import java.io.File;
public class 获取目录下所有的文件或目录 {
//递归遍历
public static void main(String[] args) {
File f = new File("C:/Test/2");
list(f);
}
private static void list(File f){
//不管是文件还是目录,都打印(需求)
System.out.println(f);
//如果是目录,还需要查找子文件/目录
if(f.isDirectory()){
//子文件/目录,不包含孙子
File[] children = f.listFiles();
//再次递归
for(File child : children){
list(child);
}
}
}
}
重命名
package File操作;
import java.io.File;
public class 重命名 {
public static void main(String[] args) {
//重命名
// File f = new File("C:/Test/1.txt");
// f.renameTo(new File("C:/Test/1_rename.txt"));
//移动
// File f = new File("E:C:/Test/1_rename.txt");
// f.renameTo(new File("C:/Test/10/1_rename.txt"));
//删除文件
// File f = new File("C:/Test/10/1_rename.txt");
// f.delete();
//删除目录:目录下没有东西才可以删
//所以:如果删除有东西的目录:要一个一个遍历,依次删除
File f = new File("C:/Test/1");
f.delete();
}
}
文件内容的读写(数据流)
关于io操作
将一个设备传输到另一个设备就是io操作,i是input,o是output
io不同的类型:
(1)文件io
(2)网络io
InputStream
FileInputStream
构造方法
如果利用try(创建io流),再try结束,会自动关闭流
文件读取
package io操作;
import java.io.FileInputStream;
import java.io.IOException;
public class 文件读取 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:/Test/1.txt");
// FileInputStream fis = new FileInputStream(new File("C:/Test/1.txt"));
byte[] bytes = new byte[fis.available()];
int b;
//不停的读,一直读到输入流结束(文件结束)
for(int i=0; (b = fis.read()) != -1; i++){
bytes[i] = (byte) b;
}
System.out.println(new String(bytes, "UTF-8"));
}
}
文件读取2
package io操作;
import java.io.FileInputStream;
import java.io.IOException;
public class 文件读取2 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:/Test/1.txt");
// FileInputStream fis = new FileInputStream(new File("C:/Test/1.txt"));
//先准备一个字节数组,用来保存每次读取的数据
byte[] bytes = new byte[1024];
//每次读取的长度
int len;
//不停的读,一直读到输入流结束(文件结束)
while((len = fis.read(bytes)) != -1){
//此时,字节数组中,0~len范围,就是读取的数据
//二进制数据转为字符串,需要和保存时的编码格式一致
//String的构造方法,把字节数组,从offset(偏移量)的位置,读取len个长度
//也就是,将 offset 到 offset+len 范围的字节数据,转为字符串
String s = new String(bytes, 0, len, "UTF-8");
System.out.println(s);
}
}
}
字符输入流读取文件
package io操作;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class 字符输入流读取文件 {
public static void main(String[] args) throws IOException {
//使用的比较多的是BufferedReader => 读文本文件,且效率比较高
//先获取一个字节流
FileInputStream fis = new FileInputStream("C:/Test/1.txt");
//在包装为一个字节字符转换流
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
//再包装为字符流
BufferedReader br = new BufferedReader(isr);
String line;
//读取一行,如果没结束,就一直读
while((line=br.readLine()) != null){
System.out.println(line);
}
}
}
OutputStream
FileOutputStream
构造方法
注意:输出流,写了数据,如果这个输出流对象,有flush,记得调用一下,表示刷新缓冲区,进入硬盘
字节流写文件
package io操作;
import java.io.FileOutputStream;
import java.io.IOException;
public class 字节流写文件 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("C:/Test/1.txt");
String s = "写文件操作";
fos.write(s.getBytes("UTF-8"));
fos.close();
}
}
字节流复制文件
package io操作;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class 字节流复制文件 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:/Test/1.txt");
FileOutputStream fos = new FileOutputStream("C:/1_copy.txt");
byte[] bytes = new byte[1024*8];
int len;
while((len=fis.read(bytes))!=-1){
//字节数组中0~len范围是读取的数据,就同时往输出流写数据
fos.write(bytes, 0, len);
fos.flush();
}
fos.close();
fis.close();
}
}
字符流写文件
package io操作;
import java.io.*;
public class 字符流写文件 {
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
//先获取一个字节输出流
FileOutputStream fos = new FileOutputStream("C:/Test/1.txt");
//在包装为一个字节字符转换流
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
//在包装为一个字符输出流
// BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(osw);
//这些字符输出流的api,写文本内容,就比较方便
pw.print("哈哈");//不带换行的输出
pw.println("学习");//带换行
pw.flush();
pw.close();
}
}