java中的IO处理

-----------------------android培训java培训java学习型技术博客、期待与您交流!----------------------

    Java的I/O系统涉及流的概念,一个读取字节序列的对象被称为输入流,一个写入字节序列的对象称为输出流,程序读入数据,首先打开一个输入流,流以对象的形式存在,数据文件或网络链接信息包装在流对象内部,流对象一旦启动,程序可以从输入流依次读入数据,当程序要输出数据时,就打开一个输出流对象,该对象知道数据的目标文件位置,并将数据依次写入。在Java.io包中有各种流对象,按处理的对象不同可以分为字符流和字节流。
    Java提供了两个处理字节数据的接口InputStream和OutputStream,并提供read()每个实现该类的子类都必须重写该方法,InputStream表示从不同的输入源输入数据的类,可以是字节数组,String对象,类的序列化对象,不同的数据有相应的实现类来操作,其中有2个最常用的子类FileInputStream和FileOutputStream,实现方式如下:
class StreamDemo
{
 public static void main(String[] args)throws IOException
 {
     FileInputStream fis=new FileInputStream("0.jpg");
  FileOutputStream fos=new FileOutputStream("1.jpg");
  int ch;
  while((ch=fis.read())!=-1)
  {
     fos.write((char)ch);
  }
  byte[] buf=new byte[1024];
  int line;
  while((line=fis.read(buf))!=-1)
  {
     fos.write(buf,0,line);
  }//第一种读取字节的方式
/*第二种读取发送,一次读一个数组
        byte[] buf=new byte[fis.available()];
  fis.read(buf);
        fos.write(buf);
        sop(new String(buf));*/
 }}
在Java的IO技术中引用了装饰模式,通过缓冲区提高读取字节的效率,实现方式如下:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("0.jpg"));
BufferedOutputStream fos=new BufferedOutputStream(new FileOutputStream("1.jpg"));
     为了能简单读取字符数据,Java提供了两个字符流,Reader和Writer接口,两个常用的子类是FileReader和FileWriter,实现方式如下:
public class IODemo {
 public static void main(String[] args)throws IOException {
   BufferedReader br = new BufferedReader(new FileReader("MainClass.java"));
  BufferedWriter wr = new BufferedWriter(new FileWriter("Copy1.txt"));
  String line;
  while((line=br.ReadLine())!=null){//字符缓冲区提供一次读一行的方法
   System.out.println(line);
   wr.write(line);
   wr.newLine();//字符缓冲区提供换行的方法,支持跨平台
  }
  br.close();//数据读写完毕后,流对象必须关闭,避免占用系统资源
  wr.close();
其实字符流底层就是用字节流实现。
       在Java的IO技术中引用了装饰模式,通过缓冲区提高读取字节的效率,实现方式如下:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("0.jpg"));
BufferedOutputStream fos=new BufferedOutputStream(new FileOutputStream("1.jpg"));
缓冲区的实现原理其实就是在其内部封装一个数组,用一次读写批量数据的方式提高读写效率,在此,简单模拟一个缓冲区,实现相同的功能,
class MyBufferedReader extends Reader{
 private Reader r;
 MyBufferedReader(Reader r){
  this.r = r;
 }
 public void close() throws IOException {
  r.close();
 }
 public int read(char[] cbuf, int off, int len) throws IOException {
  return r.read(cbuf, off, len);
 }
 public String MyReadLine()throws IOException{
     int ch;
  String line;
  char[] a = new char[1024];
  while((ch = r.read(a))!=-1){
   return new String(a,0,ch);
  }
  return null; 
 }
}
    那么如何实现字符流与字节流的转换呢,Java也定义的一种方式就是转换流,他们都是字符流的子类,InputStreamReader(将字节流读到字符流中)和OutputStreamWriter(将字符流写入到字节流中),因为键盘录入的是字节流,所以可用以下实现方式:
    BufferedReader bfr =
                 new BufferedReader(new InputStreamReader(System.in));
   BufferedWriter bfw =
                  new BufferedWriter(new OutputStreamWriter(System.out));
    为了解决各种数据的读写,Java中还提供了其他的流对象,如InpuStream的子类ByteArrayInputStream(字节数组读取流),pipedInputStream(管道流),SequenceInputStream(序列化输入流),StringbufferInputStream(字符串缓冲输入流),ObjectInputStream(对象输入流),FilterInputStream(过滤器输入流),以及对应的输出流;
    实际上Java的IO流处理底层都调用了windows系统资源,所以当读写程序结束后必须调用close方法关闭流,节省资源。

 

 

-----------------------android培训java培训java学习型技术博客、期待与您交流!----------------------

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

 

 

 


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值