现在的位置: 首页 > 综合 > 正文

java、IO流总结及应用

2018年05月06日 ⁄ 综合 ⁄ 共 3543字 ⁄ 字号 评论关闭

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

一、java中为什么要有IO流,它是用来做什么的?
  IO流:主要用来操作设备上的数据。比如用java程序复制文件、用程序将数据录入到文件中都用到了IO流。
二、IO流具体的分类


  1.按操作数据来分:
   <1>字符流:
    字符流的由来:
     因为文件的编码不同,从而有了对字符进行高效操作的字符流对象。
     原理:其实就是基于字节流读取字节时,去查了指定的编码表:也就是:字符流 = 字节流 +编码表
   <2>字节流:
    字节流在读取的时候,读到一个字节返回一个字节。它可以操作任何类型的数据。比如“mp3文件、音频文件、视频文件、文本文件。”
  2.按流向分:
   <1>输入流:
   <2>输出流:
  3.字符流与字节流的区别:
   <1>字节流只能读取一个字节,而字符流可以读取一个字符或多个字符。
   <2>字节流可以操作任何文件,字符流只能操作文本文件。

三、IO的体系:
  IO所具备最基本的功能就是"读和写"。
   1.字符流
    Reader<读>   Writer<写>
   2.字节流
    InputStream<读>  OutPutStream<写>
  注意:在操作IO流数据的时候,分清2个明确就可以。
      A: 明确操作数据源和目的地体系
   1、明确数据源
    从数据源是读取数据
    InPutStream
    Reader
   2、明确目的地
    把数据写入目的地
    OutPutStream
    Writer

     
B: 明确具体的数据源和目的地是否是文本文件

   1、明确数据源
    是文件: 用Reader
    不是文件: InputStream
    
   2、明确目的地
    写入的目的地是否是文件,如果是: 用Wrtier
    如果不是文件: 用OutPutStream
四:IO流的使用步骤:
  1.先明确数据源和目的地
  2.封装数据源和目的地
  3.调用流对象的方法
  4.释放资源。

五:在操作IO流遇到的一些问题:
  1.什么时候需要用到转换流?
   在操作字节流数据的时候,为了使用高效字符流的一些方法需要把字节流进行转换,这个时候java就提供了转换流。
   (InputStreamReader:字节流转换成字符流
     OutPutStreamWriter:字符流转换成字节流)

  2.在创建字符输出流对象做了几件事?
   三件事:1.创建文件对象  2.创建输出流对  3.输出流指向文件对象。

  3.为什么一定要释放资源?
   1.让对象变成垃圾  2.通知操作系统释放被占用的资源。

  4.flush方法和close方法的区别?
   flush方法:刷新缓冲区后,还可以继续使用流对象
   close方法:是在关闭流之前先进行的刷新动作,关闭流后,对象不能使用,变成垃圾了。

六:IO流的一些实例:

                  字符流实例1:

                     /*
 		      * 把d盘目录下的a.txt复制到e盘下的b.txt中,并加入异常处理。
		      */
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
	public class CopyTest {
	public static void main(String[] args) {
		FileReader fr = null;
		FileWriter fw = null;
		try {
			// 字符输入流封装数据源
			fr = new FileReader("d:\\a.txt");
			// 字符输出流封装目的地
			fw = new FileWriter("e:\\b.txt");

			// 基本读写
			int ch = 0;
			while ((ch = fr.read()) != -1) {
				fw.write(ch);
				// fw.flush();
			}

		} catch (IOException ie) {
			ie.printStackTrace();
		} finally {
			// 释放资源
			if (fw != null) {
				try {
					fw.close();

				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fr != null) {
				try {
					fr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		
	}
}

                           
字节流实例2:

/**
	  *测试字节流的复制mp3所用的时间:
	  *
	  */

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyMP3 {
	public static void main(String[] args) throws IOException {
		long start = System.currentTimeMillis();
		method();
		long end = System.currentTimeMillis();
		System.out.println("共耗时:" + (end - start) + "毫秒");
	}

	// 高效的一次读写一个字节
	private static void method() throws IOException {
		//创建字节输入流对象
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				"zxmzf.mp3"));
		//创建字节输出流对象
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream("method4.mp3"));
		//定义缓冲区
		byte[] bys = new byte[1024];
		int len = 0;
		//调用输入流方法
		while((len=bis.read(bys))!=-1){
			bos.write(bys,0,len);
		}
		//释放资源
		bos.close();
		bis.close();
	}
}

                           
转换流实例3:

/**
	  *把键盘录入的数据,转成大写通过标准流显示在控制台。
	  *
	  */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class SystemOutDemo2 {
	public static void main(String[] args) throws IOException {
		// 封装数据源和目的地
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		//基本读写操作
		String line=  null;
		while((line=br.readLine())!=null){
			//数据源是键盘录入的时候,一定要自定义结束标记
			if("886".equals(line)){ //==
				break;
			}
			bw.write(line.toUpperCase());
			bw.newLine();
			bw.flush();
		}
		//释放资源
		bw.close();
		br.close();
	}
}

上述总结:
  实例1:当数据源和目的地的操作的数据是文本文件的时候,用字符流是最高效。
  实例2:高效字节流,之所以高效是因为每次读取字节的时候,都将数据存在了缓冲区。在写入的时候从缓冲区写入,提高了效率
  实例3:当从键盘录入和控制台结束的时候,需要定义标记。因为控制台录入的都是字节和字符,所以需要用到了转换流,转换成字符流,并使用它的高效方法。

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

抱歉!评论已关闭.