黑马程序员--java中的io流

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


1.什么是io流?
   io包括输入和输入流,输入流指的是将数据以字符或字节形式从外部媒介比如文件、数据库等读取到内存中所有也分为字符输入流和字节输入流。
   输入流指的是将内存中的数据写入外部媒介,也分为了字符输出流和字节输入流。
 


2.使用io流总结
   io流:用于处理设备上的数据。
    设备:硬盘,内存,键盘录入。
   io有具体的分类:
    1.根据处理的数据类型不同:字节流和字符流
    2.根据流向不同:输入流和输出流
   
   字节流和字符流的区别:
   1.字节流读取的时候,读到一个字节就返回一个字节。字符流使用了字节流杜鳌一个活多个字节时,先去查指定编码表,将查到的字符返回。
   2.字节流可以处理是哟有类型数据,如图片,mp3,avi等,而字符流只能处理字符数据
   
   io的体系,所具备的基本功能就有两个:读和写
    1.字节流
      inputStream(读),outputStream(写)。
    2.字符流:
      Reader(读),Writer(写)。
   
   Reader中的常见方法:
   int read(); //读取一个字符,就返回的是读到的那个子字符,如果读到流的末尾,返回-1;
   int read(char[]); //将读到的字符存入指定的数组中,返回的是读到到子都的个数,也就是往数组里装的元素的个数,如果读到流的末尾,返回-1.
   close();// 读取字符其实用的是系统的功能,就希望使用完毕后,进行资源的释放
  
   Writer中常见的方法:
   write(ch);//将一个字符写入到流中。
   write(char[]);// 将一个字符数组写入到流中
   write(String);//将一个字符串写入到流中
   flush();//刷新流,将流中的数据刷新到目的地中,流还存在
   close();//关闭资源,在关闭前会先调用flush方法,刷新流中的数据去目的地,然后流关闭。
   
   FileWirter:
   该类没有特有的方法,只有自己的构造函数。
   该类特点在于,
   1.用于处理文本文件。
   2.该类中又默认的编码表,
   3.该类中又临时缓冲。
   构造函数:在写入流对象初始化时。必须要有一个存储数据的目的地。
   FileWriter(String filename);//调用系统资源。在指定位置穿件一个文件,如果该文件已经存在,将会被覆盖
   FileWriter(String filename,boolean append);//当传入的boolean类型值为true时,会在指定文件末尾处进行数据的续写
   


   FileReader:
    1.用于读取文本文件的流对象
    2.用于关联文本文件
    FileReader(String filename); //在读取流对象初始化的时候,必须要猴子腚一个被读取的文件。如果该文件不存在会发生FileNotFoundException
    代码示例;
    class Demo{
  public static void main(String[] args)throws IOException {
FileWriter fw = new FileWrier("test.txt");
fw.write("asfsdf");
fw.flush();
fw.write("sdsfsdf");
fw.close();
}
    }
   对于读写或者写入流对象的构造函数,以及读写方法,还有刷新关闭功能都会抛出IOxception或其子类。




  字符流的缓冲区:
  缓冲区的出现提高了对流的操作效率。
  原理:其实就是将数字进行封装:
  对应的对象:
  BufferedWriter:
   特有方法:
     newLine();//跨平台的换行符
    BufferedReader:
    特有方法:
   readLine();//一次赌一行,到行标记时,将航标机之前的字符数据作为字符串返回,当读到末尾时,返回null
   在使用缓冲区对象时,要明确,缓冲的存在是为了增强流的工呢过而存在,
   所以在建立缓冲区对象时,要先有流对象村子啊。
   其实缓冲内部就是在使用流对象的方法,只不过假如了数组对数据惊醒了临时存储,为了提高操作数据的效率。
    代码上的体现:
    写入缓冲区对象。
    BuffereWriter  bufw = new Buffed Writer(new FileWriter("test.txt")); //建立缓冲区对象必须把流对象作为参数传递给缓冲区的构造函数
    bufw.write("adfd"); //将数据写入到了缓冲区。
    bufw.flush();//对缓冲区的数据进行刷新,将数据刷到目的地中
    bufw.close();//关闭缓冲区,其实关闭的是被包装在内部的流对象
    BufferedReader bufr = new BufferedReder(new FileReader("buf.txt"));
    String line = null;
    //按照行的形式取出数据,取出的每一个行数据不包含回车符。
    While((line = bufr.readLine())!=null){
System.out.println(line);
    }
   bufr.close();


    
  练习:通过缓冲区的形式,对文本进行拷贝。
   poublic static void main(String args){
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
  bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
   }


   readLine();
    其实缓冲区中的该方法,用的还是与缓冲区关联的流对象的read方法。
    只不过,每一次读到一个字符,先不进行具体操作,先进行临时存储。
   当读取到回车暴击时,将临时日容器中存储的数据一次性返回。
  
   抽象基类:inputStream,outputStream.
   字节流可以操作任何数据
   注意:字符流使用的数组时字符数组char[]
         字节流使用的数组是字节数组byte[]


   FileOutputStream fos = new FileOutputStream("a.txt");
   fos.write("adfaf");直接将数据写入到了目的地
   fos.close();//值关闭资源
   FileImputStream fis = new FileInputStream("a.txt");
   //如果文件不大,可以这样操作
   
   
转换流;
  特点:
  1.是字节流和字符流之间的桥梁
  2.该流对象中可以对读取到的字节数据惊醒指定编码表的编码装换。
  什么时候使用呢?
  1.当字节和字符或字节之间有转换动作时
  2.流操作的数据需要进行编码表的指定时
  
  具体的对象体现;
  1.InpuStreamReader:字节到字符的桥梁
  2.OutputStreamWriter: 字符到字节的桥梁
  
  这两个流对象是字符流体系中的成员
  那么他们有转换作用,而本身又事字符流,所以在构造的时候,需要传入字节流对象进来
  
  构造函数:
  inputStreamReader(InputStream);//通过该构造函数初始化,使用的是本系统默认的编码表GBK
  InputstreamReader(InputStream in,String chaeSet);//通过该构造函数初始化,可以指定编码表
  outputstreamWriter(OutputStream);//通过该构造函数初始化,使用的是本系统默认的编码表GBK
  outputstreamWriter(OutputStream out,String CharSet);//通过该构造啊哈念书初始化,可以指定编码表


Fiel类:
   该类的出现是对文件系统中的文件以及文件夹进行对象的封装。
   可以通过对象的思想来操作文件以及文件夹
   1.构造函数:
   file(String parent,String child);
   File(File parent,String child);
  常见方法:
   boolean createNewFile(); //创建文件,如果被穿件的文件已经存在,则不创建
   boolean mkdir();//创建文件夹。
   boolean mkdirs();//创建多级文件夹。
   boolean delete();//可用于删除文件或者文件夹
   void deleteOnExit();//删除文件动作交给系统完成,无论是否发生异常,刺痛在推出时执行删除动作。
   boolean exists(); //判断文件或者文件是否存在
   boolean isFile(); //判断File对象中封装的是否是文件
   boolean isDirectory();//判断Dile对象中封装的是否是文件夹
   boolean isHidden();//判断文件或者文件夹是否隐藏,在获取硬盘文件或者文件夹时,对于系统目录中的文件,java是无法访问的,所以在遍历,可以避免遍历隐藏文件
   getName(); //获取文件或者文件夹的名称。
   getpath();//file对象中封装的路径是什么,获取的就是什么。
   long length();//获取文件大小
   long lastModified();//获取文件或者文件最后一次修改的时间 




递归:
      其实就是在使用一个功能过程中,又对该功能有需求。
     就出现了函数自身调用自身
  注意:
   1.一定要限定条件,否则内存溢出
   2.使用递归时,调用次数不要过多,否则也会出现内存溢出
  
Io包中其他对象;
  1.打印流.
     printStream:
     是一个字节打印流,System.out对应的类型就是PrintStream。它的构造函数可以接受三种数据类型的值
     1.字符串路径
     2.File对象
     3.OutpoutStream
     printWriter:
      是一个字符打印流,构造函数可以接受四种类型的值
     1.字符串路径
     2.File对象
     3.outputStream
     4.Writer


管道流;
  PipedinputStream
  pipedOutputStream
  特点:
  读取管道流和写入管道里可以进行连接
  连接方式:
  1.通过两个流对象的构造函数。
  2.通过两个对象的connect方法
   通常两个流在使用时,需要加入多线程技术,也就是让读写同时运行。
   注意:对read方法,该方法是阻塞式的,也就是没有数据的情况,该方法会等待



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

详细请查看:http://edu.csdn.net/heima

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值