- File
构造方法
基本方法
修饰符及返回 值类型 | 方法签名 | 说明 |
String | getParent() | 返回 File 对象的父目录文件路径 |
String | getName() | 返回 FIle 对象的纯文件名称 |
String | getPath() | 返回 File 对象的文件路径 |
String | getAbsolutePath() | 返回 File 对象的绝对路径 |
String | getCanonicalPath() | 返回 File 对象的修饰过的绝对路径 |
boolean | exists() | 判断 File 对象描述的文件是否真实存在 |
boolean | isDirectory() | 判断 File 对象代表的文件是否是一个目录 |
boolean | isFile() | 判断 File 对象代表的文件是否是一个普通文件 |
boolean | createNewFile() | 根据 File 对象,自动创建一个空文件。成功创建后返 回 true |
boolean | delete() | 根据 File 对象,删除该文件。成功删除后返回 true |
void | deleteOnExit() | 根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行 |
String[] | list() | 返回 File 对象代表的目录下的所有文件名 |
File[] | listFiles() | 返回 File 对象代表的目录下的所有文件,以 File 对象 表示 |
boolean | mkdir() | 创建 File 对象代表的目录 |
boolean | mkdirs() | 创建 File 对象代表的目录,如果必要,会创建中间目 录 |
boolean | renameTo(File dest) | 进行文件改名,也可以视为我们平时的剪切、粘贴操 作 |
boolean | canRead() | 判断用户是否对文件有可读权限 |
boolean | canWrite() | 判断用户是否对文件有可写权限 |
基本的file类内的一些方法等基本能够掌握,那我们如果改变文件里面的内容呢? 这里就要涉及一个全新的概念:流对象
2.流对象
可以将数据的读写操作想象成一大盆里面的水,水就是数据,当我们往里加水的时候,想加多少加多少,只要不超过盆的限度,这时候就叫写操作——输出流,反之把水(数据)放出的过程就是——读操作,输入流。
把读写文件的相关对象就叫流对象,而java中流对象主要分为俩大类:字节流,字符流。
我们要清楚的是,这俩大类有很多共同点的(在使用的时候):
1.打开文件 构造
2.读操作/写操作
3.关闭文件
3.字节流
字节流是操作二进制文件的,
InputStream
这是个抽象类不能直接实例化,当然还有OutputStream、Write、Reader。
其构造不再赘述,主要讲解其发方法:
修饰符及 返回值类 型 | 方法签名 | 说明 |
int | read() | 读取一个字节的数据,返回 -1 代表已经完全读完了 |
int | read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,返回实际读到的数 量;-1 代表以及读完了 |
int | read(byte[] b, int off, int len) | 最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返 回实际读到的数量;-1 代表以及读完了 |
void | close() | 关闭字节流 |
read方法 记住返回值 是实际读取的个数
InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本
可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用
FileInputStream
public static void main1(String[] args) throws IOException {
//InputStream inputStream = new FileInputStream("D:/test.txt");
try(InputStream inputStream = new FileInputStream("D:/test.txt");) {
while(true){
int b = inputStream.read();
if(b == -1){
//文本读操作完成
break;
}
System.out.printf("%c",b);
}
}
}
这是常见的字符流读操作的基本实现try可以实现close的用法,用b接受read的返回值,每次循环的时候都要判断是否为-1,为-1的话就要break
还有一种方法就是用数组的形式来接受读操作
public static void main(String[] args) throws IOException {
try(InputStream inputStream = new FileInputStream("D:/test.txt")) {
while(true){
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
if(len == -1){
break;
}
for(int i = 0;i < len;i++){
System.out.printf("%c",buffer[i]);
}
}
}
}
要注意这里的buffer是缓冲区的意思,这里read方法传进去的参数,是我们想要的结果,这就是典型的输出型参数。
要注意的是这里的read参数与行为
buffer的长度是1024,将buffer传进方法之后,read方法会想尽办法读取文本将1024个位置占满,但是并不是每一个文件都有这些数据的,如果不够的话,有多少填多少,返回值是当前填入了多少个数据,如果超过了就返回1024.
OutputStream
此类可以实现写操作,要知道的是,每次写操作就会把之前的数据先清空再进行操作。
并且input是读,output是写 这个是以cpu角度来看的。
字符流
而字符流语法和字节流差不多 就是write reader....
Scanner
public static void main(String[] args){
try(InputStream inputStream = new FileInputStream("D:/test.txt")) {
while(true){
Scanner scanner = new Scanner(inputStream);
System.out.println(scanner.next());
}
}catch (IOException e){
e.printStackTrace();
}
}