- 前言
说到文件,想必大家都不陌生,当我们点开我们电脑上面的磁盘的时候,映入眼帘的是许许多多不同名字的文件夹.在这些文件下面有很多各种各样的文件.现在就让我们来谈谈在JAVA中如何对这些文件进行操作的.
- 文件操作
在我们对文件进行操作的时候,首先我们要认识JAVA中的一个类.
它就是File类.File是在java.io包下面的类
![](https://i-blog.csdnimg.cn/blog_migrate/3e58f35ff57530c6e57b369ffd1eca6d.png)
假如我们要删除一个文件的话就可以用File中的delete()方法来删除.代码实现如下:
import java.io.File;
public class TestTwo {
public static void main(String[] args) {
//首先我们要创建一个File类的实例,在括号中写要删除文件的路径.
//这里我们用绝对路径.
File file = new File("e:/dzk/c/d/1.txt");
file.delete();
}
}
代码运行之前:
![](https://i-blog.csdnimg.cn/blog_migrate/47ba2cb297602cdac4d88a2aeafe4b53.png)
代码运行之后:
![](https://i-blog.csdnimg.cn/blog_migrate/82a5582e6e358ae2c6858d0ad60628c6.png)
假如我们要创建一个文件,可以用createNewFile()方法.代码实现如下:
import java.io.File;
import java.io.IOException;
public class TestTwo {
public static void main(String[] args) {
File file = new File("1.txt");
try {
file.createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
代码运行之后:
![](https://i-blog.csdnimg.cn/blog_migrate/e3b1c458fa3f25db27658fe7a30a4ea9.png)
会在左边的任务栏中创建一个你想要创建的文件出来.如果你没有在创建实例的时候指定路径的话,只是一个文件名的话,就会和src在同一级.也就是相对路径.
- 文件IO
IO是英文input(输入) output(输出)的缩写.
IO流操作是针对文件内容,IO流中的流又怎么理解呢?
其实并不难理解,谈到流,大家的第一反映是水流吧?对的!就和水流差不多,比方说:你口渴要放饮水机里的水喝,你非常口渴的时候一次喝一杯水,不怎么口渴的时候一次就喝半杯水,若干天之后,直到把饮水机里的水喝完.
反例:你从羽毛球筒中将羽毛球拿出来,你每一次只能拿一羽毛球出来.这种的就不是流.
综上所述:判断是否为流,要抓住一点,操作过程是一样的.
知道了什么是流了之后,我们回到主线.在Java中根据类型来分可分为两大类,字节流的字符流.
![](https://i-blog.csdnimg.cn/blog_migrate/59b30ee27f80f06cb17bcfd87c48818e.png)
到了这里又有一个问题.input不是输入的意思吗?不是写到电脑里吗?为什么FileInputStream(InputStream的子类)类中没有关于写的方法?
判读是否为输入流还是输出流是根据你是靠近CPU还是远离CPU来确定的.
![](https://i-blog.csdnimg.cn/blog_migrate/75404386572c757e43b23ce6cd26fd7e.png)
由图可知,不难发现读操作是靠近CPU的,而写操作是远离CPU的,这个问题就迎刃而解了.
InputStream
read()
![](https://i-blog.csdnimg.cn/blog_migrate/9583a81cb90c3b7fef8bf0016f079d16.png)
第一个版本的read没有第二个版本的read效率高.将字节数组的数组名为buffer并非是空穴来风,是有特殊含义的.
buffer代表的意思是缓存区.
那又如何理解这个缓存区呢?例如:你在工地搬砖,包工头要求你将一堆转搬到指定的位置,你可能用你的手将这些砖搬到指定的位置,还有就是用一辆手推式二轮车先把砖将车装满,然后一起将这些砖运到指定的位置.
上述的两种方法,肯定是第二种方法.(除去意外情况,如车爆胎啊,车子翻了呀,等等).
缓存区存放的就是要做的工作,以提升效率.
close()
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Test {
public static void main(String[] args) throws IOException {
InputStream input = new FileInputStream("1.txt");
while(true){
int a = input.read();
if(a == -1){
break;
}
System.out.println(a);
}
input.close();
}
}
当我们中间进行了一系列文件操作之后,我们要将资源关闭.
这个时候又有人问了,为什么要关闭资源?
请看我娓娓道来.想了解这个问题我们要知道什么是文件描述符表,文件描述表是用来记录线程用了哪些文件资源.
我们写的这些代码大部分都是由主线程来执行,执行一个程序不只有一个线程,还有像垃圾回收机制这样的线程,每个线程共用一个文件描述符表,当你的程序一直在进行IO操作,就会不断的占用文件描述符表的空间,而文件描述符表的大小是有限的,文件描述符表满了之后,文件就无法打开了.
close()方法会释放文件描述符表的资源,但是一定要释放资源吗?答:不一定.
当你的程序执行一次就完了,线程就销毁了,线程销毁了之后,Java中的GC(垃圾回收机制)会帮你释放资源的.
综上所述:只要你的程序进行了IO操作,一定要考虑文件描述符表空间满的问题.
OutPutStream
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
try(InputStream input = new FileInputStream("e:/dzk/1.txt");
OutputStream output = new FileOutputStream("1.txt")){
while(true){
int a = input.read();
if(a == -1){
break;
}
output.write(a);
//写操作,是先将内容写到缓冲区中,我们要手动刷新一下缓冲区,将缓冲区的内容写到硬盘中.
output.flush();
}
}
}
}
可以边读文件然后将读到的文件写到对应的文件中.
当你的代码很长很长的时候,中间是要结束方法的时候,close()方法就不一定会执行,为了保证close()方法一定被执行到,可以像上面的代码写到try语句中,自动会执行close()方法.
虽然这个方法好用,但是不是所有的类都能放进去的.
![](https://i-blog.csdnimg.cn/blog_migrate/3cc7274402037e6d9db3ea376e691075.png)
![](https://i-blog.csdnimg.cn/blog_migrate/53e7592ac7fcc5f61b0b5c76177ff1d2.png)
看InputStream和OutputStream的源码可知:它们实现了Closeable这个接口.
要实现了Closeable接口才能用这种方法.
结束语
好啦!以上就是这篇文章的所有内容啦!
如果你觉得文章对你有帮助的话,麻烦你点个赞.文中有地方有错误或者对那块知识有疑惑.
欢迎在评论区留言!!!