Java--输入输出流
2014-11-18 22:06
411 查看
转载来自:http://www.cnblogs.com/FishAndWater/p/3458074.html
1:FileInputStream和FileOutputStream对象的常用方法总结
FileInputStream:文件输入字节流,只能读取文件,节点流
其中
FileOutputStream:输出文件流,写出到文件
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
实例代码:
2:使用装饰器模式decorator,将输入输出流分为底层的节点流和上层的处理流。
详见http://www.cnblogs.com/zuoxiaolong/p/pattern11.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() 关闭此文件输入流并释放与此流有关的所有系统资源。 |
protectedvoid | finalize() 确保在不再引用文件输入流时调用其 close方法。 |
FileChannel | getChannel() 返回与此文件输入流有关的唯一 FileChannel对象。 |
FileDescriptor | getFD() 返回表示到文件系统中实际文件的连接的 FileDescriptor对象,该文件系统正被此 FileInputStream使用。 |
int | read() 从此输入流中读取一个数据字节。 |
int | )]read(byte[] b) 从此输入流中将最多 b.length个字节的数据读入一个 byte 数组中。 |
int | ,int,int)]read(byte[] b,int off,int len) 从此输入流中将最多 len个字节的数据读入一个 byte 数组中。 |
long | skip(long n) 从输入流中跳过并丢弃 n个字节的数据。 |
read()返回的是读入的一个字节所对应的int值(0-255),而
)]read(byte[] b)和
,int,int)]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() 关闭此文件输出流并释放与此流有关的所有系统资源。 |
protectedvoid | finalize() 清理到文件的连接,并确保在不再引用此文件输出流时调用此流的 close方法。 |
FileChannel | getChannel() 返回与此文件输出流有关的唯一 FileChannel对象。 |
FileDescriptor | getFD() 返回与此流有关的文件描述符。 |
void | )]write(byte[] b) 将 b.length个字节从指定 byte 数组写入此文件输出流中。 |
void | ,int,int)]write(byte[] b,int off,int len) 将指定 byte 数组中从偏移量 off开始的 len个字节写入此文件输出流。 |
void | write(int b) 将指定字节写入此文件输出流。 |
比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 staticvoid 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
相关文章推荐
- Java调用外部进程并拦截输入输出流--Java IDE Console解密(上篇)
- 浅谈Java的输入输出流
- java输入输出流实例(FileInputStream、FileOutputStream实例)
- Java I/O 输入输出流
- 9.1 Java输入输出流
- Java调用外部进程并拦截输入输出流--Java IDE Console解密(上篇)
- Java学习笔记(六、输入和输出流)
- Java输入输出流
- JAVA 大讲堂----Input和Output,输入输出流
- 【分享】Java输入输出流
- Java 课堂记录 04 (文件和输入输出流)
- java IO-输入输出流(一)
- Java的常用方法--输入输出流
- 浅谈Java的输入输出流
- java IO-输入输出流(四)
- Java调用外部进程并拦截输入输出流--Java IDE Console解密(下篇)
- [转帖,供参考]java 输入输出流
- 浅谈Java的输入输出流(转 原创:morgan83)
- Java输入输出流-----字节流(1)
- 浅谈java输入输出流