Java之BufferedReader

来源:互联网 发布:蓝牙电话软件 编辑:程序博客网 时间:2024/06/06 09:19

1 接收键盘输入:

 

BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));

String password =”“;

try{

password = buf.readLine();

}catch(IOException e)

{

System.out.println(e);

System.exit(0);

}

 

 

类 BufferedReader

java.lang.Object
继承者 java.io.Reader
继承者 java.io.BufferedReader
具体的方法:
 voidclose()
          关闭该流。 voidmark(int readAheadLimit)
          标记流中的当前位置。 booleanmarkSupported()
          判断此流是否支持 mark() 操作(它一定支持)。 intread()
          读取单个字符。 intread(char[] cbuf, int off, int len)
          将字符读入数组的某一部分。 StringreadLine()
          读取一个文本行。 booleanready()
          判断此流是否已准备好被读取。 voidreset()
          将流重置为最新的标记。 longskip(long n)
          跳过字符。
http://www.gznc.edu.cn/yxsz/jjglxy/book/Java_api/java/io/BufferedReader.html


InputStreamReader是InputStream和Reader之间的桥梁,由于System.in是字节流,需要用它来包装之后变为字符流供给BufferedReader使用


Java.io.BufferedReader与java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出至目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。例如一个文件,通过缓冲区可减少对硬盘的输入/输出动作,以提高文件存取的效率。

之前在介绍取得用户输入时,就使用过BufferedReader。从标准输入流System.in中直接读取用户输入时,用户每输入一个字符,System.in就读取一个字符。为了能一次读取一行用户的输入,使用了BufferedReader来对用户输入的字符进行缓冲。readLine()方法会在读取到用户的换行字符时,再一次将整行字符串传入。

System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能。例如:

BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));

范例14.19示范了BufferedReader与BufferedWriter的使用。可以在文字模式下输入字符,程序会将输入的文字存储至指定的文件中,如果要结束程序,输入quit字符串即可。

范例14.19  BufferedReaderWriterDemo.java

package onlyfun.caterpillar;
import java.io.*;
public class BufferedReaderWriterDemo {
public static void main(String[] args) {
try {
// 缓冲System.in输入流
BufferedReader bufReader =
new BufferedReader(
new InputStreamReader(System.in));
// 缓冲FileWriter字符输出流
BufferedWriter bufWriter =
new BufferedWriter(new FileWriter(args[0]));
            String input = null;
            // 每读一行进行一次写入动作
while(!(input =
bufReader.readLine()).equals("quit")) {
bufWriter.write(keyin);
// newLine()方法写入与操作系统相依的换行字符
bufWriter.newLine();
}
            bufReader.close();
bufWriter.close();
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("没有指定文件");
}
catch(IOException e) {
e.printStackTrace();
}
}
}

由于换行字符依操作系统不同而有所区别,在Windows下是/r/n,在Linux下是/n,在Mac OS下是/r,您可以使用newLine()方法,由执行环境依当时的操作系统决定该输出哪一种换行字符

 

 

 

常用转换

FileReader——>BufferedReader
BufferedReader in= new BufferedReader(new FileReader(“Text.java”));
InputStream——>InputStreamReader——>BufferedReader
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String——>byte[]——>ByteArrayInputStream——>DataInputStream
DataInputStream in= new DataInputStream(new ByteArrayInputStream(str.getBytes()));
FileInputStream——>BufferedInputStream——>DataInputStream
DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream(“Data.txt”)));
FileWriter——>BufferedWriter——>PrintWriter
PrintWriter pw=new PrintWriter(new BufferedWriter(“text.out”));
System.out(PrintStream)——>PrintWriter
PrintWriter pw=new PrintWriter(System.out,true);
FileOutputStream——>BufferedOutputStream——>PrintStream
PrintStream ps= new PrintStream(new BufferedOutputStream(new FileOutputStream(“text.out”)));
FileOutputStream——>BufferedOutputStream——>DataOutputStream
DataOutputStream dos= new DataOutputStream(new BufferedOutputStream(new FileOutputStream(“Data.txt”)));


程序举例

import java.io.*;
public class IoStreamDemo {
  public static void main(String[] args) throws IOException {
1.要想打开文件读取字符,你得先用String或File对象创建一个FileReader。
   为了提高速度,你应该对这个文件作缓冲,因此你得把FileReader的reference 交给BufferedReader。
   BufferedReader提供了readLine()方法,当你读到文件的末尾时readLine()会返回一个null,于是就退出while()循环了。
   String sb是用来累加文件内容的,(再加一个换行符“/n”因为readLine()会把它们都剥掉).
   最后用close()来清空缓冲区。
    BufferedReader in = new BufferedReader(new FileReader(“IOStreamDemo.java”));
    String s,s2= new String();
       StringBuffer sb = new StringBuffer();
    while((s = in.readLine())!= null)
   { sb.append(s);
        sb.append(“/n”);
       }
    in.close();
s2=sb.toString();
   2. 用System.in生成一个能读取控制台输入的流。System.in是一个InputStream,
       而BufferedReader需要一个Reader作参数,所以要先通过InputStreamReader来转转手。
       Java遵循标准I/O的模型,提供了Syetem.in,System.out,以及System.err。
       System.out是一个已经预先处理过的,被包装成PrintStream的对象。
       System.err也是一个PrintStream;
       System.in是一个未经处理的InputStream。
       也就是说,虽然你可以直接往System.out和System.err上写,但是要想读System.in的话,就必须先做处理了。
    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    System.out.print(“Enter a line:”);
    System.out.println(stdin.readLine());
    3. 用String s2作参数创建一个StringReader。然后用StringReader的read()方法把字符读出来,再送到控制台上去。read()会把读出来的byte当作int,所以要想正常打印的话,你得先把它们转成char。
    StringReader in2 = new StringReader(s2);
    int c;
    while((c = in2.read()) != -1)
      System.out.print((char)c);
    4. 要想读取”格式化”的数据,你就得用DataInputStream了,DataInputStream是一个面向byte的I/O类,不是面向char的。因此你只能从头到底一直用InputStream了。当然你可以把所有的东西都当成byte。然后用InputStream读出来。但这里是String。要想把String当成byte数组。可以用String的getBytes()方法。而ByteArrayInputStream是可以处理byte数组的。
try {
        DataInputStream in3 = new DataInputStream(
        new ByteArrayInputStream(s2.getBytes()));
      while(true)
        System.out.print((char)in3.readByte());
    } catch(EOFException e) {
      System.err.println(“End of stream”);
    }


String和char之间的转换:
String转为char 数组
char chr[]= c.toCharArray();
char转换为String:
String( chr);

或者 String str = String.valueOf(c); c为char;

0 0