文档章节

I/O流(一)

centrald
 centrald
发布于 2016/01/29 19:51
字数 1612
阅读 20
收藏 0

IO流

* IO: Input(输入) , Output(输出)

* 注意: 我们说输入和输出问题是站在内存的角度而言

* IO流的分类

** 按照流向进行划分

输入流 , 输出流

** 按照操作数据的类型划分

字节流 , 字符流

字节流

字节输入流 InputStream

字节输出流 OutputStream

字符流

字符输入流 Reader

字符输出流 Writer

关于字符流:

    字符流的出现是为了方便的操作中文,因为我们都知道一个中文是两个字节,那么如果使用字节流进行操作的话,需要将数据进行分割,然后在进行合并比较麻烦.

什么情况下使用哪种流呢?

如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。

如果无法判断的话,就用字节流

* 基本流

FileInputStream

* 构造方法

public FileInputStream(String name )

public FileInputStream(File file)

* 成员方法

public int read() 一次读取一个字节

public int read(byte[] bytes) 一次读取一个字节数组

FileOutputStream 

* 构造方法

public FileOutputStream(String name )

public FileOutputStream(File file)

public FileOutputStream(String name , boolean append)

public FileOutputStream(File file , boolean append)

* 成员方法

public void write(int by) 一次写一个字节

public void write(byte[] bytes) 一次写一个字节数组

public void write(byte[] bytes , int offset , int len) 一次写一个字节数组中的一部分

* 缓冲字节流对象

** 高效的字节输入流对象 BufferedInputStream

* 构造方法: public BufferedInputStream(InputStream in)

** 高效的字节输出流对象 BufferedOutputStream

* 构造方法 public BufferedOutputStream(OutputStream out)


下面写一个简单的I/O流的程序,比较一下四种I/O操作方式的效率

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
 * 编写程序,采用多种方式,把E:\\cc.mp3的内容复制到F:\\cc.mp3中
	方式1:基本字节流一次读写一个字节
	方式2:基本字节流一次读写一个字节数组
	方式3:高效字节流一次读写一个字节
	方式4:高效字节流一次读写一个字节数组
 */
public class InputOutPutDemo {
	public static void main(String[] args) throws IOException{
		
		
		//获取方法运行前时间
		long millis = System.currentTimeMillis();
		
		//运行方法
		//方式1:基本字节流一次读写一个字节
		baseInputOutputFun();
		//使用该I/O流方式消耗的时间为:192830
		
		//方式2:基本字节流一次读写一个字节数组
		//baseInputOutputFun2();
		//使用该I/O流方式消耗的时间为:311
		
		//方式3:高效字节流一次读写一个字节
		//bufferInputOutputFun();
		//使用该I/O流方式消耗的时间为:958
		
		//方式4:高效字节流一次读写一个字节数组
		//bufferInputOutputFun2();
		//使用该I/O流方式消耗的时间为:112
		
		//获取方法运行结束时间
		long millis2 = System.currentTimeMillis();
		
		//获得程序运行时间
		System.out.println("使用该I/O流方式消耗的时间为:"+(millis2-millis));
		
		
	}
	//封装方法:基本字节流,一次读写一个字节数组
	public static void baseInputOutputFun() throws IOException{		
		//创建输入字节流
		FileInputStream fileIn = new FileInputStream("E:\\cc.mp3");
		//创建输出字节流
		FileOutputStream fileOu = new FileOutputStream("F:\\cc.mp3");
				
		int by = 0;
		while((by=fileIn.read())!=-1){
			fileOu.write(by);
		}
		//关闭输出字节流
		fileOu.close();
		//关闭输入字节流
		fileIn.close();
		
	}
	//封装方法:方式2:基本字节流一次读写一个字节数组
	public static void baseInputOutputFun2() throws IOException{
		
		//创建输入字节流
		FileInputStream fileIn = new FileInputStream("E:\\cc.mp3");
		//创建输出字节流
		FileOutputStream fileOu = new FileOutputStream("F:\\cc.mp3");
		//定义字节数组
		byte[] bytes = new byte[1024];
		//定义len,为读取到的实际字节长度
		int len = 0;
		while((len = fileIn.read(bytes))!=-1){
			fileOu.write(bytes, 0, len);
		}
		//关闭输出字节流
		fileOu.close();
		//关闭输入字节流
		fileIn.close();
	}
	//封装方法:方式3:高效字节流一次读写一个字节
	public static void bufferInputOutputFun() throws IOException{
		//创建高效输入流
		BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream("E:\\cc.mp3"));
		//创建高效输出流
		BufferedOutputStream fileOu = new BufferedOutputStream(new FileOutputStream("F:\\cc.mp3"));
		
		//一次读取一个字节复制
		int by = 0;
		
		while((by = fileIn.read())!=-1){
			fileOu.write(by);
		}
		//关闭高效输出流
		fileOu.close();
		//关闭高效输入流
		fileIn.close();
	}
	//封装方法方式4:高效字节流一次读写一个字节数组
	public static void bufferInputOutputFun2() throws IOException{
		//创建高效输入流
		BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream("E:\\cc.mp3"));
		//创建高效输出流
		BufferedOutputStream fileOu = new BufferedOutputStream(new FileOutputStream("F:\\cc.mp3"));
		
		//一次读取一个字节数组
		byte[] by = new byte[1024];
		//定义len为实际读到的长度
		int len = 0;
		while((len = fileIn.read(by))!=-1){
			fileOu.write(by, 0, len);
		}
		//关闭高效输出流
		fileOu.close();
		//关闭高效输入流
		fileIn.close();
	}
}

使用高效流模拟copy文件夹

package cn.test2;
/*
 *需求:模拟copy命令,复制文件夹
 *分析:
 * 		a: 把E:\\code2这个目录封装成一个File对象 , 把F:\\code2这个目录封装成一个File对象
 * 		b: 判断F:\\code2这个目录否存在,如果不存在就创建出来
 * 		c: 获取E:\\code2这个目录中所有的文件对应的File数组
 * 		d: 遍历数组,获取每一个元素,然后判断
 * 			1>File对象为文件夹,则递归(执行b)
 * 			2>File对象为文件,则复制
 * 				(1): 创建目标文件
 * 				(2): 创建高效字节输入流和高效的字节输出流对象
 * 				(3): 频繁的读写操作
 * 				(4): 释放资源
 */
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyFolderTest {
	public static void main(String[] args) throws IOException {
		//将E:\\code2这个文件夹封装为File对象
		File srcFolder = new File("E:\\code2");
		//将F:\\code2这个文件夹封装为File对象
		File destFolder = new File("F:\\code2");
		//复制文件夹
		copyFolder(srcFolder,destFolder);
	}
	//复制文件夹方法
	public static void copyFolder(File srcFolder, File destFolder) throws IOException {
		// TODO Auto-generated method stub
		
				//判断destFolder这个文件夹是否存在
				if(!destFolder.exists()){
					destFolder.mkdirs();
				}
		//获取srcFolder文件夹下的文件对象
		File[] Files = srcFolder.listFiles();
		//遍历
		for(File File:Files){
			//创建目标文件
			String name = File.getName();
			File destFile = new File(destFolder,name);
			//如果File对象为文件对象
			if(File.isFile()){					
				//复制文件
				copyFile(File,destFile);
			}
			//File对象为文件夹对象
			else if(File.isDirectory()){
				//递归调用文件夹复制方法
				copyFolder(File, destFile);
			}
			
			
		}
	}

	public static void copyFile(File file, File destFile) throws IOException {
		// TODO Auto-generated method stub
		//创建高效输入字节流对象
		BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
		//创建高效输出字节流对象
		BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream(destFile));
		byte[] bytes = new byte[1024];
		int len = 0;
		while((len = br.read(bytes))!=-1){
			bw.write(bytes, 0, len);
		}
		bw.close();
		br.close();
	}
}



© 著作权归作者所有

共有 人打赏支持
上一篇: File文件类
下一篇: 集合操作(三)Set
centrald
粉丝 13
博文 112
码字总数 120823
作品 0
杭州
程序员
私信 提问
小博老师解析Java核心技术 ——I/O流

[引言] 我们在学习Java编程的时候,经常会遇到文件数据的各类操作,这类操作一般都会借助于JDK中的I/O流对象。我们知道JDK中I/O流的实现类有很多种类型,那么在实际操作中我们该如何取舍呢?...

博为峰教研组
2016/12/13
7
0
我读过的最好的epoll讲解--转自”知乎“

作者:蓝形参,Geek 伪技术宅 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后...

dclink
2014/07/04
0
16
epoll模型详解

首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过rea...

follitude
2016/06/23
13
0
我读过的最好的epoll讲解--转自”知乎“

首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过rea...

zcx1128
2015/12/12
0
0
epoll 或者 kqueue 的原理是什么?

作者:蓝形参 链接:https://www.zhihu.com/question/20122137/answer/14049112 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 我不了解楼主的层次,我必须从很多基础的概念开始构...

python-yzw
2016/12/19
5
0

没有更多内容

加载失败,请刷新页面

加载更多

给女朋友讲解什么是Optional【JDK 8特性】

前言 只有光头才能变强 前两天带女朋友去图书馆了,随手就给她来了一本《与孩子一起学编程》的书,于是今天就给女朋友讲解一下什么是Optional类。 至于她能不能看懂,那肯定是看不懂的。(学到...

Java3y
9分钟前
0
0
2019年六大新兴信息安全方向

导读 黑客攻击和网络犯罪的威胁正在不断升级,相应的技术“军备竞赛”正愈演愈烈,对于信息安全从业人员来说,掌握最新的信息安全工具,是在信息安全战争中生存下来的关键所在。 从特朗普的手...

问题终结者
16分钟前
0
0
redis扩展-自定义PropertyPlaceholderConfigurer,在spring属性注入之前,手动将properteis合并到spring容器中

背景:spring容器启动过程中,通过PropertyPlaceholderConfigurer读取properties配置文件,并将properties配置文件中的值注入spring bean的属性中, PropertyPlaceholderConfigurer使用方式多...

燃犀
18分钟前
0
0
PostgreSQL SPI 中的错误处理

PostgreSQL SPI 用于在 C 或是其他编程语言编写的扩展函数(存储过程)中调用数据库本身的解析器、规划器和执行器的功能,以及对 SQL 语句进行执行。 在最重要的一个函数 SPI_execute 的文档...

helloclia
19分钟前
0
0
深入理解Java内存模型

1 内存模型产生背景 在介绍Java内存模型之前,我们先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存模型产生的背景。物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物...

小刀爱编程
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部