IO流的分类:

A:流向

输入流 读取数据

输出流 写出数据

B:数据类型

字节流

字节输入流  InputStream

字节输出流  OutputStream

字符流

字符输入流  Reader

字符输出流  Writer

这个流都是抽象类,是所有具体流的父类,我们使用IO流都是使用它们的实现类。

那么字节流和字符流有什么区别呢?一般来说,字符流是为了更好的处理中文字符而出现的,比字节流晚出现,在对中文字符进行操作时,建议使用字符流,但是使用字节流也可以,因为字节流是万能的。

那么怎么使用字节流呢?这里我们先讲字节流,字符流后面再讲。。以FileOutputStream和FileInputStream为例来讲

比如:

1、我要向一个文件中写入数据,就可以这样做:

public static void main(String[] args) throws IOException {
		FileOutputStream fos = new FileOutputStream("demo.txt");// 传入的是一个文件对象或者文件名,默认是当前项目目录下,要是想放在其它地方,则以这样的格式就行,d:\\demo\\demo.txt,这样就相当于在d盘的demo目录下创建了demo.txt的文件.注意,输出流即OutputStream会自动创建这个文件,而输入流InputStream则不会.很简单,你要从一个文件中读数据是不是要有一个文件才能读啊?写数据时候如果没有这个文件就会自动帮你创建这个文件
		String str = "hello 中国";
		byte[] bytes = str.getBytes();//把字符串转化为字节数组
		fos.write(bytes);//这里传入的是一个byte[]数组,必须把写入的数据转化为字节数组才能写。
		fos.close();//关闭资源
	}

在该项目下,我们可以看到生成了一个demo.txt文件,打开文件后显示:hello 中国

2、我要把一个文件中的数据读出来,就可以这样:

public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("demo.txt");
		int by = -1;
		while((by = fis.read())!=-1){//fis.read()表示一个字节一个字节的读数据,该返回值是int类型的值,是读取到数据的ascii表中对应的值,比如a对应ASCII表中的值是97,那么它返回的就是97,返回-1就说明读完了,如果文件中有换行,那它也会读,读的字符为\n。
		System.out.print(by+" ");//输出的为Ascll对应的值104 101 108 108 111 32 214 208 185 250,要输出字符,可以把它转化为字符,即(char)by;
		}
		fis.close();
	}

3、在第一点基础上补充一下,第一点的

FileOutputStream fos = new FileOutputStream("demo.txt");方式写数据,是从文件的开始写的,相当于把之前的数据覆盖了,我要是想在一个文件中的结尾开始写数据呢?那怎么办?很简单,在FileOutputStream fos = new FileOutputStream("demo.txt",true)加一个参数true,或者在fos.write(bytes,true)第二个参数中加true,都是表示是以追加数据的形式写数据。

4、我要把一个文件中的数据复制到另外一个文件中呢,其实就是结合上面的做法:一个读一个写

public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("a.txt");//a文件的输入流对象
		FileOutputStream fos = new FileOutputStream("b.txt");//b文件的输出流对象
		int by = -1;
		while ((by = fis.read()) != -1) {//读出一个字节,然后再写入一个字节的数据
		fos.write(by);//一个字节一个字节的写
		}
		fos.close();
		fis.close();
	}

这样就ok啦,打开b文件会发现和a文件的内容一模一样,但是,这样一个字节一个字节的读和写是不是效率太低了呢?有没有更高效率的方法呢?肯定有的,那就是以一个字节数组的大小来读和写,一次读一个字节数组和写一个字节数组的数据。

5、以字节数组方式读取和写入数据:

public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("a.txt");
		FileOutputStream fos = new FileOutputStream("b.txt");
		byte[] bytes = new byte[1024]; //定义一个1024个字节大小的字节数组
		int len = -1;
		while ((len = fis.read(bytes)) != -1) {//fis.read(bytes)表示一次读1024个字节存储到字节数组中,该返回值是读取到字节的长度,这和读取单个字节的返回值并不一样,需要注意!!!
			//fos.write(bytes);不要这样写,应该以下面这种方式写
			fos.write(bytes,0,len);//该表示写入刚刚读取时存储到bytes字节数组中的数据,从0开始,到数组下标为len之间的数据写入,这个必须要加。因为如果不加,可能文件末尾读取的字节数据不到1024个数组大小,直接写入的话会写入上次后面没有被覆盖的值,导致数据不一致。
		}
		fos.close();
		fis.close();
	}

6、虽然上面的方式以字节数组来读写比较高效,但是还有一种以字节缓冲区来读写的,这种方式是最高效的。

字节缓冲区流:

A:BufferedOutputStream

B:BufferedInputStream

使用起来也非常简单,即:把字节流包装在字节缓冲流里面即可,用法一样,相当于把之前的流装饰了一下:

public static void main(String[] args) throws IOException {
		//BufferedOutputStream实际上自己内部有一个缓冲的字节数组
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("杏花弦外雨.mp3"));//传入的是一个InputStream对象
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("杏花弦外雨2.mp3"));
		byte[] bytes = new byte[1024];
		int len = -1;
		while((len=bis.read(bytes))!=-1){
			bos.write(bytes, 0, len);
			bos.flush();//刷新此缓冲的输出流,将缓冲区的数据写入文件
		}
		bos.close();
		bis.close();
	}

是不是很简单呢?

转载请注明出处————sunzxyong

java之IO流详解(一)的更多相关文章

  1. Java之IO流详解

    IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的  输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. ...

  2. JAVA中IO流详解

    IO流:数据传输是需要通道的,而IO流就是数据传输的通道. IO流可以形象的比喻为运送货物的传输带. IO流的分类: ①根据操作的数据类型的不同可以分为 :字节流与字符流. ②根据数据的流向分为:输入 ...

  3. java之IO流详解(二)

    好了,昨天讲了字节流,现在我们就来讲字符流吧... 字符流可以这样理解,字符流 = 字节流 + 编码表,目的是为了更好的操作中文字符(注:字符流只可以可以操作字符类型的文件,不能操作影音图像文件,要操 ...

  4. 基于JavaSE阶段的IO流详解

    1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...

  5. Java io流详解四

    转载地址:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html 写在前面:本文章基本覆盖了java IO的全部内容,jav ...

  6. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  7. Java io流详解二

    原文地址https://www.cnblogs.com/xll1025/p/6418766.html 一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间 ...

  8. Java io流详解一

    原文地址http://www.cnblogs.com/xdp-gacl/p/3634409.html java基础学习总结——流 一.JAVA流式输入/输出原理

  9. 《Java基础知识》Java IO流详解

    Java IO概念 1. 用于设备之间的数据传输. 2. Java 将操作数据流的功能封装到了IO包中. 3. 数据流流向分:输入流和输出流,操作对象为文件. 4. 流按照操作数据分:字节流(通用)和 ...

随机推荐

  1. bzoj 3277: 串

    Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中 至少k个字符串的子串(注意包括本身). Solution 出现 \(k ...

  2. Ubuntu下的第一个博客

    (Blogilo还是可以的,只是不能加代码,不能选随笔分类,用不起摘要,字号的选择诡异...)

  3. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  4. bzoj4361isn 容斥+bit优化dp

    4361: isn Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 375  Solved: 186[Submit][Status][Discuss] ...

  5. [IOI1998] Pictures

    用线段树维护区间最小值和最小值个数来求一段区间里0的个数,把横的和竖的边分别拿出来,排序,然后每次查一下重复部分的长度即可 #include<iostream> #include<c ...

  6. MySQL创建用户与授权(CentOS6.5)

    1.相关SQL语句 #创建用户与授权方法 ##本地访问 create user 'zend'@'localhost' IDENTIFIED BY '123456'; grant ALL privile ...

  7. 好用的jquery.animateNumber.js数字动画插件

    在做公司的运营报告页面时,有一个数字累计增加的动画效果,一开始,毫无头绪,不知如何下手,于是上网查资料,发现大多都是用的插件来实现的,那么今天,我也来用插件jquery.animateNumber.j ...

  8. ajaxStart()和ajaxStop()

    Jquery中当一个Ajax请求启动时,并且没有其他未完成的Ajax请求时,将调用ajaxStart()方法.同样,ajaxStop()方法则是在所有Ajax请求都完成时调用.这些方法的参数都是一个函 ...

  9. rw 模板设置

    在编译的时候只有写出rw之后使用alt+/就可以将模板代码全部展现出来. rw读写模板代码: InputStream in = null; OutputStream out = null; try { ...

  10. vmware迁移到openstack的一些坑

    title: 安全平台迁移 tags: 新建,模板,小书匠 grammar_cjkRuby: true --- 前言 主要有三个坑: 一是如果原先虚拟机没有安装virtio驱动,要设置设备驱动为ide ...