您的位置:首页 > 其它

I/O流的典型使用方法

2009-10-10 09:47 344 查看
1.输入缓冲文件
可以使用以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都能停止循环。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: