一,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 查看评论