关于流的知识点总结

之前把流的知识点只做了一个大概的总结,对一些知识点还没有总结到位,今天把之前的做一些补充以及对新的知识点总结梳理!

File知识补充

其中用于封装文件或哦这目录,提供了一些获取相关属性的方法。

例:mkdirs()用于创建文件夹

File file=new File("out");
if(!file.exists()){
    file.mkdirs();
}

流模型

流是用于隐藏数据传输细节的操作模型,是数据传输的抽象表达,java程序可以通过流来完成输入输出操作。

1.根据操作方式的区别BIO阻塞同步、NIO非阻塞同步、AIO非阻塞异步

2.根据流的方向分为输入流和输出流

3.根据传输单位分为字节流和字符流

4.根据功能范围节点流和过滤流(装饰模式)

装饰模式

Decorate允许向一个现有对象动态添加新功能,同时不改变结构,属于JavaSE 23种设计模式中的结构型设计模型

可以扩展原有对象的功能(比继承更灵活),即定义一个接口

用途:动态扩展功能

优点:装饰类和被装饰类可以独立发展,不会相互耦合缺点:多层装饰比较复杂

//1.被装饰方抽象角色
public interface Ishape{
    void draw();
}


//2.具体的修饰方实现可以有多个不同实现类
public void Circle implements Ishape{
    public void draw(){
        System.out.println("aaaa");
    }
}


//3.装饰抽象角色
public abstract class DecorateShape implements Ishape{
    private Ishape target; //被装饰方对象,就是需要动态追加功能的对象

    public DecodateShape(Ishape target){
        this.target=target;
    }
    public void draw({
        target.draw(); //具体的操作需要通过被装饰方提供实现
    }
}


//4.具体装饰角色
public class RedDecorateShape extends DecorateShape{
    public RedDecorateShape(Ishape target){
        super(target) ;
    }
    public void draw({
        system.out.println("使用红色");
        super.draw();        //调用父类中的被覆盖的方法
        system.out.println("恢复默认的颜色");
}


//5.测试类
//调用时进行组装
Ishape circle=new circle();//节点流
Ishape decorate=new RedDecorateShape(circle);//过滤流decorate.draw();
//也允许这样使用
Ishape decorate2=new BlueDecorateShape(decorate) ;

BIO编程

使用统一接口进行操作,具体实现细节无关

1.字节流

InputStream OutputStream ,都实现了 Closeable 接口,所以支持 try-resources
InputStream操作用于实现数据的读取操作
1.read():int 注意这里只是读取一个字节, 0-255 之间, -1 表示流结束
2.read(byte[]):int 返回值表示读取的具体字节个数, -1 流结束
3.close():void 关闭流
其他方法 read(byte[],int,int) available() skip(long)
OutputStream操作方法用于实现数据的写出操作
1.write(int):void 写出一个字节, int 的低 8
2.write(byte[] 具体数据, int 起始下标, int 长度 ):void
3.close():void 关闭流
其他方法 write(byte[]) flush()

2.字符流

顶级父抽象类 Reader Writer ,一次一字符的操作,实现了 Closeable 接口。如果涉及中文信息,则需要考虑编码字符集的问题,如果编码字符集错误,则显示乱码。
Reader用于封装字符读取操作
1.read():int 返回读取到的字符数据, 0-65535 2B ,返回 -1 表示流末尾
2.read(char[]):int 返回读取的字符个数,流结束返回 -1
3.close():void 关闭流
Writer用于封装字符写出操作
1.write(int):void 写出低 16
2.write(char[] 数据, int 起始下标, int 写出的字符数 ):void
3.close():void 关闭流,释放资源
4.write(String):void 写出一个字符串内容到输出流中
//例:从一个txt文件中读取数据,在控制台上显示输出,并写入到指定文件中
public class Test6 { 
    public static void main(String[] args) throws IOException 
        { try (Reader in = new FileReader("out/a1.bak"); 
          Writer out = new FileWriter("out/aaa.txt");) { 
            char[] buffer = new char[1024]; 
            int len = 0; 
            while ((len = in.read(buffer)) > 0) { 
                String ss = new String(buffer, 0, len); 
                System.out.println(ss); 
                out.write(buffer,0,len); //out.write(ss); 
            } 
        } 
    } 
}

 节点流

1.文件流

FileInputStreamFileReader用于从一个文件中读取数据; FileOutputStream和FileWriter用于向一个文件中写出数据。
FileInputStream文件输入字节流, FileReader 文件输入字符流,用法类似
        FileInputStream("文件名称 ") ,如果文件不存在则 FileNotFoundException
        FileInputStream(File)
FileOutputStreram 文件输出字节流, FileWriter 文件输出字符流,用法类似
        FileOutputStream("文件名称 ") ;如果文件不存在,则自动创建;如果文件存在则执行覆盖原文件内容
        FileOutputStream("文件名称 ",boolean 是否采用追加方式 ) ;如果文件不存在,则自动创建;如果文件存在并且Boolean 参数为 true 则表示采用追加的方式处理

2.内存数组节点

如果是文本字符则使用 char[] ,如果二进制数据则使用 byte[]
CharArrayReader和 CharArrayWriter ByteArrayInputStream ByteArrayOutputStream 数据来源或者输出目标为数组,CharArray 对应 char[] ByteArray 对应 byte[]
输入流
        CharArrayReader(char[]) 其中 char[] 就是数据的来源,也就是说 Reader 是从 char[] 中读取数据不常用
        CharArrayReader(char[]数据, int 起始下标, int 最大长度 )
输出流
CharArrayWriter用于实现向一个字符数组中写入数据,这个数组大小可以自动调整
        CharArrayWriter()自动创建一个关联了 char[] 的输出流
        CharArrayWriter(int)自动创建一个关联了 char[] 的输出流,这里的参数就是 char[] 的初始化大小

3.内存字符串流

读写String中的数据
StringReader用于从一个String 中读取数据
String str="学习Java"; 
Reader sr=new StringReader(str); //设置字符串流的数据原来为str对象 
int cc; 
while((cc=sr.read())!=-1){ 
    System.out.println((char)cc); 
}
sr.close();
StringWriter用于向一个 StringBuffer 中写入数据,实现了一个可变长的字符串
Scanner sc=new Scanner(System.in); 
try(
    StringWriter sw=new StringWriter(); 
    Writer w=new FileWriter("d:/console.txt"); 
){ 
    String tmp=sc.nextLine(); 
    while(!"quit".equals(tmp)){ 
        if(tmp!=null && tmp.trim().length()>0){ 
            sw.write(tmp+"\n"); 
        }
        tmp=sc.nextLine(); 
    }
    System.out.println(sw.toString()); 
    w.write(sw.toString());//通过toString方法获取变长字符串内容 
}
sc.close();

        今天的就先写到这里吧,下一篇继续总结过滤流的知识,还有其他流的知识,期待我们下一次的遇见,文章或有瑕疵不足之处,还望大家理解之处,谢谢大家!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值