黑马程序员——IO包其它类笔记

------- android培训java培训、期待与您交流! ----------

一、打印流:该流提供打印方法,可以将各种数据类型都原样打印

printstream,字节打印流,可以直接操作文件

构造函数可以接收的参数类型:1.file对象,2.字符串路径,3.字节输出流outputstream

printwriter字符打印流:

构造函数可以接收的参数类型:1.file对象,2.字符串路径,3.字节输出流outputstream,4.字符输出流,更加常用

BufferedReaderbufr=new BufferedReader(new InputStreamReader(System.in));

     

//   PrintWriter pw=new PrintWriter(System.out,true);

     PrintWriter pw=new PrintWriter(new FileWriter("file.txt",true),true);

      //true,自动刷新,只针对流而言,而systemout可以换为newfilewriter(file.txt)

      //第一个true,表示文件续写,第二个true表示文件自动刷新

     String s=null;

     while((s=bufr.readLine())!=null){

         if("over".equals(s))

            break;

        pw.println(s);

     }

     pw.close();

     bufr.close();

二、序列流(合并流)SequenceInputStream

可以将多个流对象拼接成一个流对象,多个源对应一个目的

Vector<FileInputStream>v=new Vector<FileInputStream>();

     v.add(new FileInputStream("1.txt"));

     v.add(new FileInputStream("2.txt"));

     v.add(new FileInputStream("3.txt"));

     Enumeration<FileInputStream> elements = v.elements();

     SequenceInputStream sis=new SequenceInputStream(elements);

     

     FileOutputStream fos=new FileOutputStream("4.txt");

      byte[] b=newbyte[1024];

      int len=0;

      while((len=sis.read(b))!=-1){

        fos.write(b,0,len);

     }

     fos.close();

     sis.close();

 

合并流第二种方式:采用arraylist转换为enumeration类

public static void merge() throws IOException {

     ArrayList<FileInputStream> al=new ArrayList<>();

      for(int i=0;i<=3;i++){

        al.add(new FileInputStream("c:\\file||"+i+".part"));

     }

      final Iterator<FileInputStream>it=al.iterator();

新建一个enumeration来装arraylist里面的元素

     Enumeration<FileInputStream> en=new Enumeration<FileInputStream>(){

 

         @Override

         public boolean hasMoreElements() {

            return it.hasNext();

        }

 

         @Override

         public FileInputStream nextElement() {

            return it.next();

        }

     };

     SequenceInputStream sis=new SequenceInputStream(en);

   }

三、随机访问读取文件randomaccessfile

读写都可以,通过指针操作,它不是IO体系中的子类,它直接继承Object,它是IO包中的成员,它具备读写功能,内部封装了数组,而且通过指针对数组的元素操作,可以通过getfilepointer获取指针位置,同时可以通过SEEK改变指针的位置,完成读写的原理,自己内部封装了输入流和输出流

通过构造函数可以看出,该类只能操作文件,而且操作文件还有模式

RandomAccessFileraf=new RandomAccessFile("ran.txt","rw");

     raf.seek(8);//调整指针

     raf.skipBytes(8);//跳过指定的字节,只能往后跳

      byte[] b=newbyte[8];

     raf.read(b);

     String name=new String(b);

      int age=raf.readInt();

     raf.close();

RandomAccessFile raf=new RandomAccessFile("ran.txt","rw");//new的时候不覆盖文件

     raf.seek(8*3);

     raf.write("周期".getBytes());

如果模式为只读r,则不会创建文件,如果模式为rw的话,则可以自动创建

所以它可以实现数据的分段写入:可以一个线程写入一段,比如多线程的下载

四、操作基本数据类型的DataStream

用于操作基本数据类型的流对象

DataOutputStreamdos=new DataOutputStream(new FileOutputStream("data.txt"));

     dos.writeInt(356);

     dos.writeBoolean(true);

     dos.close();

     DataInputStreamdis=

new DataInputStream(new FileInputStream("data.txt"));

int a=dis.readInt();

      booleanbo=dis.readBoolean();

      dis.close();

总结,操作基本数据类型就可以用这个流

五、操作字节数组

   ByteArrayInputStream在构造的时候需要接收数据源,而且数据源是一个字节数组

  ByteArrayOutputStream在构造的时候不用定义数据目的,因为该对象内部已经封装了可变长度的字节数组

因为这两个流对象都操作数组,没有使用系统资源,所以不用关闭流

流操作规律为:

源设备:

键盘system.in 硬盘filestream内存arraystream

目的设备

键盘system.out 硬盘filestream内存arraystream

这就是用流的读写思想来操作数组

六、操作字符数组和字符串

CharArrayReader 和CharArrayWriter

StringReader和StringWriter

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值