关闭

java中的IO处理

标签: javaiostringbyteclassnull
101人阅读 评论(0) 收藏 举报

-----------------------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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3264次
    • 积分:123
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档