Java节点流

节点流

文件节点流

FileInputStream FileOutputStream 是文件字节流,是一种节点流
文件字节输入流的构造方法:
  • FileInputStream("文件名称"),如果文件不存在则FileNotFoundException
  • FileInputStream(File)
文件字节输出流的构造方法 :
  • FileOutputStream(“文件名称”) 如果文件不存在则新建文件,如果文件存在则覆盖文件内容
  • FileOutputStream(String name文件名称, boolean append是否采用追加方式)                     FileReaderFileWriter类似
FileInputStream FileOutputStream 两个类属于结点流,第一个类的源端和第二个类的目的端都是磁盘文件,它们的构造方法允许通过文件的路径名来构造相应的流。
如:
FileInputStream infile = new FileInputStream("myfile.dat");
FileOutputStream outfile = new FileOutputStream("results.dat");
要注意的是,构造 FileInputStream, 对应的文件必须存在并且是可读的,而构造 FileOutputStream 时, 如输出文件已存在,则必须是可覆盖的。
要求:将 d 盘上的 TestFile.java 拷贝到 e 盘,并命名为 dd.txt
try (InputStream is = new FileInputStream("d:/TestFile.java");
OutputStream os=new FileOutputStream("e:\\dd.txt");
) {
byte[] buffer=new byte[8192];
int len=is.read(buffer);
while(len>0){
os.write(buffer,0,len);
len=is.read(buffer);
}
}catch(IOException e){
e.printStackTrace();
}
构造输出文件流时可以使用两种不同的方式
OutputStream os=new FileOutputStream("e:\\dd.txt"); 如果文件不存在则自动创建;如
果文件存在则进行覆盖
OutputStream os=new FileOutputStream("e:\\dd.txt",true),这里的boolean类型参数
表示是否采用追加的方式写入文件
内存数组节点
如果文本则使用 char[] ,如果二进制则使用 byte[]
构造器方法
  • CharArrayReader(char[] buf)其中char[]就是数据的来源,也就是说Reader就是从char[]中读取数
  • CharArrayRead(char[] buf, int offset, int length)
CharArrayWriter 用于实现向一个字符数组中写入数据,这个数组可以自动调整大小
ByteArrayInputStream ByteArrayOutputStream CharArrayReader 以及 CharArrayWriter 类似,支
持操作的内容不同而已,操作 byte[] char[]
内存字串流
StringReader 用于从一个字串 String 中读取数据
String str="亚洲说:‘我爱小黑’";
StringReader sr=new StringReader(str);
int cc;
while((cc=sr.read())!=-1)
System.out.print((char)cc);
sr.close();

StringWriter 用于给一个 StringBuffer 中写入数据,实现一个可边长的字串
Scanner sc=new Scanner(System.in);
try(
StringWriter sw=new StringWriter();
Writer fw=new FileWriter("c:/console.txt")
){
String temp=sc.nextLine();
while(!temp.equals("quit")){
if(temp!=null && temp.trim().length()>0)
sw.write(temp+"\n");
temp=sc.nextLine();
}
fw.write(sw.toString());
}

总结
  • 读写文件使用节点流FileInputStream/FileOutputStreamFileReader/FileWriter,如果操作文本文件,建议使用FileReader/FileWriter,如果操作二进制文件建议使FileInputStream/FileOutputStream
  • 需要建立缓冲区(建立临时文件的方式效率低),可以考虑使用内存节点,例如 CharArrayReader/CharArrayWriterStringReader/StringWriterByteArrayInputStream/ByteArrayOutputStream
  • 如果需要一个二进制缓冲区可以使用ByteArrayInputStream/ByteArrayOutputStream,如果需要 一个字符缓存可以使用CharArrayReader/CharArrayWriterStringReader/StringWriter
  • 如果数据量不是特别大使用CharArrayReader/CharArrayWriter更为方便,如果数据量大而且可能 需要直接操作缓冲区则使用StringReader/StringWriter
  • StringWriter中提供了方法getBuffer():StringBuffer
过滤流类型
过滤流就是在节点流的基础上附加功能
过滤流
就是 decorate 模式中的抽象装饰角色
FilterInputStream/FilterOutputStream FilterReader/FilterWriter
public class FilterInputStream extends InputStream { //典型的装饰模式
protected volatile InputStream in; //被装饰目标
protected FilterInputStream(InputStream in) { //通过构造器组装被装饰对象
this.in = in;
}
public int read() throws IOException {//调用Filter中的read方法时实际操作是由
被装饰对象实现的
return in.read();
}
}

所谓的过滤流实际上就是类似上面的加密处理,在输入之后(后置处理,被装饰对象先执行)或者输出 之前(前置处理,先处理然后被装饰对象执行)进行一下额外的处理,最终实际操作是调用被装饰对象 的方法完成工作,依靠这种装饰模式实现在节点流的基础上附加额外功能. 当然也允许多个过滤流嵌套从 而达到功能累加的目的
FilterInputStream 实际上就是一个装饰抽象角色
自定义流实现循环 13 加密 :
读取数据不变 :FileReader---BufferedReader
写出数据自定义过滤流 SecurityWriter(FilterWriter)
public class SecurityWriter extends FilterWriter {
protected SecurityWriter(Writer out) {
super(out);
}
public void write(int c) throws IOException {
if (c >= 'a' && c <= 'z') {
c = (c - 'a' + 13) % 26 + 'a';
} else if (c >= 'A' && c <= 'Z') {
c = (c - 'A' + 13) % 26 + 'A';
}
super.write(c);
}
}
public class SecurityReader extends FilterReader {
protected SecurityReader(Reader in) {
super(in);
}
public int read() throws IOException {
int c = super.read();
if (c >= 'a' && c <= 'z') {
c = (c - 'a' + 13) % 26 + 'a';
} else if (c >= 'A' && c <= 'Z') {
c = (c - 'A' + 13) % 26 + 'A';
}
return c;}}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值