IO流简单来说就是Input和Output流 ,IO流主要是处理设备之间的数据传输,java对于数据的操作都是通过流来实现的,而java对于操作流的对象都是在IO包中
按照操作数据划分:
字节流和字符流 InputStream和Reader OutputStream和Writer
按流划分:
输入流和输出流 InputStream和OutputStream Writer和Reader
一 字符流:
字符流只是用来处理文本数据的,数据最常见的表现形式是文件,字符流用于操作文件的子类一般是FileReader和FileWriter
注意:
创建一个文件,并存入数据:
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