Java中关于文件的操作都是基于File类的,Java中的File类可以表示一个文件或者一个目录。我们可以利用该对象来对文件或者目录进行书属性修改:例如:文件的名称,修改日期的日期等等。
File 类的目的是获取对应路径的对象(文件或文件夹),不能直接对文件进行读写操作,只能修改文件的属性。
Java的文件操作, 主要包含两类操作:
- 文件系统相关的操作, 比如创建文件, 文件改名的操作等
- 文件内容相关的操作
构造方法
构造方法 | 说明 |
---|---|
File(File parent,String child) | 根据File父路径和子路径创建File对象 |
File(String pathname) | 根据文件的绝对路径或者相对路径创建File对象 |
File(String parent,String child) | 根据父路径和子路径创建File对象 |
常用方法
方法名 | 返回值 | 说明 |
---|---|---|
getName() | String | 返回由此抽象路径名表示的文件或目录的名称。 |
getPath() | String | 将此抽象路径名转换为一个路径名字符串。 |
isAbsolute() | boolean | 测试此抽象路径名是否为绝对路径名。 |
getAbsolutePath() | String | 返回抽象路径名的绝对路径名字符串。 |
exists() | boolean | 测试此抽象路径名表示的文件或目录是否存在。 |
isDirectory() | boolean | 测试此抽象路径名表示的文件是否是一个目录。 |
isFile() | boolean | 测试此抽象路径名表示的文件是否是一个标准文件。 |
lastModified() | long | 返回此抽象路径名表示的文件最后一次被修改的时间。 |
delete() | boolean | 删除此抽象路径名表示的文件或目录。 |
length() | long | 返回由此抽象路径名表示的文件的长度。 |
list() | String[ ] | 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。 |
listFiles() | File[ ] | 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。 |
mkdir() | boolean | 创建此抽象路径名指定的目录。 |
mkdirs() | boolean | 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。 |
renameTo() | boolean | 重新命名此抽象路径名表示的文件。 |
示例:
public class Demo1_file {
public static void main(String[] args) {
String parent = "D:\\desktop\\Code\\java_code\\java_test\\src\\com\\File";
String child = "test2.txt";
//通过父目录加子目录的形式创建File对象
File f = new File(parent,child);
System.out.println(f.getName());
System.out.println(f.getPath());
System.out.println(f.isAbsolute());
System.out.println(f.getAbsolutePath());
System.out.println(f.isDirectory());
System.out.println(f.exists());
System.out.println(f.isFile());
System.out.println(f.lastModified());
System.out.println(f.length());
System.out.println(f.list());
System.out.println(f.listFiles());
System.out.println(f.delete());
}
}
文件判断功能
/*
* 文件判断功能:
* isDirectory()判断是否是文件夹
* isFile()判断是否是文件
* exists()判断是否存在
* canRead()判断是否可读
* canWrite()判断是否可写
* isHidden()判断是否隐藏
* */
public class Demo3_FileMethod {
public static void main(String[] args) {
File file = new File("D:\\desktop\\Code\\java_code\\java_test\\src\\com\\File\\bbb");
file.setReadable(false);//设置是否可读
file.setWritable(false);//设置是否可写
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.exists());
System.out.println(file.canRead());//windows系统认为一切的所有文件是可读的
System.out.println(file.canWrite());//windows系统可以设置为不可写
System.out.println(file.isHidden());
}
}
输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图。
这里说一下available()的作用:用此方法就返回实际文件的大小。
该流用于从文件读取数据,它的对象可以用关键字 new 来创建。
示例:
public class Demo1_IO {
public static void main(String[] args) throws IOException {
//读取文件
FileInputStream fis = new FileInputStream("D:\\desktop\\Code\\java_code\\java_test\\src\\com\\IOSteam\\file\\a.txt");
while ((fis.read())!=-1){//结束标记为-1
System.out.println(fis.read());//读取一个字节
}
fis.close();
}
}
该类用来创建一个文件并向文件中写数据。
示例:
public class Demo1_IO {
public static void main(String[] args) throws IOException {
//写入数据,没有文件会自动创建文件,创建输出流对象,true代表追加
FileOutputStream fos = new FileOutputStream("D:\\desktop\\Code\\java_code\\java_test\\src\\com\\IOSteam\\file\\a.txt",true);
fos.write(97);
fos.close();
}
}
ascii的97就代表字母a
接下来让我们实际应用一下这两个类
实现文件copy操作
下面我们有三种文件copy的方法
public class Demo2_Copy {
public static void main(String[] args) throws IOException {
test1();
}
//第一种copy
public static void test1() throws IOException{
FileInputStream fis = new FileInputStream("src/com/IOSteam/file/4.jpg");
FileOutputStream fos = new FileOutputStream("src/com/IOSteam/file/5.jpg");
int b;
while ((b = fis.read())!=-1){
fos.write(b);
}
fis.close();
fos.close();
}
//第二种copy
public static void test2() throws IOException{
//第二种copy,不推荐使用,因为有可能导致内存溢出
FileInputStream fis = new FileInputStream("src/com/IOSteam/file/4.jpg");
FileOutputStream fos = new FileOutputStream("src/com/IOSteam/file/5.jpg");
System.out.println(fis.available());
byte[] arr =new byte[fis.available()];//创建和文件一样大小的字节数组
fis.read(arr);//将字节读取到数组中
fos.write(arr);//讲字节数组中的数据写到文件上
fis.close();
fos.close();
}
//第三种拷贝,推荐
public static void test3() throws IOException{
FileInputStream fis = new FileInputStream("src/com/IOSteam/file/4.jpg");
FileOutputStream fos = new FileOutputStream("src/com/IOSteam/file/5.jpg");
byte[] arr = new byte[1024];//一般是1024的整数倍
// int a = fis.read(arr);//将数据读取到字节数组中
int len;
while ((len = fis.read(arr))!=-1){
fos.write(arr,0,len);//0代表数组中的起始位置,len代表读取几个字节
}
fos.close();
fis.close();
}
}
BufferedInputStream 是缓冲输入流。它继承于FilterInputStream。
BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供“缓冲功能”以及支持“mark()标记”和“reset()重置方法”。BufferedInputStream 本质上是通过一个内部缓冲区数组实现的。例如,在新建某输入流对应的BufferedInputStream后,当我们通过read()读取输入流的数据时,BufferedInputStream会将该输入流的数据分批的填入到缓冲区中。每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。
BufferedOutputStream是字节流,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统
/*
* BufferedInputStream和 BufferedOutputStream
* 创建缓冲区对象,让其变得更加强大
* close方法具有刷新的功能,在关闭流之前,会刷新一次缓冲区,将缓冲区的字节全部刷新到文件上,然后再关闭
* flush刷新之后还可以写
* */
public class Demo3_BufferCopy {
public static void main(String[] args) throws IOException {
//flush和close的区别
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("src/com/IOSteam/file/a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("src/com/IOSteam/file/b.txt"));
int b;
while ((b=bis.read())!=-1){
bos.write(b);
}
//bos.close();
bos.flush();
bis.close();
}
public static void test1() throws IOException{
FileInputStream fis = new FileInputStream("src/com/IOSteam/file/a.txt");
FileOutputStream fos = new FileOutputStream("src/com/IOSteam/file/b.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int b;
while ((b=bis.read())!=-1){
bos.write(b);
}
//直将包装后的关闭就可以
bis.close();
bos.close();
}
}
以下出自:https://blog.csdn.net/m0_66971047/article/details/124922340
BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能,FileInputStream是读取一个文件来作InputStream。
BufferedInputStream比FileInputStream多了一个缓冲区,执行read时先从缓冲区读取,当缓冲区数据读完时再把缓冲区填满。因此,当每次读取的数据量很小时,FileInputStream每次都是从硬盘读入,而BufferedInputStream大部分是从缓冲区读入。读取内存速度比读取硬盘速度快得多,因此BufferedInputStream效率高。
FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节),且FileInputStream对象的read方法会出现阻塞;