第一章 面向对象
第二章 异常
第三章 数组
第四章 常用类
第五章 集合
第六章 IO流
第七章 线程
第八章 反射
第九章 Socket编程

Java io中FileInputStream & FileOutputStream源码分析

 

使用这两个类可以读写文件内容, 是以字节为单位

 

package com.wkcto.chapter06.fileinputstream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 以字节为单位读取文件的内容, 循环读取
 * @author 蛙课网
 *
 */
public class Test03 {
	public static void main(String[] args) throws IOException {
		//1)在当前程序与指定的文件之间建立流通道
		//使用FileInputStream类以字节为单位读取文件内容, 通过构造方法指定要访问的文件
		FileInputStream fis = new FileInputStream("d:/abc.txt");
		//该文件内容: ABCabc
		
		//2)读取文件数据, read()方法从文件中读取一个字节 ,并把读到 的字节返回, 如果读到文件末尾返回-1
		int cc = fis.read(); 
		
		while( cc != -1 ){
			//对读到的cc字节进行处理
//			System.out.println( cc ); 		//把读到的字节打印到屏幕上
			System.out.print( (char)cc ); 			//当前文件中都是英文字符,一个字符对应一个字节, 把读到的字节转换为字符再打印
			//继续读取文件中的内容
			 cc = fis.read(); 
		}
				
		//3)关闭流通道
		fis.close();
	}
}
package com.wkcto.chapter06.fileinputstream;

import java.io.FileInputStream;
import java.io.IOException;
/**
 * 一次读取一个字节数组,循环读取
 * @author 蛙课网
 *
 */
public class Test04 {

	public static void main(String[] args) throws IOException {
		//1)建立与文件的流通道
		FileInputStream fis = new FileInputStream("d:/abc.txt");
		//文件内容:ABCabcwkcto
		
		byte[] bytes = new byte[8];
		
		//2)读取数据保存到字节数组中, 返回读到的字节数,如果读到文件末尾返回-1
		int len = fis.read(bytes);
		
		while( len != -1 ){
			//从流中读取了len个字节保存到了字节数组中, 可以对这len个字节 进行处理
			//把读到的len个字节转换为字符串打印到屏幕上
			System.out.print( new String(bytes, 0, len)  );
			
			//继续向下读, 读的字节继续保存到字节中
			len = fis.read(bytes);
		}		
		
		//3)关闭流
		fis.close();
	}

}

package com.wkcto.chapter06.fileinputstream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 异常处理
 * @author 蛙课网
 *
 */
public class Test05 {

	public static void main(String[] args) {
		
//		readData(); 		//以字节为单位读取文件内容, 异常处理, 手动关闭流
		readData2(); 		//以字节数组为单位读取文件内容, 异常处理, 自动 关闭流, 从JDK7开始
	}

	private static void readData2() {		
		try (
				FileInputStream fis = new FileInputStream("d:/abc.txt");
				) {
			byte [] bytes = new byte[8];  	//字符数组一般情况下是1024的偶数倍
			int len = fis.read(bytes);
			while( len != -1){
				System.out.print( new String(bytes, 0 ,len));
				len = fis.read(bytes);
			}
			
		} catch (Exception e) {
		}
	}

	private static void readData() {
		
		FileInputStream fis = null;
		try {
			fis = new FileInputStream("d:/abc.txt");
			int cc = fis.read();
			while( cc != -1 ){
				System.out.print( (char)cc );
				cc = fis.read();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if ( fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}				
			}			
		}
		
	}

}

package com.wkcto.chapter06.fileinputstream;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 演示FileOutputStream, 把程序中的数据保存到文件中
 * @author 蛙课网
 *
 */
public class Test06 {

	public static void main(String[] args) throws IOException {
		//1)建立当前程序与文件之间的流通道, 如果文件不存在,会创建一个新的文件,如果文件已存在,会覆盖原来的内容
//		FileOutputStream fos = new FileOutputStream("d:/def.txt");
		//1)建立当前程序与文件之间的流通道, 如果文件不存在,会创建一个新的文件,如果文件已存在,原文件后面追加新的内容
		FileOutputStream fos = new FileOutputStream("d:/def.txt", true); 	//以追加的方式打开文件
		//2)把数据保存到文件中
		//2.1 可以一次保存一个字节
		fos.write(97);
		fos.write(98);
		fos.write(99);
		//2.2 可以一次保存一个字节数组
		byte[]bytes = "wkcto is a NB Website".getBytes();
		fos.write(bytes);
		//2.3 换行 , 在Windows操作系统中,换行需要\r\n两个 字符
		fos.write('\r');
		fos.write('\n');
		//2.4 保存字节数组中部分字节
		fos.write(bytes, 0, 5);
		
		//3)关闭流通道
		fos.close();
	}

}

package com.wkcto.chapter06.fileinputstream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 以字节流实现文件的复制
 * @author 蛙课网
 *
 */
public class Test07 {

	public static void main(String[] args) {
		String srcFile = "d:/javase/video/6-6 FileOutputStream保存数据到文件.avi"	;
		String destFile = "d:/hehe.avi";
		
//		copyFile1( srcFile, destFile );  		//以字节为单位复制, 异常处理, 手动关闭流
		copyFile2(srcFile ,destFile); 			//以字节数组为单位复制, 异常处理, 自动关闭流
	}

	////以字节数组为单位复制, 异常处理, 自动关闭流
	private static void copyFile2(String srcFile, String destFile) {
		try (
				FileInputStream fis = new FileInputStream(srcFile);
				FileOutputStream fos = new FileOutputStream(destFile);
				) {
			byte [] bytes = new byte[1024];
			int len = fis.read(bytes);
			while( len != -1 ){
				//把读到的len个字节保存到fos输出流中
				fos.write(bytes, 0, len);
				len = fis.read(bytes);
			}
			
		} catch (Exception e) {
		}
	}

	////以字节为单位复制, 异常处理, 手动关闭流
	private static void copyFile1(String srcFile, String destFile) {
		//文件复制,从源文件中读取一个字节, 把该字节保存到目标文件中
		
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(srcFile);
			fos = new FileOutputStream(destFile);
			
			int cc = fis.read(); 	//从源文件中读取一个字节
			while( cc != -1 ){
				//把读到的字节cc保存到目标文件中
				fos.write(cc);
				//继续读到源文件的下个字节
				cc = fis.read(); 
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if ( fis != null ) {
				try {
					fis.close();
//					fos.close(); 		//不能放在一起
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

}

 

全部教程