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. [USACO 08JAN]Telephone Lines

    Description Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone compa ...

  2. 【USACO】电子游戏 有条件的背包

    题目描述 翰的奶牛玩游戏成瘾!本来约翰是想把她们拖去电击治疗的,但是他发现奶牛们在玩游戏后生产 了更多的牛奶,也就支持它们了. 但是,奶牛在选择游戏平台上的分歧很大:有些奶牛想买 Xbox 360 来 ...

  3. bzoj3156防御准备 斜率优化dp

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2279  Solved: 959[Submit][Status][Discuss ...

  4. 常用SQL Server命令(持续) | Commonly used SQL Server command list (Cont')

    ---------------------------------------------------- 1. 查看某数据库中某表详细信息 SP_HELP USE DB_NAME GO SP_HELP ...

  5. Windows10下配置python的环境变量

    从官网下载Windows下的python版本,一路按照默认进行安装. 安装之后配置环境变量的步骤如下: 1,点"我的电脑",右键选"属性". 2,选择" ...

  6. Python中模块之queue的功能介绍

    模块之queue的功能介绍 队列的分类: 队列主要要分为两种 1.双向队列 2.单项队列 1. 单项队列 创建单项队列 格式:queue.Queue(obj) 例如:que = queue.Queue ...

  7. Mysql锁机制--索引失效导致行锁变表锁

    Mysql 系列文章主页 =============== Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~ 在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不 ...

  8. Java transient关键字使用小结

      1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的.2.被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被t ...

  9. RandomAccessFile读取文本简介

    RandomAccessFile类的常用的操作方法 1.public  RandomAccessFile(File file, String mode)throws FileNotFoundExcep ...

  10. Lock锁子类了解一下

    前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 Java锁机制了解一下 AQS简简单单过一遍 只有光头才能变强! 上一篇已经将Loc ...