我理解的java流基础篇(一)

来源:互联网 发布:腾讯云已备案域名出售 编辑:程序博客网 时间:2024/05/24 08:33

在我的认识中,Java流就是用来读写文件的。说它是流不如说他是管来得更准确一点,是从源文件通向目标文件的一个管通道。微笑

一、从不同的角度区分流:

输入/输出

字节流

字符流

输入流

Inputstream

Reader

输出流

OutputStream

Writer

二、流之间的继承关系:

       字节流:

                                                          

                                                                             输入流    


                                                    

                                                                           输出流

       字符流:

                                            

                                                                            输入流 

                                           

                                                                            输出流

ps:若需记忆,按字节输入输出流,字符输入输出流的子类个数7567

三、就这几种流的用处,做一个简单的辨别:

Java输入/输出流体系中常用的流分类(表内容来自java疯狂讲义)

注:下表中带下划线的是抽象类,不能创建对象。粗体部分是节点流,其他就是常用的处理流。

流分类使用分类字节输入流字节输出流字符输入流字符输出流 抽象基类InputStream

OutputStream

ReaderWriter节点流访问文件FileInputStreamFileOutStreamFileReaderFileWriter访问数值ByteArrayInputStreamByteArrayOutStreamCharArrayReaderCharArrayWriter访问管道PipedInputStreamPipedOutStreamPipedReaderPipedWriter访问字符串  StringReaderStringWriter处理流缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter转换流  InputStreamReaderOutputStreamWriter对象流ObjectInputStreamObjectOutputStream  抽象基类(过滤)FilterInputStreamFilterOutputStreamFilterReaderFilterWriter打印流 PrintStream PrintWriter推回输入流PushbackInputStream PushbackReader 特殊流DataInputStreamDataOutputStream  

 

 

 

 

 

 

 

 

 

 




总结:

1.Java IO是采用的是装饰模式,即采用处理流来包装节点流的方式,来达到代码通用性。

2.处理流和节点流的区分方法,节点流在新建时需要一个数据源(文件、网络)作为参数,而处理流需要一个节点流作为参数,就是说节点流是操作文件的,处理流是操作节点流的。

3.处理流的作用就是提高代码通用性,编写代码的便捷性,提高性能。

4.节点流都是对应抽象基类的实现类,它们都实现了抽象基类的基础读写方法。

四、流常用的几种方法:

InputStream为字节输入流,本身是个抽象类,必须依靠其子类实现各种功能,数据单位位字节(8bit)。常用方法有:

        (1) public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。若返回值=-1说明没有读取到任何字节读取工作结束。
   (2) public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的 
   (3) public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。 
   (4) public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用, 
   (5) public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取 
   (6) public int close( ) :我们在使用完后,必须对我们打开的流进行关闭. 


         OutputStream为字节输出流,常用方法有:

    (1) public void write(byte b[ ]):将参数b中的字节写到输出流。 
  (2) public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。 
  (3) public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。 
  (4) public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。 
  (5) public void close( ) : 关闭输出流并释放与流相关的系统资源。


          Reader为字符输入流,常用方法有:

        (1)  public int read() throws IOException: 读取一个字符,返回值为读取的字符 

   (2)  public int read(char cbuf[]) throws IOException:读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量
   (3)  public abstract int read(char cbuf[],int off,int len) throws IOException:读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现。


          Writer为字符输出流,常用法有:

        (1) public void write(int c) throws IOException:将整型值c的低16位写入输出流 
   (2) public void write(char cbuf[]) throws IOException:将字符数组cbuf[]写入输出流 
   (3) public abstract void write(char cbuf[],int off,int len) throws IOException:将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流 
   (4) public void write(String str) throws IOException:将字符串str中的字符写入输出流 
   (5) public void write(String str,int off,int len) throws IOException:将字符串str 中从索引off开始处的len个字符写入输出流 
   (6) flush( ) :刷空输出流,并输出所有被缓存的字节。 
   (7) close()  :关闭流 


ps:几种流对应的方法大同小异,做对比加深记忆