前言:做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.字节流和字符流得区别

答案在第四板块。