File
File类型的构造方法
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。 |
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。 |
File类型的创建方式
boolean |
createNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 |
||
boolean |
mkdir() 创建由此抽象路径名命名的目录。 |
||
boolean |
mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 |
练习:在D盘中a/b/c创建一个文件,名称叫HelloWorld.java
import java.io.File;
import java.io.IOException;
/*8.练习:在D盘中a/b/c创建一个文件,名称叫HelloWorld.java*/
//注:没D盘,用F盘代替了
public class Test01IO {
public static void main(String[] args) throws Exception {
File dir = new File("F:/a/b/c");
dir.mkdirs();
File file = new File(dir,"HelloWorld.java");
file.createNewFile();
}
}
File类型的删除方法
boolean |
delete() 删除由此抽象路径名表示的文件或目录。 |
注意事项:
在删除文件夹的时候,只能删除的空的文件夹。
delete方法不走回收站。
File类型的重命名功能
boolean |
renameTo(File dest) 重命名由此抽象路径名表示的文件。 |
注意事项:
如果在同一个文件夹下,修改路径,就是重命名操作。
如果不在同一个文件夹下,修改路径,就是剪切操作。
(一开始File dest不能真实存在)
File类型中的判断功能
boolean |
exists() 测试此抽象路径名表示的文件或目录是否存在。 |
||
boolean |
isDirectory() 测试此抽象路径名表示的文件是否为目录。 |
||
boolean |
isFile() 测试此抽象路径名表示的文件是否为普通文件。 |
File类型的获取方法
String |
getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 |
||
String |
getPath() 将此抽象路径名转换为路径名字符串。 |
||
String |
getName() 返回由此抽象路径名表示的文件或目录的名称。 |
||
long |
length() 返回由此抽象路径名表示的文件的长度。 |
||
String[] |
list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 |
||
File[] |
listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 |
练习一:
键盘录入一个字符串,表示一个文件夹路径,如果不是文件夹提示重新录入,打印当前文件夹下,所有的大于10M的后缀名名为.mp4文件的绝对路径。
isDirectory() listFiles() length() getName().endWiths(“mp4”) getAbsoultPath()
import java.io.File;
import java.util.Scanner;
/*13.键盘录入一个字符串,表示一个文件夹路径,如果不是文件夹提示重新录入,
打印当前文件夹下,所有的大于10M的后缀名名为.mp4文件的绝对路径。
isDirectory() listFiles() length() getName().endWiths(“mp4”) getAbsoultPath()*/
public class Test01File {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean flag;
do {
flag = false;
System.out.println("请录入一个字符串(文件夹路径):");
String path = sc.nextLine();
File file = new File(path);
if(file.isDirectory()) {//true当且仅当该抽象路径名表示的文件存在且为目录时; false否则
printAbsolutePath(file);
}else {
System.out.println("亲,您刚刚的录入有误,请重新录入哦!");
flag = true;
}
}while(flag);
}
//打印当前文件夹下,所有的大于10M的后缀名名为.mp4文件的绝对路径
private static void printAbsolutePath(File file) {
File[] files = file.listFiles();
/*if(files.length == 0) {
System.out.println("这是一个空文件夹");
return;
}*/
for(File f : files) {//true当且仅当该抽象路径名表示的文件存在且为文件时; false否则
if(f.isFile()) {
//1kb = 1024字节 1mb = 1024kb
if(f.getName().endsWith(".mp4")&&f.length()>10*1024*1024) {
System.out.println(f.getAbsolutePath());
}
}else {
printAbsolutePath(f);
}
}
}
}
练习二:
键盘录入一个文件夹路径,打印这个文件夹下的所有文件的绝对路径(包含子文件夹的内容)
import java.io.File;
import java.util.Scanner;
/*键盘录入一个文件夹路径,打印这个文件夹下的所有文件的绝对路径(包含子文件夹的内容)*/
public class Test02File {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean flag;
do {
flag = false;
System.out.println("请录入一个字符串(文件夹路径):");
String path = sc.nextLine();
File file = new File(path);
if(file.isDirectory()) {//true当且仅当该抽象路径名表示的文件存在且为目录时; false否则
printAbsolutePath(file);
}else {
System.out.println("亲,您刚刚的录入有误,请重新录入哦!");
flag = true;
}
}while(flag);
}
private static void printAbsolutePath(File file) {
File[] files = file.listFiles();
/*if(files.length == 0) {
System.out.println("这是一个空文件夹");
return;
}*/
for(File f : files) {//true当且仅当该抽象路径名表示的文件存在且为文件时; false否则
if(f.isFile()) {
System.out.println(f.getAbsolutePath());
}else {
printAbsolutePath(f);
}
}
}
}
IO流(字符流、字节流)
输入输出流是站在内存的角度上看的!站在内存的角度看待方向,从其它设备进入到内存的,都是输入,从内存到其它设备,都是输出
体系结构
字节流:
字节输入流:InputStream
字节输出流: OutputStream
字符流:
字符输入流:Reader
字符输出流:Writer
InputStream
字节输入流的顶层父类
常用的方法 输入流:读取
abstract int |
read() 从输入流读取数据的下一个字节。 结束标志为-1 |
int |
read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。 结束标志为-1 |
int |
read(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。 |
Int len = read(byte[] buf);返回值为覆盖字节数组的长度。
使用InputStream的子类对象FileInputStream
FileInputStream的构造方法
FileInputStream(File file)
通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
FileInputStream(String name)
通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
OutputStream
字节输出流的顶层抽象父类。
常用方法
void |
write(byte[] b) 将 b.length字节从指定的字节数组写入此输出流。 |
||
void |
write(byte[] b, int off, int len) 从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。 |
||
abstract void |
write(int b) 将指定的字节写入此输出流。 |
||
void |
close() 关闭此文件输出流并释放与此流相关联的任何系统资源。 |
FileOutputStream
FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件。 |
FileOutputStream(File file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件。 |
FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。 |
FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。 |
InputStream类型的read()方法和read(byte[] buf)方法的比较
读取字节个数的区别
read()方法一次只读取一个字节
read(buf)方法一次可以读取多个字节,取决于数组的大小
返回值不同
read()读取到的是文件字节信息是作为返回值进行返回的。
read(buf):读取到的字节存储到数组中,返回的是覆盖数组的长度。
高效缓冲流
BufferedInputStream和BufferedOutputStream
构造方法
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedInputStream高效的原理:在该类型中准备一个数组,存储字节信息,当外界调用read()方法想获取一个字节的时候,该对象从文件中一次性读取一8192个字节到数组中,只返回一个字节,再次调用读取方法read(),只需要从自带的数组中去获取数据即可,不再需要重新访问文件。
BufferedOutpStream高效的原理:在该类中准备一个数组,存储字节信息,当外界调用write()方法想写出一个字节的时候,该对象直接将这个字节存储到自已的数组中,而不刷新到新文件中,一直到该数组所有8192个位置全都占满,该对象才把这个数组中所有的数据一次性写到目标文件中。
通用流的书写格式
创建一个流和文件进行关联,提高效率加byte[],
加上高效缓冲流,自带缓存。
输出流中的close和flush的区别
close方法在调用的时候默认先会调用flush
close方法把流对象关闭掉了
flush只是把缓冲区的数据刷新到文件中
字符流
字符输入流:Reader
字符输出流:Writer
字节流虽然也可以操作字符,但是在操作中英文混合的时候,判断起来较麻烦,需要判断中英文的标识,如果是英文的标识,直接读取一个字节,如果是中文的标识,需要再次读取一个字节拼接成两个字节,一块读取,这种操作判断起来非常 麻烦,恰巧字符流帮咱们封装这种判断标识的操作,所以直接可以使用字符流来操作中英文混合的字符。
Reader:
int |
read() 读一个字符 结束标志-1 |
int |
read(char[] cbuf) 将字符读入数组。 结束标志-1 |
Writer:
void |
write(char[] cbuf) 写入一个字符数组。 |
||
abstract void |
write(char[] cbuf, int off, int len) 写入字符数组的一部分。 |
||
void |
write(int c) 写一个字符 |
||
void |
write(String str) 写一个字符串 |
||
void |
write(String str, int off, int len) 写一个字符串的一部分。 |
||
abstract void |
close() 关闭流,先刷新。 |
||
abstract void |
flush() 刷新流。 |
练习:
字符流的复制粘贴操作
//字符流的复制粘贴操作
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
//复制粘贴docx文档还是会出现乱码,但是txt文档就没问题
public class Test02IO {
public static void main(String[] args) throws Exception {
//BufferedReader br = new BufferedReader(new FileReader("F:\\BigData\\课程资料\\正在学习\\大数据1028班\\Homework2019\\Homework20191104.docx"));
//BufferedWriter bw = new BufferedWriter(new FileWriter("F:/a/Homework20191104.docx"));
BufferedReader br = new BufferedReader(new FileReader("F:\\BigData\\课程资料\\正在学习\\大数据1028班\\Homework2019\\a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("F:/a/a.txt"));
String str = "";
while((str=br.readLine())!=null) {
bw.write(str);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}