文档章节

I/O流(一)

centrald
 centrald
发布于 2016/01/29 19:51
字数 1612
阅读 20
收藏 0
点赞 1
评论 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();
	}
}



© 著作权归作者所有

共有 人打赏支持
centrald
粉丝 11
博文 70
码字总数 117691
作品 0
杭州
程序员
Java 流io和块io

在 Java 的早期,JVM 在解释字节码时往往很少或没有运行时优化。这就意味着,Java 程序往往拖得很长,其运行速率大大低于本地编译代码,因而对操作系统I/O 子系统的要求并不太高。 如今在运行...

ksfzhaohui ⋅ 2012/12/14 ⋅ 0

小博老师解析Java核心技术 ——I/O流

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

博为峰教研组 ⋅ 2016/12/13 ⋅ 0

我读过的最好的epoll讲解--转自”知乎“

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

dclink ⋅ 2014/07/04 ⋅ 16

我读过的最好的epoll讲解--转自”知乎“

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

zcx1128 ⋅ 2015/12/12 ⋅ 0

epoll模型详解

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

follitude ⋅ 2016/06/23 ⋅ 0

epoll 或者 kqueue 的原理是什么?

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

python-yzw ⋅ 2016/12/19 ⋅ 0

[unix]unix I/O知识

0.UNIX输入输出基本概念 Q1.程序与文件建立连接或通信有几种机制?流与文件描述字有什么区别? Q2.打开文件的实质? 打开文件就是程序与文件之间建立连接或通信。 流的类型是FILE; 文件描述...

im天行 ⋅ 2013/03/17 ⋅ 0

epoll浅析以及nio中的Selector

首先介绍下epoll的基本原理,网上有很多版本,这里选择一个个人觉得相对清晰的讲解(详情见reference): 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核...

Hosee ⋅ 2016/08/10 ⋅ 0

C++输入和输出流(一)——标准输入输出

目录 目录 前言 IO流的概念和流类库的结构 总结 前言 对于C++的输入输出,总是会遇到一些小细节,然后会有一些疑惑。在学习了C++输入输出流后,未知的更多,但是有了整体的一个概念! 学习!...

simonforfuture ⋅ 01/07 ⋅ 0

谈谈 C++ 中流的缓冲区

谈谈 C++ 中流的缓冲区 始终2017-12-311 阅读 BufferStreamC++ 众所周知,C++ 语言本身并不提供 I/O 功能。C++ 的 I/O 是通过标准库中输入输出流来实现的。标准库在 头文件当中,预定义了六个...

始终 ⋅ 2017/12/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 30分钟前 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 40分钟前 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 40分钟前 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 45分钟前 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 59分钟前 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 今天 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部