首页 > 代码库 > JAVA进阶-IO流(1)

JAVA进阶-IO流(1)

http://download.csdn.net/detail/qq285016127/7963747

Java对文件的操作API一般分为字节流 字符流 其为文件的读写API框架也是通过这个思想去扩展的.另外,在流的流向中也分为源流和宿流.如图(流的主体是根据流向决定,如输入InputStream/输出流OutPutStream)


<1>从整个框架上看,io流的主要知识点分为:

1.字节流(输入FileInputStream/输出FileOutputStream)

1)字节流的构造一般都会通过文件File类,或者文件的绝对路径

2)文件的读取需要FileInputStream类,其read()提供了3个方法,需要我们提供最基本的byte字节数组,该数组作为缓冲流数据默认情况下,没有参数的时候系统会默认一个只有长度1的数组.每次读完,即把数据放在缓冲区中.

3)FileInputStream提供了available()对象方法,返回未阻塞的数据长度.一般数据较小的情况下 ,我们可以声明缓冲区的长度为此长度.一次读入内存;

4)文件的写入需要FileOutputStream类,其write()也提供了上面三种类型的方法.

示例代码如下:

/**
 *		字节流简单应用
 *
 * 	@author Lean  @date:2014-9-22  
 */
public class OutputStreamSample {

	public static void main(String[] args) {
		String filePath = "C:/Users/Administrator/Desktop/aa.txt";
		String outFilePath = "C:/Users/Administrator/Desktop/bb.txt";
		InputStream fis=null;
		OutputStream fos=null;
		int readNum=0;
		//必须为2的n次方,因为数据可能存在字符
		byte[] buff=new byte[2];
		try {
			fis=new FileInputStream(filePath);
			//通过File,File全路径 或者文件描述器构造 如果没有文件 则自动创建
			fos=new FileOutputStream(outFilePath);
			while ((readNum=(fis.read(buff)))!=-1) {
				//根据偏移量写入文件
				fos.write(buff,0,readNum);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if (fos!=null) {
					fos.close();
				}
				if (fis!=null) {
					fis.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
}

2.字符流,也有称为转换流(InputStreamReader/OutputStreamWriter)

1)字符转换流,沿用上面的思想,也提供了读取操作,只不过该缓冲区的定义数组为char[ ];

2)字符转换流为字节流的装饰器,集成了字节流的优势,效率较高.代码如下:

/**
 *		字符流简单应用
 *
 * 	@author Lean  @date:2014-9-22  
 */
public class CharacterIOSample {
	
	public static void main(String[] args) {
		final String filePath = "C:/Users/Administrator/Desktop/aa.txt";
		final String outFilePath = "C:/Users/Administrator/Desktop/bb.txt";
		
		Writer writer=null;
		Reader reader=null;
		char[] buff=new char[512];
		int readNum=0;
		try {
			reader=new InputStreamReader(new FileInputStream(filePath));
			writer=new OutputStreamWriter(new FileOutputStream(outFilePath));
			while ((readNum=reader.read(buff))!=-1) {
				writer.write(buff,0,readNum);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if (writer!=null) {
					writer.close();
				}
				if (reader!=null) {
					reader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
		
	}
	
}

3.缓冲流(BufferedReader/BufferedWriter)

1)缓冲流字符转换流的装饰器,集成了字符转换流的优势,效率有所较高,并提供了读取整行,写入整行的方法.

2)缓冲流,顾名思义就是内置了缓冲数据,我们不需要为此再写缓冲数据(char[] / byte[]);

/**
 * 		内置缓冲流简单应用
 * 
 * @author Lean @date:2014-9-22
 */
public class BufferedIOSample {

	public static void main(String[] args) {
		final String filePath = "C:/Users/Administrator/Desktop/aa.txt";
		final String outFilePath = "C:/Users/Administrator/Desktop/bb.txt";

		BufferedWriter writer = null;
		BufferedReader reader = null;
		String appendStr =null;
		try {
			reader = new BufferedReader(new InputStreamReader(
					new FileInputStream(filePath)));
			writer = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(outFilePath)));
			while ((appendStr = reader.readLine()) != null) {
				System.out.println(appendStr);
				writer.write(appendStr);
			}
			writer.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if (writer!=null) {
					writer.close();
				}
				if (reader!=null) {
					reader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}

}

4.对象流(ObjectOutputStream/ObjectInputStream)

1)该流可以把数据保存到文件中去,保存的对象需要实现Serializable接口,并实现序列码(修改该类有用)

2)如果保存的对象属性也为对象,也必须实现上面的接口.实现该接口的作用为支持持久化/网络传输

3)保存的对象文件乱码,无法直接打开.但如果想更加安全,必须实现另一个接口Externalizable实现自己的保存策略.

/**
 *		
 *
 * 	@author Lean  @date:2014-9-22  
 */
public class ObjectIOSample {
	
	public static void main(String[] args) {
		saveObject();
		readObject();
	}
	
	public static void saveObject(){
		String filePath="C:\\Users\\Administrator\\Desktop\\cc.txt";
		ObjectOutputStream oos=null;
		try {
			oos=new ObjectOutputStream(new FileOutputStream(filePath));
			oos.writeObject(new Student(1, "Lean", 82));
			oos.writeObject(new Student(2, "Lucy", 62));
			oos.writeObject(new Student(3, "Lout", 85));
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if (oos!=null) {
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	} 
	
	public static void readObject(){
		String filePath="C:\\Users\\Administrator\\Desktop\\cc.txt";
		ObjectInputStream ios=null;
		try {
			ios=new ObjectInputStream(new FileInputStream(filePath));
			Object object=null;
			for (int i = 0; i < 3; i++) {
				System.out.println(ios.readObject());
			}
		}  catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if (ios!=null) {
				try {
					ios.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	} 
	
}

/**
 * 	@author Lean  @date:2014-9-22  
 */
public class Student implements Serializable{

	private int id;
	private String name;
	private int score;
	
	public Student(int id, String name, int score) {
		this.id = id;
		this.name = name;
		this.score = score;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", score=" + score
				+ "]";
	}
	
}

(PS:另一章高级部分正在总结....)


JAVA进阶-IO流(1)