I/O流的典型使用方法
2009-10-10 09:47
344 查看
1.输入缓冲文件
可以使用以String或FIle对象作为文件名的FileReader。为了提高速度,我们将产生的引用传递给BufferedReader构造器用于文件缓冲,由于BufferedReader也提供readline()方法,所以它将是最终文件读取的接口。
2.从内存输入
下面的示例,从BufferedInputFile.read()读入的String结果被用来创建一个StringReader。然后调用read()每次读取一个字符,并把它发送到控制台。
注意read()是以int形式返回下一个字节,因此必须类型转换为char才能正确打印。
3.格式化的内存输入
DataInputStream是一个面向字节的I/O类,因此我们必须使用InputStream而不是Reader类。当然我们可以用InputStream以字节形式读取文件,但是这里读取字符串。
必须为ByteArrayInputStream提供字节数组,为了产生该数组,String提供了一个可以实现此项工作的getBytes()方法。
如果我们从DataInputStream用readByte()一次一个字节地读取字符,那么任何字符的值都是合法的结果,因此返回值不能用来检测输入是否结束,相反,我们可以使用available()方法查看还有多少可供读取的字符。
注意。available()的工作方式会随着所读取的媒介类型的不同而有所不同;字面意思就是“在没有阻塞的情况下能读取的字节数”。对于文件,这个就意味着整个文件。但是对于不同类型的流,可能就不是这样,因此需要谨慎使用。
我们也可以通过捕获异常的方式检测输入的末尾。但是,使用异常进行流控制,被认为是对异常特性的错误使用。
4.基本的文件输出
FileWriter的对象可以向文件写入数据。首先,创建一个与指定文件连接的FileWriter。实际上,我们通常会用BufferedWriter将其包装起来用以缓冲输出(尝试移除此包装来感受对性能的影响——缓冲往往能显著地增加I/O操作的性能)。在本例中,为了提供格式化机制,它被装饰成了PrintWriter。
PrintWriter提供了辅助构造器,使得可以简写装饰工作
遗憾的是,其他常见的写入任务没有快捷方式,因此典型的I/O仍旧包含大量的冗余文本。
5.从标准输入中读取
按照标准I/O模型,Java提供了System.in、System.out、System.err。其中后两个已被包装成PrintStream对象,而前者未经处理的InputStream。这意味着在读取System.in之前必须对其进行包装。
通常我们会用readLine()一次一行地读取输入,因此,我们将System.in包装成BufferedReader来使用。这要求我们必须用InputStreamReader把System.in转换成Reader。
回车和ctrl-z都能停止循环。
可以使用以String或FIle对象作为文件名的FileReader。为了提高速度,我们将产生的引用传递给BufferedReader构造器用于文件缓冲,由于BufferedReader也提供readline()方法,所以它将是最终文件读取的接口。
public class BufferedInputFile { public static String read(String filename)throws Exception{ BufferedReader br = new BufferedReader(new FileReader(filename)); StringBuilder sb = new StringBuilder(); String s; //调用一次readline()就会向下读一行 while((s=br.readLine())!=null){ sb.append(s+"/n"); } br.close(); return sb.toString(); } public static void main(String[] args) throws Exception { System.out.println(read("E://aaa.txt")); } }
2.从内存输入
下面的示例,从BufferedInputFile.read()读入的String结果被用来创建一个StringReader。然后调用read()每次读取一个字符,并把它发送到控制台。
注意read()是以int形式返回下一个字节,因此必须类型转换为char才能正确打印。
public class MemoryInput { public static void main(String[] args) throws Exception { StringReader sr = new StringReader(BufferedInputFile.read("E://aaa.txt")); int c; while((c=sr.read())!=-1){ System.out.print((char)c); } } }
3.格式化的内存输入
DataInputStream是一个面向字节的I/O类,因此我们必须使用InputStream而不是Reader类。当然我们可以用InputStream以字节形式读取文件,但是这里读取字符串。
必须为ByteArrayInputStream提供字节数组,为了产生该数组,String提供了一个可以实现此项工作的getBytes()方法。
public class FormattedMemoryInput { public static void main(String[] args) throws Exception { try{ DataInputStream dis = new DataInputStream(new ByteArrayInputStream(BufferedInputFile.read("E://aaa.txt").getBytes())); while(true){ System.out.print((char)dis.readByte()); } }catch(EOFException e){ System.err.println("End"); } } }
如果我们从DataInputStream用readByte()一次一个字节地读取字符,那么任何字符的值都是合法的结果,因此返回值不能用来检测输入是否结束,相反,我们可以使用available()方法查看还有多少可供读取的字符。
注意。available()的工作方式会随着所读取的媒介类型的不同而有所不同;字面意思就是“在没有阻塞的情况下能读取的字节数”。对于文件,这个就意味着整个文件。但是对于不同类型的流,可能就不是这样,因此需要谨慎使用。
我们也可以通过捕获异常的方式检测输入的末尾。但是,使用异常进行流控制,被认为是对异常特性的错误使用。
public class TestEOF { public static void main(String[] args) throws Exception { DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("E://aaa.txt"))); while(dis.available()!=0){ System.out.print((char)dis.readByte()); } } }
4.基本的文件输出
FileWriter的对象可以向文件写入数据。首先,创建一个与指定文件连接的FileWriter。实际上,我们通常会用BufferedWriter将其包装起来用以缓冲输出(尝试移除此包装来感受对性能的影响——缓冲往往能显著地增加I/O操作的性能)。在本例中,为了提供格式化机制,它被装饰成了PrintWriter。
public class BasicFileOutput { static String fileOut="E://bbb.txt"; static String filein="E://aaa.txt"; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new StringReader(BufferedInputFile.read(filein))); PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileOut))); String s; int linecount=1; while((s=br.readLine())!=null){ out.println(linecount++ +":"+ s); } out.close(); System.out.println(BufferedInputFile.read(fileOut)); } }
PrintWriter提供了辅助构造器,使得可以简写装饰工作
//PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileOut))); PrintWriter out = new PrintWriter(fileOut);
遗憾的是,其他常见的写入任务没有快捷方式,因此典型的I/O仍旧包含大量的冗余文本。
5.从标准输入中读取
按照标准I/O模型,Java提供了System.in、System.out、System.err。其中后两个已被包装成PrintStream对象,而前者未经处理的InputStream。这意味着在读取System.in之前必须对其进行包装。
通常我们会用readLine()一次一行地读取输入,因此,我们将System.in包装成BufferedReader来使用。这要求我们必须用InputStreamReader把System.in转换成Reader。
public class SystemInReader { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s; while((s=br.readLine())!=null&&s.length()!=0){ System.out.println(s); } } }
回车和ctrl-z都能停止循环。
相关文章推荐
- dataset 典型错误使用方法
- initWithFireDate 方法参数说明。典型的selector 与 id userinfo 使用示例
- iphone 开发中使用zbar时遇到的几个典型问题解决方法。
- java常用类解析四:I/O流典型使用方式
- Java I/O系统----------- I/O流的典型使用方式
- window dos 命令使用方法 和典型例子
- iphone 开发中使用zbar时遇到的几个典型问题解决方法。
- java常用类解析四:I/O流典型使用方式
- Java:使用I/O流操作将一个图片复制到另一个文件夹下后打不开的解决方法
- IO篇二( IO典型的使用方法 thinking in java 4th 阅读笔记)
- Qt中进度条 和进度对话框的典型使用方法
- iphone 开发中使用zbar时遇到的几个典型问题解决方法。
- iphone 开发中使用zbar时遇到的几个典型问题解决方法。
- Qt中进度条 和进度对话框的典型使用方法
- java常用类解析四:I/O流典型使用方式
- js一个典型的对象写法,推荐使用这种格式,用于处理图像的基本方法、
- pthread_cond_signal()和pthread_cond_wait()的典型使用方法
- 全屏文本编辑器vi/vim基本使用方法
- STL vector使用方法介绍
- SmartUpload在servlet中使用方法