java io

来源:互联网 发布:最佳情侣网络歌曲 编辑:程序博客网 时间:2024/06/15 08:21

       第一次写博客,可能写的逻辑不能那么符合大家阅读的习惯,不过我也会慢慢地改善自己的表达逻辑争取给大家提供更好的博文,供大家参考,也供自己日后阅读。如果内容有误,大家千万要帮助博主来改正,为以后借鉴的人铺好道路(当然也来弥补我的知识盲点大笑),布局很丑,但是争取内容弥补(后期会注意布局的)

       作为java中输入输出流的祖师级接口,这儿两个接口规定了从数据源读取和向数据目的地的两个操作,在旗下有各种丰富多彩的实现类,如我们常用的FileInputStream,FileOutputStream,ByteArrayOutputStream,ByteArrayInputStream,InputStreamReader,OutputStreamWriter,咦,为什么这里把reader和writer提了出来,他们不是针对字符的吗?敏感的人可能有感觉了,哇,原来所谓的reader和writer都是在stream的基础上的来的啊!事实上正是如此,只不过我们在运用中希望方便一些,于是相关的reader和writer就出来了。

      好了,进入正题,为了弄懂这些流的实现类的作用,首先我们应该清楚他们针对的对象,这个一般不用说,字面意思就可以理解哪些是针对字节流,哪些是针对字符流;其实我们主要是应该知道他们都用在什么地方。像是文件(FileInputStream,FileOutputStream),内存(ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter),管道(PipedInputStream,PipedOutputStream进程间通信),对象(ObjectInputStream,ObjectOutputStream前提对象得序列化),其实还有一些其他的但是平常很少用自己理解不深入没写,以后补上。

      上面给出了几类输入输出流,接下来就我自己在学习中遇到的困惑讲解(当然博主没有讲到优化写法以后会补上的,现在就先不求甚解吧):

       首先是针对文件的,文件无外乎读写两个操作,对于读,我们常使用FileInputStream,首先你的给出数据源吧,然后你要有个地方存放读出的数据吧,那么就可以按照下面方式使用        File file=new File("s.txt");//假设已经存在      FileInputSream is=new FileInputStream(file);  int p; while(p=is.read()!=-1){  System.out.println(p);}//如果文件有中文会出现乱码,是因为字节流是一个字节一个字节读,而且我们在这里的操作是一个字节一个字节的写,而平台自带的是unicode编码是2个字节对应一个字符,所以会出现乱码
当然,我们可以用byte[] a=new byte[20]; is.read(a);这样的操作先存一些再写到文件中(注意编码设置)就不会出现乱码了。大概这里会有人有点疑问,这个不是缓冲流不也是可以搞个缓冲数组a吗?那么我们用BufferInputStream还干什么?这个其实是因为虽然我们看起来好像是将流的数据一次得到20byte才会进行其他操作,但是因为is.read(a);在读的时候仍然是一个一个字解读,在到达末尾的时候才会return-1;而在流资源使用完之前会一直进行此操作,这就会导致io处理耗时,和我们要得缓冲所达到的目的不一致,所以我们不认为这是一种缓冲,相反,我们需要采用BufferInputStream
buffer=new BufferInputStream(is);将FileInputStream封装一下就可以达到我们要的缓冲效果(怎么又跑偏了!)。

       下面来针对一下内存,,,现在我们来对ByteArrayInputStream来说一下,首先你应该明白它是针对内存内的一块区域,一般是你从其他地方得到你需要一个InputStream(可以来源于文件,网络,假设其存在且为is)那么可以像下面这样使用:

byte[] buffer=new byte[1024];  ByteArrayOutputStream bout=new ByteArrayOutputStream(buffer);  (这个buffer可以是通过类似ByteArrayInputStream.read(buffer);的方式得来)byte[] result=new byte[1024];  while(bout.read(result)!=-1){  做一些对buffer的操作,还是一点如果有中文注意编码;}其实大家看到这,也应该有点感觉是不是使用都差不多,new的时候把数据源作为参数,读的时候,把存放读的内容的byte也好,string也好作为参数,输出流其实一样,new的时候数据目的地作为参数,write的时候把内存的一块区域的内容(就像我们上面写的buffer,a都是这样的一片区域)作为参数。那么CharArrayReader,CharArrayWriter不用说了吧,一样,你要做的是知道他们所用的地方,像内存,还是外存。所以,此时的ByteArrayInputStream针对内存而言是进来的操作,可以在内存中创建一个上面类似的数组来承载其读出的结果,ByteArrayOutputStream则是将内存中的内容输出的操作。我写的这个使用过程可能并没有网上其他人写的详细,但是把自己的理解写了出来,希望新手能有所借鉴

     

    

原创粉丝点击