System类的支持和缓冲流
System类对IO的支持
-
在System类中,为了支持IO操做提供了三个常量:java
- 错误输出:
public static final PrintStream err;
- 输出到标准输出设备(显示器)
public static final PrintStream out;
- 从标准输入(键盘)设备输入
public static final InputStream in;
错误输出
System.err 是 PrintStream 类对象,此对象专门负责进行错误信息的输出操做数组
- 几乎无用!
system.err 和 System.out 的功能是彻底同样的;之因此设计 System.err 主要目的就是 err 能够输出用户看不见的错误,而 System.out 输出用户可见的信息。app
信息输出
System.out 是在Java中专门支持屏幕输出信息的操做对象(对象由系统赋值实例化)spa
public class TestDemo { public static void main(String [] args) throws IOException { OutputStream out = System.out; out.write("Hello,World!".getBytes()); } }
上述程序:经过System.out实例对象,OutputStream out 转为了向屏幕输出设计
系统输入
System.in:键盘输入操做。Java并无直接提供键盘输入功能;而System类中提供了 in 对象,此对象类型是 IntputStreamcode
public class TestDemo { public static void main(String [] args) throws IOException { InputStream in = System.in ; // System.in对象是系统实例化, byte [] data = new byte[1024]; int len = in.read(data); // 输入数据 System.out.println(new String(data,0,len)); } }
public class TestDemo { public static void main(String [] args) throws IOException { //InputStream in = System.in ; // System.in对象是系统实例化, byte [] data = new byte[1024]; int len = System.in.read(data); // 输入数据 System.out.println(new String(data,0,len)); } }
System.out 和 System.in 都是系统实例化的对象,在程序中均是向上转型。对象
在系统输入中,利用byte数组接收输入数据,可是数组有长度限制,用户一旦不可控的输入过长的数据该如何?get
- 解决方法
经过接收单字符并不断追加的方式能够避免长度限制自由的输入数据it
public class TestDemo { public static void main(String [] args) throws IOException { StringBuffer buf = new StringBuffer(); int temp = 0 ; while ((temp = System.in.read()) != -1) { // \n 换行也属于Char字符 if ( temp == '\n') { break; } buf.append((char)temp); } System.out.println(buf); } }
如上,咱们利用StringBuffer类对象 buf ,不断追加Char型字符;由此达到不受长度限制任意接收输入的字符。io
- 问题提出:
按照上述的方法,如果输入的数据为 中文 内容,则可能会致使乱码现象。
缘由:
中文汉字,每一个汉字占用两个字节,而一个英文字符占用一个字节。
而咱们的方法中,是按照单个字节进行读取的,由此致使乱码。
缓冲流
- 解决中文字符输入带来的诸多问题
处理中文输入的问题,因为中文单字符占两个字节,由此咱们首先想到的是利用字符流处理中文数据。
缓冲操做流
字符缓冲区流:
- <u>BufferedReader:字符缓冲输入流</u>
- BufferedWriter:字符缓冲输出流
字节缓冲区流:
- BufferedInputStream:字节缓冲输入流
- BufferedOutputStream:字节缓冲输出流
字符缓冲输入流
BufferedReader构造
public BufferedReader(Reader in);
读取一行数据
public String readLine() thows IOException;
如果利用BufferedReader类来处理System.in操做,是不可直接的;由于System.in是InputStream的类型。
- InputStream 和 Reader 类之间的转换
引用:InputStreamReader类
public class TestDemo { public static void main(String [] args) throws IOException { // System.in 是InputStream的类对象 // BufferedReader的构造方法接收的是Reader类对象 // 利用InputStreamReader将字节流变为字符流 BufferedReader buf = new BufferedReader (new InputStreamReader(System.in)); // 调用readLine()方法接收一行数据,以String数据返回,而且以 \n 做为分隔 String str = buf.readLine(); System.out.println(str); } }
BufferedReader类构造接收的数据是 Reader字符流对象;
利用InputStreamReader类将字节流类对象的Systen.in转为字符流的类对象Reader。
文件读取
BufferedReader缓冲输入流不单单能够能够从键盘中得到,也能够从文件中得到
public class TestDemo { public static void main(String [] args) throws IOException { File file = new File("F:" + File.separator + "demo" + File.separator + "demo.txt"); if (!file.exists()) { file.mkdirs(); } BufferedReader buf = new BufferedReader // FileReader():实例的为字符流数据,而BufferedReader接收Reader字符流 (new FileReader(file)); String str = null; while ((str = buf.readLine()) != null) { System.out.println(str); } buf.close(); } }