IO详解

IO流简单来说就是Input和Output流 ,IO流主要是处理设备之间的数据传输,java对于数据的操作都是通过流来实现的,而java对于操作流的对象都是在IO包中

  按照操作数据划分:

    字节流和字符流  InputStream和Reader    OutputStream和Writer

  按流划分:

    输入流和输出流  InputStream和OutputStream  Writer和Reader

一 字符流:

  字符流只是用来处理文本数据的,数据最常见的表现形式是文件,字符流用于操作文件的子类一般是FileReader和FileWriter

注意:

  1. 写入文件后必须要用flush()刷新
  2. 用完流要记得关闭流
  3. 使用流对象要处理IO异常
  4. 定义文件路径可以使用"/"或者"\"
  5. 在创建一个文件时,如果目录下有同名文件讲被覆盖
  6. 读取文件时,要保证该文件存在,否则会出现异常

创建一个文件,并存入数据:

FileWriter fw = null;
  try {
	fw = new FileWriter("D:\IOreview.txt");//明确文件存放的位置
	fw.write("谢晓飞");//写入数据
	fw.flush();//刷新,不刷新没有数据
	fw.write("真帅");//flush刷完还能继续写数据
	}catch(IOException e) {
	  e.printStackTrace();
	}finally {
	  try {
		if(fw!=null)fw.close();//close()关闭流资源,关闭之前还会刷新一次,所以不用继续刷
	}catch(IOException e) {
		e.printStackTrace();
	}
	}

  

效果就是这样的(笑的请厚道一点^_^)

其中close()和flush()的区别:flush()在刷新之后还能继续输入,但是close()不能在输入

FileReader中的read()方法  对单个字符和数组进行读取

  字符数组的读取:

FileReader fr = null;
        try {
            fr = new FileReader("D:\IOreview.txt");//读取具体的文件内容
            char []ch = new char[1024];//创建一个字符数组
            int num = -1;//定义一个整形数据用来判断有没有带数据的末尾
            while((num=fr.read(ch))!=-1) {//当读取到文件的末尾,num的值就会等于-1,并且把内容都存放在ch数组中
                System.out.println(new String(ch,0,num));
            }
        }catch(IOException e) {
            e.printStackTrace();
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(fr!=null)fr.close();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }

(承让了啊)

  单个字符的读取:

FileReader fr = null;
        try {
            fr = new FileReader("D:\IOreview.txt");
            int ch = 0;
            while((ch=fr.read())!=-1) {
                System.out.print((char)ch);
            }
        }catch(IOException e) {
            e.printStackTrace();
        }finally {
                try {
                    if(fr!=null)
                        fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

效果同样,就不展示了

二  字节流

  字节流和字符流的操作基本相同,但是想要操作媒体文件(媒体文件是用字节存储的)

  读写字节流:InputStream(读)输入流  和OutputStream(写)输出流  ps:初学IO这一块我也是懵逼,但是记得他这个是相较于计算机的就好了

  字节流可以不用刷新操作

操作图片-----复制图片

FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream("D:\zy.jpg");
            fos = new FileOutputStream("D:\xf.jpg");
            byte[] b = new byte[1024];
            int num = -1;
            while((num = fis.read(b))!=-1) {
                fos.write(b);
            }
        }catch(IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(fis!=null)fis.close();
                if(fos!=null)fos.close();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }

阔以的

三  缓冲区

为了提高效率,因为出现了缓冲区

字符流缓冲区:BufferedWriter和BufferedReader

将需要提高效率的流作为参数存放到缓冲区的构造函数中,早缓冲区中封装一个数组,存入数据后一次性取出来

BufferedReader:

  读取缓冲区提供了一次读一行的方法readLine(),方便对文本数据的获取

  readLine()只返回回车字符前的字符,不返回回车字符,如果是复制的话,必须加上newLine(),进行换行

  newLine(),是java提供多平台换行符写入操作

// TODO Auto-generated method stub
        FileReader fr = null;
        BufferedReader bufr = null;
        try {
            fr = new FileReader("D:\IOreview.txt");
            bufr = new BufferedReader(fr);
            String str = null;
            while((str=bufr.readLine())!=null) {
                System.out.println(str);
            }
        }catch(IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(bufr!=null)bufr.close();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }

hiahiahiaO(∩_∩)O哈哈~

FileReader fr = null;
        FileWriter fw = null;
        BufferedWriter bufw = null;
        BufferedReader bufr = null;
        try {
            fr = new FileReader("D:\IOreview.txt");
            fw = new FileWriter("D:\IOreview1.txt");
            bufw = new BufferedWriter(fw);
            bufr = new BufferedReader(fr);
            String str = null;
            while((str = bufr.readLine())!=null) {
                bufw.write(str);
                bufw.newLine();
            }
        }catch(IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(bufw!=null)bufw.close();
                if(bufr!=null)bufr.close();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }

为了体现换行,所以在IOreview文件中添加了几条语句,所以时间是新的

 

 字节流缓冲区:

字节流缓冲区字符流缓冲区操作基本是一样的

BufferedInputStream bufi = null;
        BufferedOutputStream bufo = null;
        FileInputStream fis = null; 
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream("D:\zy.jpg");
            fos = new FileOutputStream("D:\xf1.jpg");
            bufi = new BufferedInputStream(fis);
            bufo = new BufferedOutputStream(fos);
            int num = -1;
            byte []b = new byte[1024];
            while((num = bufi.read(b))!=-1) {
                bufo.write(b,0,num);
            }
        }catch(IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(bufi!=null)bufi.close();
                if(bufo!=null)bufo.close();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }

因为xf.jpg和zy.jpg是复制过来的,所以看xf1.jpg和xf.jpg是一样的就行

师从毕向东老师,个人认为毕向东老师教的真的挺好的,只是视频可能有些年头了,由于马上准备找工作了,所以吧笔记在博客园写一下,加深一下印象

那些地方写的不好请指出来,小白再次拜谢了

共同努力共同进步

谢谢大家了

原文地址:https://www.cnblogs.com/xiexiaofei/p/11644761.html