File类的使用
常用方法
- File类的判断功能
- *public boolean isDirectory():判断是否是文件目录。
- *public boolean isFile():判断是否是文件。
- *public boolean exists():判断是否存在。
- public boolean canRead():判断是否可读
- public boolean canWrite():判断是否可写
- public boolean isHidden():判断是否隐藏
public class Demo03 {
public static void main(String[] args) {
/*
*- public boolean isDirectory():判断是否是文件目录。
*- public boolean isFile():判断是否是文件
*- public boolean exists():判断是否存在
- public boolean canRead():判断是否可读
- public boolean canWrite():判断是否可写
- public boolean isHidden():判断是否隐藏
*/
File file = new File("hi.txt");
System.out.println(file.isDirectory());//false
System.out.println(file.isFile());//true
System.out.println(file.exists());//true
System.out.println(file.canRead());//true
System.out.println(file.canWrite());//true
System.out.println(file.isHidden());//false
System.out.println("=======");
File file1 = new File("F:\\IO流文件例子\\he");
System.out.println(file1.isDirectory());//true
System.out.println(file1.isFile());//false
System.out.println(file1.exists());//true
System.out.println(file1.canRead());//true
System.out.println(file1.canWrite());//true
System.out.println(file1.isHidden());//false
}
}
-
File类的创建功能
- public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
- public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
- public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建
注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
-
File类的删除功能
- public boolean delete():删除文件或者文件夹
删除注意事项:
Java中的删除不走回收站。
要删除一个文件目录,请注意该目录文件内不能包含文件或者文件目录
public class Demo04 {
public static void main(String[] args) throws IOException {
/*
创建硬盘中对应的文件或文件目录:
- public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
- public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
- public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建
删除硬盘中的文件或文件目录:
public boolean delete():删除文件或者文件夹
*/
File file = new File("hello.txt");
//文件的创建
if(!file.exists()){//如果文件不存在
file.createNewFile();
System.out.println("创建成功!");
}else {//文件存在
file.delete();
System.out.println("删除成功");
}
//文件目录的创建
//上层目录存在
File file1 = new File("F:\\IO流文件例子\\he\\he1");//要创建he1,其它都存在
boolean mkdir = file1.mkdir();
if (mkdir){
System.out.println("创建成功!");
}
//上层目录不存在
File file2 = new File("F:\\IO流文件例子\\he0\\he1");//此时he0,he1都不存在
boolean mkdirs = file2.mkdirs();
if (mkdirs){
System.out.println("创建成功!");
}
}
}
内存分析
File类总结
- File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)。
- File类声明在java.io包下。
- File类中涉及到关于文件目录的创建,删除,重命名,修改时间,文件大小等方法。并未涉及到写入或读取文件内容的操作,如果需要读取或写入文件内容,必须使用IO流来完成。
- 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的”位置“。
IO流
JAVA IO原理
-
I/O是Input / Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读 / 写文件,网络通讯等。
-
Java程序中,对于数据的输入 / 输出操作以”流(stream)“的方式进行。
-
java.io包下提供了各种”流“类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
-
输入input:读取外部数据(磁盘,光盘等存储设备的数据)到程序(内存)中。
-
输出output:将程序(内存)数据输出到磁盘,光盘等存储设备中。
读进来,写出去。
流的分类
- 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
- 按数据流的流向不同分为:输入流,输出流
- 按流的角色的不同分为:节点流,处理流
- Java中的IO流共涉及40多个类,实际上非常规则,都是从下面这4个抽象基类派生的。
- 由这四个类派生出来的子类名称都是以其父类名作为子类后缀。
IO流体系
FileReader数据读入
public class Demo01 {
public static void main(String[] args) {
/*
一:流的分类:
1.操作数据单位:字节流,字符流
2.数据的流向:输入流,输出流
3.流的角色:节点流,处理流
二:流的体系结构
抽象基类 节点流,(或文件流) 缓冲流(处理流的一种)
InputStream FileInputStream(read(byte[]buffer)) BufferedInputStream(read(byte[]buffer))
OutputStream FileOutputStream(read(byte[]buffer,0,len)) BufferedOutputStream(read(byte[]buffer,0,len))/flush()
Reader FileReader(read(char[]cbuf)) BufferedReader(read(char[]cbuf))/readLine()
Writer FileWriter(writer(char[]cbuf,0,len)) BufferedWriter(char[]cbuf,0,len))/flush()
*/
File file = new File("hello.txt");//(相对路径)相较于当前工程下的路径
System.out.println(file.getAbsolutePath());//E:\java 程序代码\JavaSE\hello.txt
File file1 = new File("Java高级\\hi.txt");
System.out.println(file1.getAbsolutePath());//(加上Module名,即可操作Module下的文件)E:\java 程序代码\JavaSE\Java高级\hi.txt
}
//将Java高级Module下的hello.txt文件内容读入,程序中,并输出到控制台
/*
说明点:
1.read()的理解:返回读入的一个字符(只不过不是char类型的而是int类型的),如果达到文件末尾,返回-1
2.异常的处理:为了保证流资源一定可以执行关闭操作,需要使用try - catch - finally处理
3.读入的文件一定要存在,否则就会报FileNotFoundException。
*/
@Test
public void testFileReader() {
//1.实例化File类对象,获取要操作的文件名。
FileReader fileReader = null;
try {
File file = new File("hi.txt");//(相对路径)相较于当前Module(Java高级)
//2.提供具体的流
fileReader = new FileReader(file);
//3.数据的读入
//read();返回读入的一个字符(只不过不是char类型的而是int类型的),如果达到文件末尾,返回-1
//方式一:
// int read = fileReader.read();
// while (read!=-1){
// System.out.print((char) read);
// read = fileReader.read();
// }
//方式二:语法上针对方式一的修改
int data;
while ((data = fileReader.read())!= -1){
System.out.println((char) data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileReader!=null){
//4.流的关闭操作
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//对read()操作升级:使用read的重载方法
@Test
public void testFileReader1() {
FileReader fr = null;
try {
//1.File类的实例化
File file = new File("hi.txt");
//2.流的实例化
fr = new FileReader(file);
//3.读入的操作
//read(char[] chars):返回每次读入chars数组中的字符的个数,如果达到文件末尾,返回-1
char[] chars = new char[5];
int len;
while ((len = fr.read(chars))!= -1){
//方式一:
//错误的写法,不要读数组的长度
// for (char c : chars) {
// System.out.print(c);
// }
//正确写法:
// for(int i = 0;i<len;i++){
// System.out.print(chars[i]);//hiworld
// }
//方式二:
//错误的写法,对应方试一错误的写法
// String str = new String(chars);
// System.out.println(str);
//正确的写法:
String str = new String(chars,0,len);
System.out.print(str);//hiworld
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr!=null){
//4.资源的关闭
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
FileWriter数据写出
@Test
public void testFileWriter(){
/*
从内存中写出数据到硬盘的文件里。
说明:
1.输出操作,对应的File可以不存在的,并不会报异常
2.
File对应的硬盘中的文件,如果不存在,在输出的过程中,会自动创建此文件
File对应的硬盘中的文件,如果存在,
如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的一个覆盖。
如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖。而是在原有文件基础上追加内容
*/
FileWriter fw = null;
try {
//1.提供File类对象,指明写出到的文件
File file = new File("hello.txt");//一开始这个文件不存在。执行代码后就自动创建了
//2.提供FileWriter的对象,用于数据的写出
fw = new FileWriter(file);
//3.写出的操作
fw.write("I hava a dream!\n");
fw.write("you must hava a dream!");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw!=null){
//4.流资源的关闭
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
FileReader读进来,FileWriter写出去
public class Demo03 {
public static void main(String[] args){
FileReader fr = null;
FileWriter fw = null;
try {
//1.创建File类的对象,指明读入和写出的文件
File srcfile = new File("hello.txt");
File destfile = new File("hello2.txt");
//2.创建输入流的输出流的对象
fr = new FileReader(srcfile);
fw = new FileWriter(destfile);
//3.数据的读入和写出操作
char[] chars = new char[5];
int len;//记录每次读入到chars数组中的字符的个数
while ((len = fr.read(chars))!=-1){
//每次写出len个字符
fw.write(chars,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流资源
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw!=null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
结论
- 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
- 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt…),使用字节流处理
FileInputStream和FileOutputStream
- 实现对图片的复制
@Test
public void testFileInputOutputStream() {
/*
实现对图片的复制操作
*/
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File file = new File("2021-07-17_104603.jpg");
File file1 = new File("复制后的图片.jpg");
fis = new FileInputStream(file);
fos = new FileOutputStream(file1);
//操作
byte[] by = new byte[5];
int len;
while ( (len = fis.read(by))!=-1){
fos.write(by,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流
if (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 指定路径下文件的复制
//指定路径下文件的复制
public static void copFile(String srcPath,String destPath){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
File file = new File(srcPath);
File file1 = new File(destPath);
fis = new FileInputStream(file);
fos = new FileOutputStream(file1);
//复制过程操作
byte[] by = new byte[1024];
int len;
while ( (len = fis.read(by))!=-1){
fos.write(by,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流
if (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
缓冲流
-
BufferedInputStream
-
BufferedOutputStream
-
BufferedReader
-
BufferedWriter
-
作用:提供流的读取,写入速度。
- 提高读写速度的原因:内部提供了一个缓冲区
-
处理流,就是“套接”在已有的流的基础上。
缓冲流(字节流)的使用
- 缓冲流(字节流)实现非文本文件的复制
//实现非文本文件的复制
@Test
public void BufferedStreamTest() {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
//1.造文件
File file = new File("2021-07-17_104603.jpg");
File file1 = new File("第二次复制.jpg");
//2.造流
//2.1造节点流
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file1);
//2.2造处理流
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//3.复制细节:读取,写入
byte[] by = new byte[5];
int len;
while ((len = bis.read(by))!=-1){
bos.write(by,0,len);
//bos.flush();刷新缓冲区(清空缓冲区),当缓冲区满了之后就会默认调用,显示调用就会直接刷新,
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流
if (bis!=null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos!=null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//4.关闭流
//要求:先关闭外层的流,再关闭内层的流
// bis.close();
// bos.close();
//说明:再关闭外层流的同时,内层流也会自动进行关闭,关于内层流的关闭,我们可以省略。
// fis.close();
// fos.close();
}
缓冲流(字符流)的使用
- 缓冲流(字符流)实现文本文件的复制
public class Demo08 {
//使用BufferedReader和BufferedWriter实现文本文件的复制。
@Test
public void testBufferedReaderBufferedWriter() {
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader(new File("hello.txt")));
bw = new BufferedWriter(new FileWriter(new File("hello01.txt")));
//读写操作
//方式一:使用char[]数组
// char[] ch =new char[1024];
// int len;
// while ((len = br.read(ch))!=-1){
// bw.write(ch,0,len);
// }
//方式二:使用String
String data;
while ((data = br.readLine())!=null){//一次读一行
//方法一:
// bw.write(data +"\n");//data中不包含换行符
//方法二:
bw.write(data);
bw.newLine();//提供换行操作
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bw!=null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}