46.黑马程序员-IO流

来源:互联网 发布:苹果6手机怎么清除数据 编辑:程序博客网 时间:2024/05/29 02:27

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

    1、概述
  • IO流用来处理设备之间的数据传输。
  • java对数据的操作是通过流的方式,用于操作流的对象都在IO包中。
  • 流按操作数据分为:字符流、字节流。早期都是字节流,数据的最终形式是字节。
  • 文本的频繁使用出现了字符流。编码映射表使字节转为字符,字符流在内部融合了编码表
  • 流按流向分为:输入流、输出流。日常操作电脑是读写。
    2、常用基类
  • 字节流的抽象基类:InputStream,OutputStream。
  • 字符流的抽象基类:Reader,Writer。
  • 字节流和字符流的子类结尾都是父类名,如FileInputStream,FileReader。
    3、字符流
  • Reader,Writer
    • 构造方法修饰符是protected,只能子类使用、访问。
    • 抽象类,含有部分抽象方法。
  • 操作文件的子类FileWriter
    • FileWriter所有构造函数,必须有要操作的文件参数,如果存在则覆盖。
    • 使用会抛出异常:IOException。
  • 示例代码
    • import java.io.*;class  FileWriterDemo2{public static void main(String[] args) {FileWriter fw = null;//单独拿出来是因为流的建立和关闭不在一个代码块中。try{fw =new FileWriter("c:\\demo.txt");fw.write("第一次写入");}catch (IOException e){System.out.println(e.toString());}finally{try{if (fw != null)//这里判断流对象是否指向空,原因是初始化未完成。不判断会造成空指针异常。{//close要放在finally中,并且也要try。多个流需要分别关。fw.close();}}catch (IOException e){System.out.println(e.toString());}}}}

  • 数据的续写
    • 再建立FileWriter对象时,传递参数  FileWriter(" [路径] +文件名",true),true参数代表不覆盖已有文件并在文件末尾处数据续写,如不存在才创建。
    • windows中回车符由 \r\n组成,只有\r或者\n,windows无法识别。显示为小黑方格。
  • 数据的读取 read(char[] cbuf)(常用)
    •  intread(char[] cbuf) 
                将字符读入数组。
    • int read(char[] cbuf) 返回读取到的元素个数。
    • 这个方法通过移动指针读取元素,每次使用这个方法指针都偏移到下一位元素。读取的最大数取决于数组长度,连续调用这个方法可以读取完所有元素。但是有个缺陷,最后一次读取如果元素只覆盖前面少数元素,后面元素还是原来的。例如abcdefg一次读3个,第一次abc,第二次def,第三次gef。
    • 解决上面的问题可以使用String(char[] value, int offset, int count) 方法,通过返回值,读取返回的元素个数。如果返回值是-1,读取结束。
    • /*练习:读取一个.java文件,并打印在控制台上。*/import java.io.*;class  FileReaderTest{public static void main(String[] args) throws IOException{FileReader fr = new FileReader("c:\\Demo.txt");char[] buf = new char[1024];int num = 0;while ((num=fr.read(buf))!=-1){//注意这里不要用println,它会导致打印完缓冲区内容后换行。System.out.print(new String(buf,0,num));}}}

  • 复制粘贴一个文件 ,例子C盘复制到D盘
    • 方法一:
    • /*练习:复制文件,将C盘文件复制到D盘。原理:其实就是将C盘下的文件数据存储到D盘的一个文件中。步骤:1,在D盘创建一个文件,用于存储C盘文件的数据。2,定义读取流和C盘文件关联。3,通过不断的读取完成数据存储。4,关闭资源。*/import java.io.*; class CopyText{public static void main(String[] args) throws IOException{copy_2();}public static void copy_2(){FileWriter fw = null;FileReader fr = null;try{fw = new FileWriter("D:\\Demo_copy.txt");//目的fr = new FileReader("c:\\Demo.txt");//源char[] buf = new char[1024];int len = 0;while ((len = fr.read(buf)!=-1)){fw.write(buf,0,len);}}catch (IOException e){throw new RuntimeException("读写失败");//读写失败就抛异常。}finally{if(fr!=null)//判断流是否为空,防止建流的时候抛了异常。try{fr.close();}catch (IOException e){}if(fw!=null)//判断流是否为空,防止建流的时候抛了异常。try{fw.close();}catch (IOException e){}}}public static void cop_1() throws IOException{//创建目的.FileWriter fw = new FileWriter("D:\\Demo_copy.txt");//创建源与已有文件关联。FileReader fr = new FileReader("c:\\Demo.txt");int ch = 0;while ((ch = fr.read())!=-1){fw.write(ch);//在fr里读一个字符,就写到fw里一个。}fw.close();fr.close();}//System.out.println("Hello World!");}
原创粉丝点击