疯狂java学习笔记1119---转换流

转换流

        转换流用于实现将字节流转换成字符流,其中InputStreamReader将字节输入流转换成字符输入流,OutputStreamWriter将字节输出流转换成字符输出流。(JAVA没有提供将字符流转换成字节流的转换流)

通常规则:如果需要进行输入输出的内容是文本内容,则应该考虑使用字符流,如果需要进行输入输出的二进制内容,则应该考虑使用字节流
 
      Java使用System.in代表标准输入,即键盘输入,但这个标准输入流是InputStream类的实例,使用不太方便,而且键盘输入的内容都是文本内容,所以我们使用InputStreamReader将
其转换成字符输入流,普通Reader读取输入内容时依然不太方便,我们可以将普通Reader再次包装成BufferdReader,利用BufferdReader的readLine方法可以一次读取一行内容。

 程序范例:

  
  
  
  
  1. package J1114;  
  2.  
  3. import java.io.BufferedReader;  
  4. import java.io.InputStreamReader;  
  5. import java.io.IOException;  
  6.  
  7. public class KeyinTest  
  8. {  
  9.     public static void main(String[] args)   
  10.     {  
  11.         BufferedReader br = null;  
  12.         try 
  13.         {  
  14.             //将System.in对象转换成Reader对象  
  15.             InputStreamReader reader = new InputStreamReader(System.in);  
  16.             //将普通Reader包装成BufferdReader  
  17.             br = new BufferedReader(reader);  
  18.             String buffer = null;  
  19.             //采用循环方式来一行一行的读取  
  20.             while((buffer = br.readLine()) != null )  
  21.             {  
  22.                 //如果读取的字符串为“exit”,程序跳出  
  23.                 if ( buffer.equals("exit") )  
  24.                 {  
  25.                     System.exit(1);  
  26.                 }  
  27.                   
  28.                 System.out.println("输入的内容是:"+ buffer);  
  29.           
  30.             }  
  31.         }catch(IOException ioe)  
  32.         {  
  33.             ioe.printStackTrace();  
  34.         }  
  35.         finally 
  36.         {  
  37.             try 
  38.             {  
  39.                 br.close();  
  40.             }  
  41.             catch(IOException ioe)  
  42.             {  
  43.                 ioe.printStackTrace();  
  44.             }  
  45.               
  46.         }  
  47.     }  
  48. }  


上面程序中将System.in包装成BufferedReader,BufferdReader流具有一个缓冲功能,
它可以一次读取一行文本-----以换行符为标志,如果它没有读到换行符则程序阻塞,等到读到换行符为止。

 由于BufferedReader具有一个readLine方法,可以非常方便的一次读入一行内容,所以
 经常把读取文本内容的输入流包装成BufferedReader,用以方便的读取输入流的文本内容。

推回输入流

 

  
  
  
  
  1. package J1119;  
  2.  
  3. import java.io.FileReader;  
  4. import java.io.IOException;  
  5. import java.io.PushbackReader;  
  6.  
  7. public class PushbackTest   
  8. {  
  9.     public static void main(String[] args)  
  10.     {  
  11.         PushbackReader pr = null;  
  12.         try 
  13.         {  
  14.             //创建一个PushbackReader对象,指定推回缓冲区的长度为64  
  15.             pr = new PushbackReader(new FileReader("PushbackTest.java"),64);  
  16.             char[] buf = new char[32];  
  17.             //用以保存上次读取的字符串内容  
  18.             String lastContent = "";  
  19.             int hasRead = 0;  
  20.             //循环读取文件内容  
  21.             while((hasRead = pr.read(buf))>0)  
  22.             {  
  23.                 //将读取的内容转换成字符串  
  24.                 String content = new String(buf,0,hasRead);  
  25.                 int targetIndex = 0;  
  26.                 //将上次读取的字符串和本次读取的字符串拼起来,查看是否包含目标字符串  
  27.                 //如果包含目标字符串  
  28.                 if((targetIndex = (lastContent + content).indexOf("new PushbackReader"))>0)  
  29.                 {  
  30.                     //将本次内容和长次内容一起推回缓冲区  
  31.                     pr.unread((lastContent+content).toCharArray());  
  32.                     //再次读取指定长度的内容  
  33.                     pr.read(buf,0,targetIndex);  
  34.                     //打印读取内容  
  35.                     System.out.println(new String(buf,0,targetIndex));  
  36.                     System.exit(0);  
  37.                       
  38.                 }  
  39.                 else 
  40.                 {  
  41.                     //打印上次读取的内容  
  42.                     System.out.println(lastContent);  
  43.                     //将本次内容设为上次读取的内容  
  44.                     lastContent = content;  
  45.                 }  
  46.             }  
  47.         }  
  48.         catch(IOException ioe)  
  49.         {  
  50.             ioe.printStackTrace();  
  51.         }  
  52.         finally 
  53.         {  
  54.             try 
  55.             {  
  56.                 if(pr != null)  
  57.                     pr.close();  
  58.             }  
  59.             catch(IOException ioe)  
  60.             {  
  61.                 ioe.printStackTrace();  
  62.             }  
  63.         }  
  64.     }  
  65. }  

重定向标准输入/输出

    重定向标准输出

  
  
  
  
  1. package J1119;  
  2.  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.PrintStream;  
  6.  
  7. public class RedirectOut   
  8. {  
  9.     public static void main(String[] args)  
  10.     {  
  11.         PrintStream ps = null;  
  12.         try 
  13.         {  
  14.             //一次性创建PrintStream输出流  
  15.             ps = new PrintStream(new FileOutputStream("out.txt"));  
  16.             //将标准输入重定向到ps流输出流  
  17.             System.setOut(ps);  
  18.             //向标准输出输出一个字符串  
  19.             System.out.println("普通字符串");  
  20.             //向标准输出输出一个对象  
  21.             System.out.println(new RedirectOut());  
  22.         }  
  23.         catch(IOException ex)  
  24.         {  
  25.             ex.printStackTrace();  
  26.         }  
  27.         finally 
  28.         {  
  29.             if(ps != null)  
  30.             {  
  31.                 ps.close();  
  32.             }  
  33.               
  34.         }  
  35.     }  
  36. }  

     上面程序中创建了一个PrintStream输出流,并将系统的标准输出重定向到该PrintStream输出流,运行上面程序看不到任何输出----输出不再输出到屏幕,而是输出到out.txt文件。

重定向标准输入

 

  
  
  
  
  1. package J1120;  
  2.  
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.util.Scanner;  
  6.  
  7. public class RedirectIn   
  8. {  
  9.     public static void main(String[] args)  
  10.     {  
  11.         FileInputStream fis = null;  
  12.         try 
  13.         {  
  14.             fis = new FileInputStream("RedirectIn.java");  
  15.             //将标准输入重定向到fis输入流  
  16.             System.setIn(fis);  
  17.             //使用System.in创建Scanner对象,用于获取标准输入  
  18.             Scanner sc = new Scanner(System.in);  
  19.             //增加下面一行将只把回车作为分隔符  
  20.             sc.useDelimiter("\n");  
  21.             //判断是否还有下一个输入项  
  22.             while(sc.hasNext())  
  23.             {  
  24.                 //输入输出项  
  25.                 System.out.println("键盘输入的内容是:"+ sc.next());  
  26.             }  
  27.         }  
  28.         catch(IOException ex)  
  29.         {  
  30.             ex.printStackTrace();  
  31.         }  
  32.         finally 
  33.         {  
  34.             if(fis != null)  
  35.             {  
  36.                 try 
  37.                 {  
  38.                     fis.close();  
  39.                 }  
  40.                 catch(IOException ex)  
  41.                 {  
  42.                     ex.printStackTrace();  
  43.                 }  
  44.                   
  45.             }  
  46.         }  
  47.     }  
  48. }  

上面程序中创建了FileInputStream输出流,并使用System的setIn方法将系统标准输入重定向到
该文件输入流。运行上面程序,程序不会等待用户输入,而是直接输出了RedirectIn.java文件
的内容,这表明程序不再使用键盘作为标准输入,而是使用RedirectIn.java文件作为标准输入源。

你可能感兴趣的:(java)