检验指定路径下是否存在指定的目录或者文件.
// 检验指定路径下是否存在指定的目录或者文件.
File file = new File("c:\\a.txt");
System.out.println(file.exists());
// File对象是否是目录
System.out.println(file.isDirectory());
// 对象是否是文件
System.out.println(file.isFile());
结论:File对象也可以表示不存在的文件。其实代表了一个抽象路径
构建一个File类的实例并不会在机器上创建一个文件.不管文件是否存在都可以创建任意文件名的File实例,可以调用File实例的exists方法判断文件或目录是否存在
构造一个File类实例:
new File(String pathname);
//通过将给定路径来创建一个新File实例。
new File(String parent, String child);
//根据parent路径名字符串和child路径名创建一个新File实例。
parent是指上级目录的路径,完整的路径为parent+child.
new File(File parent, String child);
//根据parent抽象路径名和child路径名创建一个新File实例。
parent是指上级目录的路径,完整的路径为parent.getPath()+child.
说明:
如果指定的路径不存在(没有这个文件或是文件夹),不会抛异常,这时file.exists()返回false。
注意:
- 创建File对象需要导包, import java.io.File
- File对象没有无参数构造.创建对象需要传参.
路径分隔符
- 上下级文件夹之间使用分隔符分开:
在Windows中分隔符为'',在Unix/Linux中分隔符为'/'。 - 跨平台的目录分隔符
更专业的做法是使用File.separatorChar,这个值就会根据系统得到的相应的分割符。
例:
new File("c:" + File.separatorChar + "a.txt");
注意,如果是使用"",则需要进行转义,写为"\"才可以,如果是两个"",则写为"\\"。
绝对路径与相对路径
对于UNIX平台,绝对路径名的前缀是"/"。相对路径名没有前缀。
对于Windows平台,绝对路径名的前缀由驱动器号和一个":"组成,例"c:\..."。相对路径没有盘符前缀。
相对路径:
相对路径是指相对于某位置的路径,是指相对于当前目录。
在执行Java程序时,相对路径为执行java命令时当前所在的目录。
创建
createNewFile()
在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false
mkdir()
在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。
mkdirs()
在指定位置创建目录,这会创建路径中所有不存在的目录
renameTo(File dest)
重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切,剪切时候不能操作非空的文件夹。移动/重命名成功则返回true,失败则返回false。
删除
delete()
删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false。
deleteOnExit()
在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除
输出结果:
文件a.txt存在么?false
目录a存在么?true
判断
exists()
文件或文件夹是否存在。
isFile()
是否是一个文件,如果不存在,则始终为false。
isDirectory()
是否是一个目录,如果不存在,则始终为false。
isHidden()
是否是一个隐藏的文件或是否是隐藏的目录。
isAbsolute()
测试此抽象路径名是否为绝对路径名。
输出结果:
文件是否存在true
是否是文件:true
是否是目录:true
是否是隐藏文件false
是否为绝对路径true
获取
getName()
获取文件或文件夹的名称,不包含上级路径。
getPath()
返回绝对路径,可以是相对路径,但是目录要指定
getAbsolutePath()
获取文件的绝对路径,与文件是否存在没关系
length()
获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。
getParent()
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null
lastModified()
获取最后一次被修改的时间。
输出结果:
file的文件名:d.txt
dir的路径:F:\a
dir的绝对路径:F:\a
file的父目录:F:\
file的大小:0
file最后一次修改的时间:
2015年10月13日 15时18分09秒
文件夹相关:
staic File[] listRoots()
列出所有的根目录(Window中就是所有系统的盘符)
list()
返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。
list(FilenameFilter filter)
返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
listFiles()
返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。
listFiles(FilenameFilter filter)
返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。
输入流
输入字节流体系:
----| InputStream 输入字节流的基类。 抽象
----------| FileInputStream 读取文件数据的输入字节流
----------| BufferedInputStream 缓冲输入字节流 缓冲输入字节流的出现主要是为了提高读取文件数据的效率。
其实该类内部只不过是维护了一个8kb的字节数组而已。
注意: 凡是缓冲流都不具备读写文件的能力。
- 使用FileInputStream读取文件数据的步骤:
- 找到目标文件
- 建立数据的输入通道。
- 读取文件中的数据。
- 关闭 资源.
输出字节流
--------| OutputStream 所有输出字节流的基类 抽象类
------------| FileOutputStream 向文件 输出数据 的输出字节流
------------| Bufferedoutputstream 缓冲输出字节流
BufferedOutputStream出现的目的是为了提高写数据的效率。
内部也是维护了一个8kb的字节数组而已。
-
FileOutputStream如何使用呢?
- 找到目标文件
- 建立数据的输出通道。
- 把数据转换成字节数组写出。
- 关闭资源
-
FileOutputStream要注意的细节:
- 使用FileOutputStream 的时候,如果目标文件不存在,那么会自动创建目标文件对象。
- 使用FileOutputStream写数据的时候,如果目标文件已经存在,那么会先清空目标文件中的数据,然后再写入数据。
3.使用FileOutputStream写数据的时候, 如果目标文件已经存在,需要在原来数据基础上追加数据的时候应该使用new FileOutputStream(file,true)构造函数,第二参数为true。
4.使用FileOutputStream的write方法写数据的时候,虽然接收的是一个int类型的数据,但是真正写出的只是一个字节的数据,只是把低八位的二进制数据写出,其他二十四位数据全部丢弃。
00000000-000000000-00000001-11111111 511
11111111---> -1
使用BufferedInputStream的步骤 :
- 找到目标文件。
- 建立数据 的输入通道
- 建立缓冲 输入字节流流
- 关闭资源
使用BufferedOutputStream的步骤:
- 找到目标文件
- 建立数据的输出通道
- 建立缓冲 输出字节流
- 关闭资源
BufferedOutputStream 要注意的细节
- 使用BufferedOutStream写数据的时候,它的write方法是是先把数据写到它内部维护的字节数组中。
- 使用BufferedOutStream写数据的时候,它的write方法是是先把数据写到它内部维护的字节数组中,如果需要把数据真正的写到硬盘上面,需要调用flush方法或者是close方法、 或者是内部维护的字节数组已经填满数据的时候。
//复制图片
package com.cyl.file;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferDemo {
public static void main(String[] args) {
demo();
}
public static void demo() {
File file = new File("F:\\图片\\欧美\\abc.jpg");
File file2 = new File("F:\\b.jpg");
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
fileInputStream = new FileInputStream(file);
fileOutputStream = new FileOutputStream(file2);
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int len = 0;
while((len = bufferedInputStream.read()) != -1) {
bufferedOutputStream.write(len);
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
try {
if(fileOutputStream != null) {
bufferedOutputStream.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
if(fileInputStream != null) {
bufferedInputStream.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
输入字符流:
-------| Reader 所有输入字符流的基类。 抽象类
----------| FileReader 读取文件字符串的输入字符流。
----------| BufferedReader 缓冲输入字符流 。 缓冲 输入字符流出现的目的是为了提高读取文件 的效率和拓展了FileReader的功能。 其实该类内部也是维护了一个字符数组
记住:缓冲流都不具备读写文件的能力。
FileReader的用法:
- 找到目标文件
- 建立数据的输入通道
- 读取数据
- 关闭资源
BufferedReader的使用步骤:
1.找到目标文件
2 .建立数据的输入通道。
输出字符流
----------| Writer 所有输出字符流的基类, 抽象类。
--------------- | FileWriter 向文件输出字符数据的输出字符流。
----------------| BufferedWriter 缓冲输出字符流
缓冲输出字符流作用: 提高FileWriter的写数据效率与拓展FileWriter的功能。
BufferedWriter内部只不过是提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWriter的功能。
FileWriter的使用步骤:
- 找到目标文件。
- 建立数据输出通道
- 写出数据。
- 关闭资源
FileWriter要注意的事项:
- 使用FileWriter写数据的时候,FileWriter内部是维护了一个1024个字符数组的,写数据的时候会先写入到它内部维护的字符数组中,如果需要把数据真正写到硬盘上,需要调用flush或者是close方法或者是填满了内部的字符数组。
- 使用FileWriter的时候,如果目标文件不存在,那么会自动创建目标文件。
- 使用FileWriter的时候, 如果目标文件已经存在了,那么默认情况会先情况文件中的数据,然后再写入数据 , 如果需要在原来的基础上追加数据,
需要使用“new FileWriter(File , boolean)”的构造方法,第二参数为true。
BufferedWriter如何使用?
- 找到目标文件
- 建立数据的输出通道