一,java 如何处理输入输出

      java有许多用于各种母的的I/O类。笼统的说,可以把他们分为输入和输出类。输入累包含读取数据的方法,输出类包含写数据的方法。输入对象从文件中读取数据流,输出对象见数据流写入文件。输入对象也叫做输入流,输出对象也叫做输出流。可以这样理解,输入/输出是相对于java 虚拟机以及我们编写的程序而言的,输入就是读取数据输入到我们的程序中,输出就是我们就爱那个数据输出到文件中。

                                                  

    二、文本IO/与二进制IO

            从本质上说所有的文件都是二进制文件,文本I/O是在二进制I/O基础上提供的一层抽象,他封装字符的编码和几码过程,在读取文件时自动解码,在写入文件时自动编码。

     

 3     二进制I/O类

      JAVA I/O 类的体系结构非常清晰,InputStraem类是二进制输入类的基类,OutputStream 类是二进制输出类的基类。他们都是抽象类,提供基本的输入输出功能,子类扩展他们,提供专门的功能。

    

   

   InputStream 的常用方法

 

java.io.InputStream
+read():int从输入流中读取下一个数据字节,返回 0~255之间的int型的字节值。如果达到末尾,返回-1
         +read(b:byte[]):int                               从输入流中读取最多b.length个数据字节到数组b中,返回实际的读取的字节数,到达末尾返回-1
        +read(b:gyte[], off:int, len:int):int                                从输入流中读取多个字节,并存储在b【off】,b【off+1】.........b[off+len-1]中,返回实际读取的字节数,倒到达末尾返回-1
+avaliable():int                               返回能偶从输入流中读取的字节数
+close():void                               关闭输入流并释放预期有关的所有系统资源。
+skip(n:long):long                              跳过并放弃输入流中的n个字节数据,返回跳过的实际字节数。
+markSupported():boolean                              测试输入流是否支持mark和reset方法
mark(readlimit:int):void                            在输入流中标记当前位置
reset():void                              将输入流重新定位到对该流最后调用mark()方法是的位置。
   


OutputStream 的常用方法

   

java.io.OutputStream
write(int b):void 将指定的字节写入输出流。参数是一个int值。
write(b:byte【】):void 将输入b中的所有字节写入输出流
write(b:byte[ ],off:int,len:int):void 将b[off],~b[off+len-1]写入输出流
close() 关闭输出流并释放有关的系统资源。
flush();:void 刷新输出流并强制写出所有缓冲的输出字节。


二进制I/O类中的所有方法都会生命抛出 java.io.IOException或 java.io.IOExecption的子类。


FileInputStream类和FileOutputStream类 用于从/向文件读取/写入字节。他们的所有方法是从InputStraem 和OutputStream类中继承的,没有引进新的方法。

FilterInputStraem类和FilterOutputStream类

 过滤数据流是为某种目的过滤字节的数据流。基本字节输入流提供的读取方法只能用来读取字节,如果有要读取整数值,浮点值和字符串,需要一个顾虑其类包装字节输入流。使用过滤器类读取整数值、双精度值和字符串,而不仅仅是字节或字符。 FilterOutputStream 和FilterOutputStream 类是过滤数据的基本类,需要处理基本是类型数据是,使用DataInputStream类 和DataOutputStream 类来过滤字节。


    BufferedOutputStream类和 BufferedOutputStream类通过在流内添加缓冲区减少读写次数来提高输入输出速度。缓冲区默认大小是512个字节。只有当缓冲区已满或者调用flush()方法是,缓冲区输出流才调用写入方法。


    下面是一个复制文件的例子

  

import java.lang.*;
import java.io.*;

class Copy{
	/**
	  sourceFilePath:需要复制的源文件
	  targetFilePath:目标文件
	  isCoverWhentargetfileExists :当目标文件存在的时候是否覆盖目标文件
	*/
	public static void copyFile(String sourceFilePath, String targetFilePath, boolean isCoverWhentargetfileExists) throws IOException{
		//参数
		if(null == sourceFilePath || null == targetFilePath ){
			throw new NullPointerException("参数不能为空");
		}
		//检查源文件是否存在
		File sourceFile = new File(sourceFilePath);
		if(!sourceFile.exists()){
			throw new FileNotFoundException("文件:" + sourceFilePath + "没有找到");
		}
		
		//检查目标文件是否存在
		File targetFile = new File(targetFilePath);
		if(targetFile.exists() && ! isCoverWhentargetfileExists){
			//这里其实应该扩展IOException 自定义一个已经FileExistsException
			throw new IOException("目标文件已存在!");
		}
		
		BufferedInputStream input = new BufferedInputStream(new FileInputStream(sourceFile));	
		BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(targetFile));
		
		//开始复制文件内容
		int r;
		while((r=input.read())!=-1){
			output.write((byte)r);
		}	
		//关闭流
		input.close();
		output.close();	
	
	}
}







作者:duanmengchao 发表于2012-3-11 15:14:53 原文链接
阅读:16 评论:0 查看评论

 

 posted on 2012-03-11 15:15  小段段  阅读(1380)  评论(0编辑  收藏  举报