前言:做Web开发,用户能上传头像,文件等等,需要用到文件操作。
一、File类
1.File类作用是什么:JAVA除了8个基本数据类型都是对象。对象都有自己的类,类是对某一类东西的概述。比如persion类,它的属性有name,age,sex等。同理,File类就是对文件的描述(文件包括目录)。File类里面有方法。注意:File类是对文件的概叙,没包括里面的数据,所以我们只能对文件增删改查,对里面的数据File类无法操作。
(1)创建文件
注意:里面用到了junit,junit相当于不用main方法,就能运行方法,如果使用junit,得导入org.junit.test包
@Test
public void createFile() throws IOException {
File f = new File("D:\\java.txt");
f.createNewFile();
}
(2)创建目录
注意:创建目录,目录名一般不需要后缀,如果不删除.txt,会创建出java.txt这个名字得目录
@Test
public void createDirectory() throws IOException {
File f = new File("D:\\java");
f.mkdir();
}
二、字节流
字节流的作用是什么:字节流能对文件里面的数据进行操作。
1.FileInputStream类(读取文件类容)
注意:文件内容读取是已内存为参照物,内容从硬盘到内存叫Input,而且最后一定要关闭字节流。
@Test
public void read2Java() throws IOException {//该方法为一个一个的读,效率很慢
FileInputStream fs = new FileInputStream("D:\\java.txt");
long len = 0;
while((len = fs.read()) != -1) {
char c = (char) len;
System.out.print(c);
}
fs.close();
}
2.FileOutputStream类(写入文件)
注意:文件内容写入是已内存为参照物,内容从内存到硬盘叫Output,而且最后一定要关闭字节流。
@Test
public void java2File() throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\java.txt");
fos.write("123".getBytes());
fos.close();
}
3.BufferedInputStream(读取文件)
注意:文件内容读取是已内存为参照物,内容从硬盘到内存叫Input,而且最后一定要关闭字节流,关的顺序是后创建的先关闭,类似穿衣服,先穿的衣服,脱得时候最后脱。
@Test
public void File2Java() throws IOException {
FileInputStream fis = new FileInputStream("D:\\java.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] b = new byte[1024];
while(bis.read(b) != -1) {
System.out.println(new String(b));
}
bis.close();
fis.close();
}
4.BufferedOutputStream(写入文件)
注意:文件内容写入是已内存为参照物,内容从硬盘到内存叫Output,而且最后一定要关闭字节流,关的顺序是后创建的先关闭,类似穿衣服,先穿的衣服,脱得时候最后脱。
@Test
public void java2File() throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\java.txt");
BufferedOutputStream bop = new BufferedOutputStream(fos);
bop.write("123".getBytes());
bop.close();
fos.close();
}
5.带Buffered和不带Buffered有什么区别
带Buffered的是缓冲字节输入流或者是缓冲字节输出流,它的效率比不带Buffered的效率快很多。
6.序列化和对象流
注意:想要对象写入文本,,该对象必须实现Serializable接口,改接口为空接口,叫做标志性接口。而且最后一定要关闭字节流,关的顺序是后创建的先关闭,类似穿衣服,先穿的衣服,脱得时候最后脱。
每个实现Serializable接口的类都有唯一编号,编号由属性名+时间戳计算得来。
6.1对象写入文本
@Test
public void obj2File() throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\java.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Map<String, String> m = new HashMap<String, String>();
m.put("1", "a");
m.put("2", "b");
oos.writeObject(m);
oos.close();
fos.close();
}
6.2读入文本里存的对象
注意:文件内容写入是已内存为参照物,内容从硬盘到内存叫Output,而且最后一定要关闭字节流,关的顺序是后创建的先关闭,类似穿衣服,先穿的衣服,脱得时候最后脱。
@Test
public void obj2File() throws Exception {
FileInputStream fos = new FileInputStream("D:\\java.txt");
ObjectInputStream oos = new ObjectInputStream(fos);
Map<String, String> m = new HashMap<String, String>();
m = (Map<String, String>) oos.readObject();
System.out.println(m);
oos.close();
fos.close();
}
三、字符流
字符流有什么作用:字符流是操所文本数据的。
1.FileReader(读取文件内容)
注意:文件内容读取是已内存为参照物,内容从硬盘到内存叫Read,而且最后一定要关闭字节流。
@Test
public void file2Java() throws Exception {
FileReader fr = new FileReader("D:\\java.txt");
int len = 0;
while((len = fr.read()) != -1) {//一个字符一个字符的读
System.out.print((char)len);
}
fr.close();
}
2.FileWriter (写入文件)
注意:文件内容写入是已内存为参照物,内容从内存到硬盘叫Write,而且最后一定要关闭字节流。
@Test
public void java2File() throws Exception {
FileWriter fw = new FileWriter("D:\\java.txt");
fw.write("abc");
fw.close();
}
3.BufferedReader(读取内容文件)
注意:文件内容读取是已内存为参照物,内容从硬盘到内存叫Read,而且最后一定要关闭字节流,关的顺序是后创建的先关闭,类似穿衣服,先穿的衣服,脱得时候最后脱。
@Test
public void java2File() throws Exception {
FileReader fw = new FileReader("D:\\java.txt");
BufferedReader br = new BufferedReader(fw);
String str = null;
while((str = br.readLine())!= null){
System.out.println(str);
}
br.close();
fw.close();
}
4.BufferedWriter(写入文件)
注意:文件内容写入是已内存为参照物,内容从硬盘到内存叫Writer,而且最后一定要关闭字节流,关的顺序是后创建的先关闭,类似穿衣服,先穿的衣服,脱得时候最后脱。
@Test
public void java2File() throws Exception {
FileWriter fw = new FileWriter("D:\\java.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("中国");
bw.close();
fw.close();
}
四、字节流和字符流的区别
1.字节流对于所有格式文件都能操错,而字符流只能操作文本,不然会出现奇怪的东西。
五、文件操作的面试题
1.什么是序列化?怎么才能序列化?
序列化是对象转换成字节。要序列化得实现Serializable接口
2.字节流和字符流得区别
答案在第四板块。