JavaSE中IO相关

IO相关操作类之间的联系

      • IO学习心得
      • 一些常见的流之间的关系
      • 封装多态性在IO中的体现

IO学习心得

初学者来说,可能在学SE时对IO不是那么关注,确实在第一次学的时候我也是对IO这一块忽略了,初次学习平常写代码练习对IO用的基本很少,第二次学习感受就是在SE中集合是java中对数据结构的充分体现,而IO体现出了java面向对象的封装

一些常见的流之间的关系

字节流
1.超类 InputStream OutputStream
2.子实现类 FileInputStream FileOutputStream
3.缓冲子类 BufferedInputStream BufferedOutputStream
字符流
1.子实现类 InputStreamReader OutputStreamWriter
2.便捷类 FileReader FileWriter
3.缓冲子类 BufferedReader BufferedWriter
先说字节流
1到3依次继承或实现关系,如果对文件类型不是太明确可选择字节流,根据读取和写入速率一般选择第三种,并且因为3直接或间接的继承了上面的接口和类,也可以用上面的类方法
而第一种一般以多态的形式作为形参类型,在一些字节流向字符流转换的时候会见到,并且它们也作为读写最基本的流,下面所有的流底层也都是用的字节流来传输,所有在TCP,UDP网络传输中,也是作为形参或返回值的类型来出现的,正常不会直接用
而第二种一般也不会直接用到,以第一种多态形式作为参数类型时,他们经常作为实参来创建其他流的实例对象
再说字符流
如果需要操作的文件为文字或字母符号类型且明确的情况下,一般选择此种流,相对来说他们操作还是比较方便的
第一种作为字节流向字符流的转换来出现,也可称为转换流,而一般在创建别的实例对象使用起来这个会比较麻烦,还需要创建文件对象,所有引申出来第二种,可以更加方便来操作,(如果需要牵扯到编码和解码操作,还需要用第一种)
上面这些常见的方法的操作基本类似,拿一个代码来说明

public class demo5 {
    public static void main(String[] args) {
        FileInputStream read=null;
        FileOutputStream writer=null;
        try {
            read = new FileInputStream("C:\\Users\\Administrator\\Desktop\\测试图片\\1.jpg");
            writer=new FileOutputStream("code01\\1.jpg");
            //如果需要一次读取和写入一个字节
//            int by;
//            while ((by=read.read())!=-1){
//                writer.write(by);
//            }
            byte[] bytes=new byte[1024];
            int len;
            while ((len=read.read(bytes))!=-1){
                writer.write(bytes,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(read!=null){
                try {
                    read.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(writer!=null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

其他流读取写入操作基本与这个类似,具体可以查看文档
而有个特殊的字符缓冲流比较特殊,拿一个代码举例

public class demo3 {
    public static void main(String[] args) {
        try  {
            BufferedReader read = new BufferedReader(new FileReader("E:\\code01\\demo2.java"));
            PrintWriter writer=new PrintWriter(new FileWriter("code01\\copy.java"),true);
            String string;
            while ((string=read.readLine())!=null){
                writer.println(string);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

这俩个流可以读取一行,写入换行和刷新流操作,具体查看文档即可
还有一些不经常遇到的System中标准输入输出流,PrintStream打印流,我们经常用到的键盘录入和打印输出也是基于这俩个流来实现的,基本用法也和上面的没太大差别
另外还有一个比较重要的对象序列化和反序列化流,可以用来将对象写入文本

封装多态性在IO中的体现

上文提到的IO对于封装性的体现查看TCP传输相关的类结合本文可以看到很多时候比如创建连接时候的Socket类中的
public OutputStream getOutputStream() 类很多与这个类似都会返回最基本的字节流而需要使用字节流和缓冲流方便的操作,便需要将基本字节流封装为缓冲流等,与此类的方法的思想类似的在IO和网络传输就已经非常多

你可能感兴趣的:(JavaSE中IO相关)