Java的IO体系

本文详细介绍了Java中的IO流概念及分类,包括字节流和字符流,并通过实例演示了如何使用File类进行文件操作,以及如何利用不同类型的IO流复制文本和非文本文件。

Java中设计文件内容的,就需要使用IO完成。

IO流分为字节流和字符流,整个IO体系的分类如下图所示:

操作文本文件使用字节流或者字符流都行,操作非文本文件(图片,视频,音频)必须使用字节流。

在谈及IO流之前,需要讨论一下File这个类

/*
 * java.io.File类
 * 1.凡是与输入、输出相关的类、接口等都定义在java.io包下
 * 2.File是一个类,可以有构造器创建其对象。此对象对应着一个文件(.txt .avi .doc .ppt .mp3 .jpg)或文件目录
 * 3.File类对象是与平台无关的。
 * 4.File中的方法,仅涉及到如何创建、删除、重命名等等。只要涉及文件内容的,File是无能为力的,必须由io流来完成。
 * 5.File类的对象常作为io流的具体类的构造器的形参。

 */

/*
* 路径:
* 绝对路径:包括盘符在内的完整的文件路径
* 相对路径:在当前文件目录下的文件的路径
*     File 类下的一些方法
*     getName()       获取该文件名
        getPath()        获取该文件的完整路径名
getAbsoluteFile()    获取该文件的完整路径名
getAbsolutePath()   获取该文件的完整路径名
getParent()       获取该文件的父文件完整路径名
renameTo(File newName)   重命名文件

*/

举个栗子:

File file1 = new File("d:/io/helloworld.txt");
File file2 = new File("hello1.txt");
		
File file3 = new File("d:\\io\\io1");
File file4 = new File("d:\\io2");
		
System.out.println(file1.getName());
System.out.println(file1.getPath());
System.out.println(file1.getAbsoluteFile());
System.out.println(file1.getParent());
System.out.println(file1.getAbsolutePath());

System.out.println();
		
System.out.println(file3.getName());
System.out.println(file3.getPath());
System.out.println(file3.getAbsoluteFile());
System.out.println(file3.getParent());
System.out.println(file3.getAbsolutePath());
		
//renameTo(File newName):重命名
//file1.renameTo(file2):file1重命名为file2.要求:file1文件一定存在,file2一定不存在
boolean b = file1.renameTo(file2);
System.out.println(b);
		
boolean b1 = file4.renameTo(file3);
System.out.println(b1);
运行结果:
helloworld.txt
d:\io\helloworld.txt
d:\io\helloworld.txt
d:\io
d:\io\helloworld.txt

io1
d:\io\io1
d:\io\io1
d:\io
d:\io\io1
false
false
/*
*  exists()  判断该文件或者目录是否存在
    canWrite()  判断应用程序是否可以修改此抽象路径名表示的文件
    canRead()  判断应用程序是否可以读取此抽象路径名表示的文件
    isFile()      测试此抽象路径名表示的文件是否是一个标准文件
    isDirectory() 判断是否是目录
    lastModified()  返回最后一次修改时间
    length()   返回该文件长度

 */

举个栗子:

File file1 = new File("d:/io/helloworld.txt");
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());
运行结果(由于文件不存在,得如下结果):
false
false
false
false
false
Thu Jan 01 08:00:00 CST 1970
0
/*
*  createNewFile()创建新文件
    delete() 删除文件  当且仅当成功删除文件或目录时,返回 true;否则返回 false
    mkDir():创建一个文件目录。只有在上层文件目录存在的情况下,才能返回true
            mkDirs():创建一个文件目录。若上层文件目录不存在,一并创建

*/

举个栗子:

File file1 = new File("d:/io/helloworld.txt");
System.out.println(file1.delete());
		
if(!file1.exists()){
	boolean b = file1.createNewFile();
	System.out.println(b);
}
		
File file2 = new File("d:\\io1\\io2");
if(!file2.exists()){
	boolean b = file2.mkdirs();
	System.out.println(b);
}
运行结果:
false
true
true

说完 IO 体系的 File 类 ,我们正式开始讨论 IO:

抽象基类 节点流(文件流)                      缓冲流(处理流的一种,可以提升文件操作的效率)
InputStream FileInputStream BufferedInputStream
OutputStream FileOutputStream         BufferedOutputStream  (flush())
Reader FileReader BufferedReader  (readLine())
Writer FileWriter         BufferedWriter  (flush())

使用字符流和字节流对文本文件进行复制:

将 ok.txt 的内容复制到一个名为 出师表.txt (该文件自动创建)的文件中

private static void testCopyFile() {
		
		long beginString = System.currentTimeMillis();
		FileReader fileReader = null;
		FileWriter fileWriter = null;
		
		File file1 = new File("ok.txt");
		File file2 = new File("出师表.txt");
		
		try {
			fileReader = new FileReader(file1);
			fileWriter = new FileWriter(file2);
			char[] bytes = new char[1024];
			int len;
			while ((len = fileReader.read(bytes))!=-1) {
				fileWriter.write(bytes);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if (fileWriter != null) {
				try {
					fileWriter.close();
				} catch (IOException e) {
				}
			}
			if (fileReader != null) {
				try {
					fileReader.close();
				} catch (IOException e) {
				}
			}
		}
		
		long endString = System.currentTimeMillis();
		System.out.println("耗时:"+(endString - beginString));
	}

运行结果:

耗时:2

使用字符流复制文件时使用了 FileReader 和 FileWriter 来读写文件,通过创建一个 固定大小的 char[] 来装载

使用字符流和字节流对非文本文件(图片,音频,视频)进行复制:

private static void testCopyPhoto() {
		
		long beginString = System.currentTimeMillis();
		
		BufferedOutputStream bos = null;
		BufferedInputStream bis = null;
		File file1 = new File("1.jpg");
		File file2 = new File("3.jpg");
		
		/** 
		 * 文本文件不仅可以使用字符流处理,还可以使用字节流处理,
		 * 但是图片,视频,音频只能使用字节流处理
		 **/
//		File file1 = new File("ok.txt");
//		File file2 = new File("出师表2.txt");

		try {
			FileInputStream fis = new FileInputStream(file1);
			FileOutputStream fos = new FileOutputStream(file2);
			
			bos = new BufferedOutputStream(fos);
			bis = new BufferedInputStream(fis);
			
			byte[] bytes = new byte[1024];
			int len;
			while ((len = bis.read(bytes)) != -1) {
				bos.write(bytes);
				bos.flush();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (bis != null) {
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		long endString = System.currentTimeMillis();
		System.out.println("耗时:"+(endString - beginString));
	}

运行结果:

耗时:69

使用字符流复制文件时使用了缓冲流,BufferedInputStream 和 BufferedOutputStream能提高文件传输的速度。

未完待续.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值