转载来自:http://www.cnblogs.com/FishAndWater/p/3458074.html
1:FileInputStream和FileOutputStream对象的常用方法总结
FileInputStream:文件输入字节流,只能读取文件,节点流
构造方法摘要 | |
---|---|
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的 File 对象 file 指定。 |
|
FileInputStream(FileDescriptor fdObj) 通过使用文件描述符 fdObj 创建一个FileInputStream ,该文件描述符表示到文件系统中某个实际文件的现有连接。 |
|
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream ,该文件通过文件系统中的路径名 name 指定。 |
方法摘要 | |
---|---|
int |
available() 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。 |
void |
close() 关闭此文件输入流并释放与此流有关的所有系统资源。 |
protected void |
finalize() 确保在不再引用文件输入流时调用其 close 方法。 |
FileChannel |
getChannel() 返回与此文件输入流有关的唯一 FileChannel 对象。 |
FileDescriptor |
getFD() 返回表示到文件系统中实际文件的连接的 FileDescriptor 对象,该文件系统正被此FileInputStream 使用。 |
int |
read() 从此输入流中读取一个数据字节。 |
int |
read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 |
int |
read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 |
long |
skip(long n) 从输入流中跳过并丢弃 n 个字节的数据。 |
其中read()
返回的是读入的一个字节所对应的int值(0-255),而read(byte[] b)
和read(byte[] b, int off, int len)
返回的是读入的字节数
FileOutputStream:输出文件流,写出到文件
构造方法摘要 | |
---|---|
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
|
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
|
FileOutputStream(FileDescriptor fdObj) 创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。 |
|
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。 |
|
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。 |
方法摘要 | |
---|---|
void |
close() 关闭此文件输出流并释放与此流有关的所有系统资源。 |
protected void |
finalize() 清理到文件的连接,并确保在不再引用此文件输出流时调用此流的 close 方法。 |
FileChannel |
getChannel() 返回与此文件输出流有关的唯一 FileChannel 对象。 |
FileDescriptor |
getFD() 返回与此流有关的文件描述符。 |
void |
write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。 |
void |
write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 |
void |
write(int b) 将指定字节写入此文件输出流。 |
2:BufferedInputStream和BufferedOutputStream---处理流
比FileInputStream流的功能更多,详见http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/java/io/BufferedInputStream.html
对于其中的mark()和reset()方法的使用说明:
根据JAVA官方文档的描述,mark(int readlimit)方法表示,标记当前位置,并保证在mark以后最多可以读取readlimit字节数据,mark标记仍有效。如果在mark后读取超过readlimit字节数据,mark标记就会失效,调用reset()方法会有异常。
但实际的运行情况却和JAVA文档中的描述并不完全相符。 有时候在BufferedInputStream类中调用mark(int readlimit)方法后,即使读取超过readlimit字节的数据,mark标记仍有效,仍然能正确调用reset方法重置。
事实上,mark在JAVA中的实现是和缓冲区相关的。只要缓冲区够大,mark后读取的数据没有超出缓冲区的大小,mark标记就不会失效。如果不够大,mark后又读取了大量的数据,导致缓冲区更新,原来标记的位置自然找不到了。
因此,mark后读取多少字节才失效,并不完全由readlimit参数确定,也和BufferedInputStream类的缓冲区大小有关。 如果BufferedInputStream类的缓冲区大小大于readlimit,在mark以后只有读取超过缓冲区大小的数据,mark标记才会失效。
JAVA中mark()和reset()用法的通俗理解
mark就像书签一样,在这个BufferedReader对应的buffer里作个标记,以后再调用reset时就可以再回到这个mark过的地方。mark方法有个参数,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个mark保持有效。读过这么多字符之后,系统可以使mark不再有效,而你不能觉得奇怪或怪罪它。这跟buffer有关,如果你需要很长的距离,那么系统就必须分配很大的buffer来保持你的mark。
另外补充:
1,Scanner类总结
Scanner scanner = new Scanner(System.in);
使用Scanner类创建一个对象,并通过对象调用相应的方法输入相应的数据类型如:nextInt()/nextDouble()/nextFloat()...但是,没有nextString(),直接使用next()即可。
scanner对象调用: nextByte(),nextDouble(),nextFloat,nextInt(),nextLin(),nextLong(),nextShot() 等方法读取用户在命令行输入的各种数据类型
上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认.
注意区别nextInt()/nextLine()/next()三者:
nextInt()方法会读取下一个int型标志的token.但是焦点不会移动到下一行,仍然处在这一行上;
nextLine()方法会读取该行剩余的所有的内容,包括换行符,然后把焦点移动到下一行的开头;
next()方法是以换行或者空格符为分界线接收下一个String类型变量。
Scanner()构造函数的形式常用三种:
Scanner(System.in);
Scannner(string source);
Scanner(File source);
对象scanner常用方法:
//useDelimiter(Pattern pattern)改变token的分割方式,默认的是空格,传Pattern对象
//useDelimiter(String pattern)改变token的分割方式,默认的是空格,传String
//hasNext();查看是否有token的分割段
//hasNextInt();查看是否有int类型的token的分割段
//nextInt();返回下一个int的数值
//nextLine();返回一行
//hasNext(Pattern pattern);返回下一个pattern类型的token
实例代码:
public class ScannerTest { public static void main(String[] args){ String str = "1.1 22.2 s 4 5.3 6 7.5 8 9"; Scanner scanner = new Scanner(str); //scanner.useDelimiter("\."); while(scanner.hasNext()){ if(scanner.hasNext(Pattern.compile("\d\.\d"))){ System.out.println(scanner.next()); }else{ scanner.next();//要调用一下next()相关的方法才会到下一个token } } } }
2:使用装饰器模式decorator,将输入输出流分为底层的节点流和上层的处理流。
详见http://www.cnblogs.com/zuoxiaolong/p/pattern11.html