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 具体的方法:
void | close() 关闭该流。 |
void | mark(int readAheadLimit) 标记流中的当前位置。 |
boolean | markSupported() 判断此流是否支持 mark() 操作(它一定支持)。 |
int | read() 读取单个字符。 |
int | read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。 |
String | readLine() 读取一个文本行。 |
boolean | ready() 判断此流是否已准备好被读取。 |
void | reset() 将流重置为最新的标记。 |
long | skip(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;