之前把流的知识点只做了一个大概的总结,对一些知识点还没有总结到位,今天把之前的做一些补充以及对新的知识点总结梳理!
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 长度 ):void3.close():void 关闭流其他方法 write(byte[]) 、 flush()
2.字符流
顶级父抽象类
Reader
和
Writer
,一次一字符的操作,实现了
Closeable
接口。如果涉及中文信息,则需要考虑编码字符集的问题,如果编码字符集错误,则显示乱码。
Reader用于封装字符读取操作1.read():int 返回读取到的字符数据, 0-65535 2B ,返回 -1 表示流末尾2.read(char[]):int 返回读取的字符个数,流结束返回 -13.close():void 关闭流
Writer用于封装字符写出操作1.write(int):void 写出低 16 位2.write(char[] 数据, int 起始下标, int 写出的字符数 ):void3.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.文件流
FileInputStream和FileReader用于从一个文件中读取数据;
FileOutputStream和FileWriter用于向一个文件中写出数据。
FileInputStream文件输入字节流, FileReader 文件输入字符流,用法类似FileInputStream("文件名称 ") ,如果文件不存在则 FileNotFoundExceptionFileInputStream(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();
今天的就先写到这里吧,下一篇继续总结过滤流的知识,还有其他流的知识,期待我们下一次的遇见,文章或有瑕疵不足之处,还望大家理解之处,谢谢大家!!!