黑马程序员——JAVA(IO 2)

来源:互联网 发布:淘宝说防举报的可信吗 编辑:程序博客网 时间:2024/05/01 15:02

                   -------android培训、java培训、期待与您交流! ----------

()字节-字符转换流

      1.      OutputStreamWrite:Writer的子类,将输出的字符流变为字节流,就是讲一个字符流的输出对象变为字节流的输出对象

      2.      InputStreamReader:Reader的子类,将输入的字节流变为字符流,就是将一个字节的输入对象变为字符流的输入对象

      3.      FileOutputStreamOutputStream的直接子类,FileInputStream也是InputStream的直接子类,但是在字符流文件的两个操作类却又有些特殊,FileWriter并不是Writer的子类,OutputStreamWriter的直接子类FileReader也不是Reader的直接子类,而是IputStreamReader的直接子类,不难看出,不管是使用字节流还是字符流实际上最终都是以字节的形式操作输入输出的。

(二)内存操作流

         ByteArrayInputStream:主要完成奖内容写入到内存之中;

              数据——>ByteArrayInputStream】——>内存

                构造方法:ByteArrayInputStream(byte[ ] buf)将数据传入到内存

        ByteArrayOutputStream:主要是将内存中的数据输出

            数据<——【ByteArrayOutputStream<——内存

                  void write(int b)利用它从内存中写出数据

(三)管道流(PipedOutputStream,PipedInputStream)

       管道流的主要作用是可以进行两个线程的通讯,分为管道输出流和管道输入流,如果要想进行管道输出,则必须把输出流连在输入流之上,在PipedOutputStream类上有public void connect(PipedInputStream snk)的一个方法用于连接管道

           例子:import java.io.* ;
                      class Send implements Runnable{   // 线程类
                      private PipedOutputStream pos = null ; // 管道输出流
                      public Send(){
                                this.pos = new PipedOutputStream() ; // 实例化输出流
                       }
                      public void run(){
  
                                String str = "Hello World!!!" ; // 要输出的内容
                            try{
                                 this.pos.write(str.getBytes()) ;
                              }catch(IOException e){
                                e.printStackTrace() ;
                        }
                           try{
                                this.pos.close() ;
                          }catch(IOException e){
                                e.printStackTrace() ;
                            }
                      }
                   public PipedOutputStream getPos(){ // 得到此线程的管道输出流
                       return this.pos ; 
                        }
                    };
              class Receive implements Runnable{
                        private PipedInputStream pis = null ; // 管道输入流
                       public Receive(){
                                 this.pis = new PipedInputStream() ; // 实例化输入流
                        }
                     public void run(){
  
                           byte b[] = new byte[1024] ; // 接收内容
                          int len = 0 ;
                         try{
                                len = this.pis.read(b) ; // 读取内容
                            }catch(IOException e){
                                         e.printStackTrace() ;
                           }
                          try{
                                 this.pis.close() ; // 关闭
                          }catch(IOException e){
                                       e.printStackTrace() ;
                          }
                         System.out.println("接收的内容为:" + new String(b,0,len)) ;
                       }
             public PipedInputStream getPis(){
                   return this.pis ;
              }
  };
public class PipedDemo{
            public static void main(String args[]){
                     Send s = new Send() ;
                    Receive r = new Receive() ;
                  try{
                         s.getPos().connect(r.getPis()) ; // 连接管道
                   }catch(IOException e){
                        e.printStackTrace() ;
                   }
                new Thread(s).start() ; // 启动线程
               new Thread(r).start() ; // 启动线程
            }
};

(四)打印流

               在整个IO包中,打印流是输出信息罪方便的类,主要包含字节打印流(PrintStream)和字符打印流(PrintWriter)。打印流提供了非常方便的打印功能.可打印任何数据类型.

        1.       PrintStream类的常用方法

                 public PrintStream(File file)         通过一个File对象实例化PrintStream

                public PrintStream(OutputStream out)接收OutputStream对象,实例化PrintStream

               print(boolean b)          输出任意数据

                printlnboolean b       输出任意数据后换行

              PrintStream(OutputStream out)>指定输出的位置

      2.       打印流的好处

            在PrintStream中定义的构造方法中可以清楚的发现有一个构造方法可以直接接收OutputStream类的实例,这是因为与OutputStram相比起来,PrintStream可以更加方便的输出数据,这就好比将OutputStream类重新包装一下,使之输出更加方便。

也就是说,实际上是将FileOutputStream类的功能包装一下,这样的设计在JAVA中称为装饰设计。

(五)System类对IO的支持

        SystemIO的三种支持:

        System.out       对应系统标准输出,一般是显示器

        System.err       错误信息输出

        System.in         对应标准输入,一般是键盘

    1.       System.out

         System.out输出的时候就是讲输出的位置定义字了显示器之中,FileOutputStream是定义在文件里,而System.out是定义在屏幕上。可使用OutputStream完成屏幕上输 出,PrintStream就是OutputStream的子类,“OutputStream out=System.out”;根据对象多态完成。

   2.       System.err

        System.err表示的是错误的标准输出,如果程序中出现错误的话,则直接使用System.err进行打印输出即可。“System.err.println()”

但是System.outSystem.err都是PrintStream的实例化对象,而且两种都可以输出错误信息。他们有什么区别呢?前者是希望用户看到的,而后者是不希望用户看到的,在后台直接打印。这值能从其概念上划分。

    3.       System.in

           System.in实际上是一个键盘的输入流,其本身是InputStream类型的对象。那么,此时就是可以利用此方法完成从键盘读取数据的功能。InputStram对应的是输入流,可用InputStream  input=System.in。然后使用input.read(b)byte行的b输出。

但是这样有长度限制,和如果输入的是汉字则会乱码(因为每次都是单个字节读取)

可以使用缓冲流“BufferedReader

4.输入、输出重定向

    SetOutPrintStream out  重定向输出流

    SetErrPrintStream out 冲顶向错误输出流

    setIntInputStream in  重定向“标准”输入流

            System.out重定向“System.setOut(new PrintStream(new FileOutputStream(file)))”此时“System.out.print()”所输出的内容将不会出现在屏幕上,而在file这个文件里。

           若有时希望把程序的错误信息,输出到文件里,则可“System.setErr((new PrintStream(new FileOutputStream(file)));

                System.setIn(new FileInputStream(file)),从文件读取

(六)BufferedReader

            缓冲区的内容可以提高效率。如果想要接收任意长度的数据,而且避免乱码产生,就可以使用BufferedReader。因为输入的内容有可能出现中文,所以,此处使用字符流完成。

          BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中。

            BufferedReader(Reader in)          接收一个Reader类的实例

          String readLine()                一次性从缓冲区中将内容全部读取进来

           BufferedReader br=new BufferedReader(InputStreamReader(Sytem.in)) 从键盘读取数据

  ------- android培训、java培训、期待与您交流! ----------

原创粉丝点击