Java中的文件操作还有点小复杂···
在讲Java中的文件操作前,先了解一个概念——“流”,比如我们把一个杯子的水倒到另一个同样大小的杯子,就是以流的方式处理的(如果你把水冻成冰了再整个放进去就当我没说吧 - -)。
其实我的理解很简单,“流”就是一串数据,至于这一串数据中每个数据单元有多大,Java中提供了两种处理方法:字节流和字符流。
无论是字节流还是字符流,根据处理方式又可以分为输入流和输出流。这一篇,我们就来简单学学字节流和字符流的输入和输出。
一、字节流
字节都知道吧?
什么?不知道!!!好吧,不知道就不知道吧,那就简单说说,计算机保存数据的最小单位是bit(位),这是一个二进制单位,它的值只有0和1。
一个字节就是一个Byte(注意这是大B,那个是小b),一个字节占8bit的大小。像现在的操作系统有什么32位啊64位啊,主要就是处理数据的时候有区别,32位的每次处理的最小单位是4个字节,而64的是8个字节。具体还有很多区别之处,这儿我们就没必要细说了。如果感兴趣的话,那就百度走起!!!
其实文件操作很简单,跟赵本山小品中把大象放进冰箱的步骤是一样一样滴。
第一步:打开冰箱门
第二步:把大象放进去(或者拿出来)
第三步:关闭冰箱
因为无论读文件还是写文件的步骤都一样,只不过使用的类不一样,所以我们直接来看看如何复制文件吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
/**
* 字节流方式复制文件(任何文件都可以复制)
* @param oldFile 被复制文件
* @param newFile 复制后的文件
*/
public
static
void
copyFile(String oldFile, String newFile){
File srcFile =
new
File(oldFile);
//源文件对象
File destFile =
new
File(newFile);
//目标文件对象
try
{
if
(!(destFile.exists())) {
//判断目标文件是否存在
destFile.createNewFile();
//如果不存在则创建新文件
}
//使用源文件对象创建文件输入流对象
FileInputStream fis =
new
FileInputStream(srcFile);
//使用目标文件对象创建文件输出流对象
FileOutputStream fos =
new
FileOutputStream(destFile);
byte
[] buf =
new
byte
[
1024
];
//创建字节数组,作为临时缓冲,每次读取的数据量
System.out.println(
"开始复制文件..."
);
while
(fis.read(buf) != -
1
) {
//循环从文件输入流中读取数据,-1表示读完了文件
fos.write(buf);
//写入到文件输出流中
}
System.out.println(
"文件复制成功!"
);
fis.close();
//关闭流
fos.close();
}
catch
(Exception e) {
e.printStackTrace();
}
}
|
里面涉及到的几个对象简单介绍一下吧。
1.File类:既可以表示文件,也可以表示目录。常用的方法如下:
2.FileInputStream类:继承于InputStream类,用于读文件,以字节方式将文件中的数据输入到内存中。
3.FileOutputStream类:继承于OutputStream类,用于写文件,以字节方式将内存中的数据输出到文件中。
注意:因为是以字节的方式读或写,所以在处理的过程中,文件是无法使用的,就和我们在网上下载文件是一样滴道理。
二、字符流
字符流就很好理解了,以字符为最小单位来处理数据,一般用于处理文本类的文件比较方便,很多小说阅读器读取TXT的小说就使用这种方式来处理。
接下来,分别写两个方法以字符流的方式来处理文本文件。
2.1逐行读取文件内容,并显示到控制台
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/**
* 读取文本文件内容
* @param path 文件路径
*/
public
static
void
txtRead(String path){
File file =
new
File(path);
try
{
//通过文件对象创建文件读取流对象
FileReader fr =
new
FileReader(file);
//将文件读取流包装成缓冲读取流
BufferedReader br =
new
BufferedReader(fr);
String str;
//逐行读取数据
while
((str = br.readLine()) !=
null
){
System.out.println(str);
}
br.close();
//关闭流
fr.close();
//关闭流
}
catch
(Exception e) {
e.printStackTrace();
}
}
|
2.2将输入的文本保存到文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/**
* 写入文本文件
* @param path 文件路径
*/
public
static
void
txtWriter(String path){
File file =
new
File(
"test.txt"
);
try
{
//通过文件对象创建文件输出字符流对象
FileWriter fw =
new
FileWriter(file);
//将文件输出字符流包装成缓冲流
BufferedWriter bw =
new
BufferedWriter(fw);
bw.write(
"大家好!"
);
bw.write(
"我正打算放弃Java,"
);
bw.newLine();
//换个新行
bw.write(
"请多多指教。"
);
bw.close();
//关闭流
fw.close();
//关闭流
}
catch
(Exception e) {
e.printStackTrace();
}
}
|
OK,文件的基本操作就介绍这到儿吧,其实实际开发用得更多的一种方式是序列化和反序列化,这个操作的代码比较简单,就不在这儿介绍了,有兴趣的小伙伴自行百度一下吧。