java文件流

1.文件操作相关

package com.atguigu.java;

import java.io.File;
import java.io.IOException;
import java.util.Date;

import org.junit.Test;

/*
 * java.io.File类
 * 1.凡是与输入、输出相关的类、接口等都定义在java.io包下
 * 2.File是一个类,可以由构造器创建其对象.此对象对应着一个文件(.txt .avi .doc .jpg .mp3)或文件目录
 * 3.File类对象是与平台无关的。
 * 4.File中的方法,仅涉及到如何创建、删除、重命名等。
 * 只要涉及文件内容的,File是无能为力的,必须有io流来完成。
 * 5.File类的对象常作为io流的具体类的构造器的形参。
 * 
 */
public class TestFile {
	/*
	 * 文件操作相关
		createNewFile()
		delete()
	        目录操作相关
		mkDir():创建一个文件目录。只有在上层文件目录存在的情况下,才能返回true
		mkDirs():创建一个文件目录,若上层文件目录不存在,一并创建
		list()
		listFiles()
	 */
	@Test
	public void test3() throws IOException {
		File file1 = new File("D:/file/helloworld.txt");
		System.out.println(file1.delete());

		if (!file1.exists()) {
			boolean b = file1.createNewFile();
			System.out.println(b);
		}

		File file2 = new File("D:\\file\\file2");
		if (!file2.exists()) {
			boolean b = file2.mkdir();
			System.out.println(b);
		}

		File file3 = new File("D:\\v2_card");
		String[] strs = file3.list();
		for (int i = 0; i < strs.length; i++) {
			System.out.println(strs[i]);
		}

		File[] files = file3.listFiles();
		for (int i = 0; i < files.length; i++) {
			System.out.println(files[i].getName());
		}
	}
	/*
	 * 文件检测
		exists()
		canWrite()
		canRead()
		isFile()
		isDirectory()
	        获取常规文件信息
		lastModified()
		length()
	 */
	/*@Test
	public void test2(){
		File file1 = new File("D:/file/helloworld.txt");
		File file2 = new File("hello.txt");
		File file3 = new File("D:\\file\\file1");
		System.out.println(file1.exists());
		System.out.println(file1.canWrite());
		System.out.println(file1.canRead());
		System.out.println(file1.isFile());
		System.out.println(file1.isDirectory());
		System.out.println(new Date(file1.lastModified()));
		System.out.println(file1.length());
	}*/
	/*
	 * 路径:
	 * 绝对路径:包括盘符在内的完整的文件路径
	 * 相对路径:在当前文件目录下的文件路径
	 * 访问文件名:
		getName()
		getPath()
		getAbsoluteFile()
		getAbsolutePath()
		getParent()
		renameTo(File newName)
	 */
	/*@Test
	public void test1(){
		//File file1 = new File("D:\\file\\helloworld.txt");// "//"多一个/表示转义
		File file1 = new File("D:/file/helloworld.txt");
		File file2 = new File("hello.txt");
		File file3 = new File("D:\\file\\file1");
		File file4 = new File("D:\\file\\file1\\helloworld1.txt");
		System.out.println(file1.getName());
		System.out.println(file1.getPath());
		System.out.println(file1.getAbsoluteFile());
		System.out.println(file1.getAbsolutePath());
		System.out.println(file1.getParent());
		
		System.out.println();
		
		System.out.println(file3.getName());
		System.out.println(file3.getPath());
		System.out.println(file3.getAbsoluteFile());
		System.out.println(file3.getAbsolutePath());
		System.out.println(file3.getParent());
		
		//renameTo(File newName):重命名
		//file1.renameTo(file2):file1重命名为file2,要求:file1必须存在,file2必须不存在
		boolean b = file1.renameTo(file4);
		System.out.println(b);
	}*/
}

2.输入输出流,字节字符流

package com.atguigu.java;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

/*
 * 1.流的分类:
 * 按照数据流向的不同:输入流 输出流
 * 按照处理数据的单位的不同:字节流 字符流(处理的文本文件)
 * 按照角色的不同:节点流(直接作用于文件的) 处理流
 * 2.IO的体系
 * 抽象基类                        节点流(文件流)   			缓冲流(处理流的一种,可以提升文件操作的效率)                
 * InputStream      FileInputStream			BufferedInputStream
 * OutputStream     FileOutputStream		BufferedOutputStream (flush())
 * Reader           FileReader				BufferedReader (readline())
 * Writer           FileWriter				BufferedWriter (flush())
 * 
 */
public class TestFileInputOutputStream {
	
	@Test
	public void testCopyFile() {
		long start = System.currentTimeMillis();
		String src = "C:\\Users\\bo\\Desktop\\1.flv";
		String dest = "C:\\Users\\bo\\Desktop\\2.flv";
		copyFile(src, dest);
		long end = System.currentTimeMillis();
		System.out.println("花费时间:" + (end - start));//花费时间:26835
	}
	
	//实现文件复制的方法
	public void copyFile(String src,String dest){
		// 1.提供读入、写出的文件
		File file1 = new File(src);
		File file2 = new File(dest);
		// 2.提供相应的流
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(file1);
			fos = new FileOutputStream(file2);
			// 3.实现文件的复制
			byte[] b = new byte[1024];//文件大时长度加大
			int len;
			while ((len = fis.read(b)) != -1) {
				// fos.write(b);错误两种写法:fos.write(b,0,b.length);
				fos.write(b, 0, len);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				// 第二种写法
				/*} finally {
					if (fis != null) {
						try {
							fos.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}*/
			}
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//从硬盘读取一个文件,并写入到另一个位置(相当于文件的复制)
	@Test
	public void testFileInputOutputStream() {
		// 1.提供读入、写出的文件
		File file1 = new File("C:\\Users\\bo\\Desktop\\1.gif");
		File file2 = new File("C:\\Users\\bo\\Desktop\\2.gif");
		// 2.提供相应的流
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(file1);
			fos = new FileOutputStream(file2);
			// 3.实现文件的复制
			byte[] b = new byte[20];
			int len;
			while ((len = fis.read(b)) != -1) {
				// fos.write(b);错误两种写法:fos.write(b,0,b.length);
				fos.write(b, 0, len);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				// 第二种写法
				/*} finally {
					if (fis != null) {
						try {
							fos.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}*/
			}
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//FileOutputStream
	@Test
	public void testFileOutputStream() {
		// 1.创建一个File对象,表明要写入的文件位置
		// 输出的物理文件可以不存在,当执行过程中若不存在,会自动的创建。若存在,则覆盖。
		File file = new File("hello2.txt");
		// 2.创建一个FileOutpuStream的对象,将file的对象作为形参传递给FileOutputStream的构造器中
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(file);
			// 3.写入的操作
			fos.write(new String("aaaabbbdddbbdbbfjdkfdk").getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 4.关闭输出流
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	//重点:数组方式、String(b, 0, len)
	@Test
	public void testFileInputStream3() {
		FileInputStream fis = null;
		try {
			File file = new File("hello.txt");
			fis = new FileInputStream(file);
			byte[] b = new byte[5];//读取到的数据要写入的数组。
			int len;//每次读入到byte中的字节的长度
			while ((len = fis.read(b)) != -1) {
//				for (int i = 0; i < len; i++) {
//					System.out.print((char) b[i]);
//				}
				String str = new String(b, 0, len);
				System.out.print(str);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	//使用try-catch的方式处理如下的异常更合理:保证流的关闭操作一定执行
	@Test
	public void testFileInputStream2() {
		// 2.创建一个FileInputStream类的对象
		FileInputStream fis = null;
		try {
			// 1.创建一个File类的对象
			File file = new File("hello.txt");
			fis = new FileInputStream(file);
			// 3.调用FileInputStream的方法,实现file文件的读取
			int b;
			while ((b = fis.read()) != -1) {
				System.out.print((char) b);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fis != null) {
				try {
					// 4.关闭相应的流
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	//从硬盘存在的一个文件中,读取其内容到程序中。使用FileOutputStream
	//要读取的文件一定要存在。否则抛FileNotFountException
	@Test
	public void testFileInputStream1() throws Exception {
		// 1.创建一个File类的对象
		File file = new File("hello.txt");
		// 2.创建一个FileInputStream类的对象
		FileInputStream fis = new FileInputStream(file);
		// 3.调用FileInputStream的方法,实现file文件的读取
		/*
		 * read():读取文件的一个字节。当执行到文件结尾时,返回-1
		 */
		// int b = fis.read();
		// while (b != -1) {
		// System.out.print((char)b);
		// b = fis.read();
		// }
		int b;
		while ((b = fis.read()) != -1) {
			System.out.print((char) b);
		}
		// 4.关闭相应的流
		fis.close();
	}
}

3.filereder,filewriter

package com.atguigu.java;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import org.junit.Test;

/*
 * 使用FileReader、FileWriter可以实现文本文件的复制。
 * 对于非文本文件(视频、音频、图片),只能使用字节流!
 */
public class TestFileReaderWriter {
	//实现文本文件的复制
	@Test
	public void testFileReaderWriter() {
		// 1.输入流对应的src一定要存在,否则抛异常;输出流对应的dest可以不存在
		FileReader fr = null;
		FileWriter fw = null;
		try {
			//不能实现非文本文件的复制
			File src = new File("blog.txt");
			File dest = new File("blog1.txt");
			// 2.
			fr = new FileReader(src);
			fw = new FileWriter(dest);
			char[] c = new char[24];
			int len;
			while ((len = fr.read(c)) != -1) {
				fw.write(c, 0, len);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (fw != null) {
				try {
					fw.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if (fw != null) {
				try {
					fr.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	//输入文本文件内容到控制台
	@Test
	public void testFileReader() {
		FileReader fr = null;
		try {
			File file = new File("blog.txt");
			fr = new FileReader(file);
			char[] c = new char[24];
			int len;
			while ((len = fr.read(c)) != -1) {
				String str = new String(c, 0, len);
				System.out.println(str);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (fr != null) {
				try {
					fr.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值