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);
}
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;