Java Io流的认识和写法实例

java Io 标准的输入和输出
java定义了一套标准的输入与输出,可以使得 我们用相同的
读写方式对任意设备进行操作
读写方式对任意设备进行操作

java Io将读操作与写操作分开,并用方向区分
用方向区分。
输入流:是外界到程序的方向,用于从外界读取数据
输出流:是程序到外界的方向,用于写出数据

java将流分为两大类
节点流:也称低级流,是实际链接程序与数据源的"管道"
负责实际读写数据的流,节点流的另一端是明确
的,我们通过它知道数据是从哪里或发送到哪里去的
读写一定是建立在节点流上进行的

处理刘:也称为高级流,不能独立存在,必须连接在其它流
上,这样在读写数据时,当数据"流经"当前高级流时
对其进行某些处理。从而简化我们队数据操作

在IO操作时,通常我们会串联一组高级流并最终连接到
某个低级流上对某个设备进行读写操作,并且在读写过程中
每个高级流都可以以流水线式的加工处理对数据操作后写出,以
简化我们的操作,这个过程称之为:"流的链接":
这也是IO的精髓

文件流:
java.io.FileOutputStream
java.ioFileInputStream

文件流是一对低级流,用于读写文件数据的流。

下面演示了文件的输出流:

  • 输出流 类:FileOutputStream(<文件路径>,<boolean值 true:在文件末尾追加写入,反之不写:从开始替换>);
  • 写 方法    :<输出流>.write(<写入数据(可以是byte数组 也可是具体值)>)
package Iodataflow;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileIoOut {
	public static void main(String[] args) throws IOException {
 
		/***************************************************
		 * FileOutputStream(<参数1>,<参数2>);				
		 * 				参数1:文件的路径					
		 * 				参数2:true则 在文件的末尾追加写入	
		 ***************************************************/
		FileOutputStream file = new FileOutputStream("fos.txt",true);
		/****************************************************************
		 *	文件流是基于IO的顺序读写形式,即:数据只能顺序的向后或者写,	
		 * 	而,RAF是基于指针的随机读写形式,可是操作指针灵活的在文件中		
		 * 	任意位置读写。											
		 * 	所以单从读写方式来看,RAF的读写更灵活。						
		 * 																
		 * 	但是文件流可以基于流连接,串联高级流将一个复杂数据的读写操		
		 * 	作轻松搞定,这是RAF所不及的。									
		 * 																
		 ****************************************************************/
 
		byte[] data = "就全球气候变暖交换了意见".getBytes("UTF-8");
		file.write(data);
		System.out.println("写入完毕");
		/********************************************************************
		 *	每次实例化一个FileOutputStream IO流对象的时,如果这个文件已		
		 *	存在,那么对这个文件的写入将会直接覆盖掉源文件的所有内容,也就是	
		 *	相等与在实例化时就会清空文件										
		 ********************************************************************/
		file.close();
	}
}

上面是io输出流,下面演示输入流的操作:

  • 输入流 类:FileInputStream
  • 写 方法    :<输入流>.read(<写入数据(可以是byte数组 也可是具体值)>)
package Iodataflow;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo {
	public static void main(String[] args) throws IOException {
		FileInputStream fos = new FileInputStream("fos.txt");
		byte [] data = new byte [100];
		int len = fos.read(data);
		String str = new String(data,0,len,"UTF-8");
		System.out.println(str);
		fos.close();
	}
}

文件的拷贝和复制演示

  • 输入流 类:FileInputStream
  • 输出流 类:FileOutputStream
  • 写 方法    :<拷贝输出流>.write(<写出数据>, <从哪里开始>, <写到哪里结束 一般为 获取到的数据的长度>);
package Iodataflow;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class CopyDeo {
	public static void main(String[] args) throws IOException {
		/************************************************************************
		 * 1.创建文件输入流读取源文件 2.创建文件输入流向复制文件写 3.使用输入流循环
		 * 从原文件读取字节并通过 文件输出流写入复制文件中,完成复制操作
		 ************************************************************************/
		// 原文件输入流
		FileInputStream fos = new FileInputStream("cc.rar");
		// copy输入 复制流
		FileOutputStream fos_copy = new FileOutputStream("cc_copy.rar");
		int len = -1;
		byte[] data = new byte[32];
		long t1 = System.currentTimeMillis();
		while ((len = fos.read(data)) != -1) {
			fos_copy.write(data, 0, len);
		}
		System.out.println("复制完成,耗时:" + (System.currentTimeMillis() - t1) + "毫秒");
		fos.close();
		fos_copy.close();
	}
}

/****************缓冲流的作用************************
* 缓冲流是将读写转换为块读写从而提高效率
* bis.read()方法,看似读取一个字节,实际缓冲
* 输入流一次读取了8k的数据,然后将第一个字节返回
* 如果我们再调用read方法,它会直接将第二个字节
* 返回(此时不再发生实际读取操作)直到将8k字节都
* 返回后才会再次读取8k的数据。
*
* 但其实是可以给定每次读取更多(8k以上)数据,用于
* 更快的读写文件
****************************************************/

	package Iodataflow;
 
	import java.io.BufferedInputStream;
	import java.io.BufferedOutputStream;
	import java.io.FileInputStream;
	import java.io.FileOutputStream;
	import java.io.IOException;
 
	/********************************************
	 * 使用缓冲流完成文件的复制操作缓冲流是一
	 * 对高级流,它们在流链接中的作用是加快数据
	 * 的读写效率。
	 * java.io.BufferedOutputStream 
	 * java.io.BufferedInputStream 
	 *********************************************/
	public class CopyDemo2 {
		public static void main(String[] args) throws IOException {
 
			FileInputStream fis = new FileInputStream("cc.rar");
			BufferedInputStream bos = new BufferedInputStream(fis);// 缓存流,用于加速数据的读写效率
 
			FileOutputStream fos = new FileOutputStream("cc_copy.rar");
			BufferedOutputStream bof = new BufferedOutputStream(fos);
 
			// int len = -1;
			long t1 = System.currentTimeMillis();
			byte[] data = new byte[32];
			while ((bos.read(data)) != -1) {
				bof.write(data);
			}
			System.out.println(("拷贝完成!耗时:" + (System.currentTimeMillis() - t1) / 1000) + "秒");
			bos.close();
			bof.close();
		}
	}