java 基础学习-05 io流学习案例

来源:互联网 发布:mac air bootcamp 编辑:程序博客网 时间:2024/06/03 17:24

今天六一儿童节 在这里载给我的女神表个白  ckk 我喜欢你  今天给了女神四块钱,买个雪糕吃吧,待我考上之后学成归来,一定表白请女神吃肉虽然她看不见 好啦说正题

今天学习了一下字符流,可以从头往下看,也可以先看最后的总结 也可以都尝试一下 哈哈

若有不用错误或者想问的地方 联系 1243087956

字节流的抽象基类

Inputstream 的子类FileInputStream

Outputstream 的子类fileOutputstream

字符流的抽象基类

字符流实际上也是使用了字节流的底层,是先添加到缓冲区 然后再刷新

Reader  的子类  FileReader

Writer  地子类      FileWriter

 

我们来简单学习下使用方法  基本的注意点和 方法的使用都加在了注释里面

public class as {public static void writedemo() {// 字节流的写入类FileWriter fwr = null;try {// fwr = new FileWriter("G:/src/texta.txt");// 第一个构造方法 此方法 当存在这个文件时// 则覆盖如果不存在这个文件则创建fwr = new FileWriter("G:/src/texta.txt", true);// 第二个构造方法 第二个参数为true// 表示不覆盖 在原有文件后面 续写// 若果不存在则创建fwr.write(" and   \r\n i love you true  kk"); // 注意在windows系统中 \n\r// 是转义字符的换行} catch (IOException e) {// 这里处理的异常 是防止盘符不存在 无法写入文件的异常System.out.println(e);} finally {try {if (fwr != null) {// 关闭对象时 首先应该判断是否存在这个对象 存在则关闭 不存在则 不执行关闭操作// 不然会出错fwr.close();// 这行这个方法之前 执行了一遍 .flush()方法 的操作的}} catch (IOException e) {System.out.println(e);}}}public static void readermodee() {FileReader frr = null;try {// 内容 文件 文本内容为 lloveyoufrr = new FileReader("G:/src/texta.txt");// 方式一/* * int ch=0; while ((ch=frr.read())!=-1) {//当没有值的时候 返回的值是-1 * System.out.println((char)ch); } *//* * int ch1=frr.read();//一次只读一个字符 并且会自动往下读 * System.out.println((char)ch1); int ch2=frr.read(); * System.out.println((char)ch2); int ch3=frr.read(); * System.out.println((char)ch3); */// 方式二/* * char[] bufab= new char[5] ; int num=frr.read(bufab);//将读到的东西 * 放入到char数组中 返回值为读到数据的长度 System.out.println("第一次读入   "+new * String(bufab)); int num2=frr.read(bufab);//将读到的东西 放入到char数组中 * 返回值为读到数据的长度 System.out.println("第二次读入   "+new String(bufab)); int * num3=frr.read(bufab);//将读到的东西 放入到char数组中 返回值为读到数据的长度 * System.out.println("第三次读入   "+new String(bufab)); */// 分析出现的结果 第一次读到 llove 第二次只读入了 you 三个字符 不在往后读而此时的数组则是值写入了前三个// 呢么现在出现的问题 我们需要判断读入的长度写入// /所以我们这么写char[] bufab = new char[5];int num = 0;while ((num = frr.read()) != -1) {// 结合上个出现的的问题 所以 我们new string// 的构造方法 如下写System.out.println("第一次读入   " + new String(bufab, 0, num));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if (frr != null) {// 关闭对象时 首先应该判断是否存在这个对象 存在则关闭 不存在则 不执行关闭操作// 不然会出错frr.close();// 这行这个方法之前 执行了一遍 .flush() 的操作的}} catch (IOException e) {System.out.println(e);}}}public static void main(String[] args) {readermodee();}}




FileWriter   我们每写一个数据,硬盘就有一个写动作,性能极差

 

Java给我们提供了一种速度稍微提高的写入数据的模式 下面我们来看代码

面这个加了一个缓冲,缓冲写满后在将数据写入硬盘 
这样做极大的提高了性能 如果单独使用   

 

  public static void www(){FileWriter fwr=null;try {fwr = new FileWriter("G:/src/textb.txt");//为了提高写入写入流的数据 假如了缓冲技术BufferedWriter bufw=new BufferedWriter(fwr);bufw.write("i love  c ilovek");bufw.newLine();//写入一个换行符bufw.write("i love  c ilovek");//bufw.flush();  bufw.close();//关闭缓冲区的资源 关闭缓冲区的流对象  所以 有这个  fwr可以不用close} catch (IOException e) {e.printStackTrace();}   }   public static void rrr(){//读取操作FileReader frr=null;BufferedReader burrrw=null;try {frr = new FileReader("G:/src/textb.txt"); burrrw=new BufferedReader(frr);//为了提高写入写入流的数据 假如了缓冲技术String s1=null;//记录一行内容while ( (s1=burrrw.readLine())!=null) {//返回空时读到文件末尾//burrrw.readLine()!=null 这样直接判断是不行的  因为这样已经读了一行  下面再输出这个内容已经读下一行了 //因为这个方法是自动往下读的//没有读入行终止符号  所以不使用print方法的时候 打印的都是一行  !!!System.out.println(s1);}} catch (IOException e) {e.printStackTrace();}finally{try {burrrw.close();} catch (IOException e) {e.printStackTrace();//关闭缓冲区的资源 关闭缓冲区的流对象  随意 有这个  fwr可以不用close}  }public static void main(String[] args) {rrr();} 

 

字节流的输入 

 

 public class outandintstream {public static void main(String[] args) {inputdemo();}//写入操作方法public static void outputdemo(){FileOutputStream fops=null;try { fops=new FileOutputStream("G:/src/textouts.txt");fops.write("abcdeiloveyou".getBytes());//write 没有直接写入字符串的方法   此处写入字节数} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {fops.close();} catch (IOException e) {e.printStackTrace();}}}//读入操作方法 方法1public static void inputdemo01(){FileInputStream fis=null;try { fis=new FileInputStream("G:/src/textouts.txt");//获取文件int ch=0;while ((ch=fis.read())!=-1) {System.out.println((char)ch);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {fis.close();} catch (IOException e) {e.printStackTrace();}}}//读入操作方法 2public static void inputdemo02(){try {FileInputStream fis=new FileInputStream("G:/src/textouts.txt");//获取文件byte [] buf=new byte[100];//定义字节数大小int m=fis.read(buf,0,buf.length);//读入文件,写入io流,第一个参数 为写入的比特流 对象,参数二是起始位,参数三是结束位 //read 的返回值为 读入数据的长度,及时读入文件的长度System.out.println(m+"----------");for (int i = 0; i < m; i++) {System.out.println(buf[i]);}} catch (FileNotFoundException e) {.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//读入操作方法 03public static void inputdemo03(){try {FileInputStream fis=new FileInputStream("G:/src/textouts.txt");//获取文件byte [] buf=new byte[fis.available()];//定义字节数大小 available()方法能 返回读入文件的字节长度  但是不不建议这种操作方法//第一因为java虚拟机的内存有限 第二 电脑的内存有限  加载过大的文件  会产生错误所以 建议使用 inputdemo方法  循环读取fis.read(buf);System.out.println(new String(buf));} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//读入操作方法 2public static void inputdemo(){FileInputStream fis=null;try { fis=new FileInputStream("G:/src/textouts.txt");//获取文件byte [] buf=new byte[3];//定义字节数大小int len=0;while ((len=fis.read(buf))!=-1) {//每次将读到的字节写入 字节数组System.out.println(new String(buf,0,len));}fis.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}


当然字节流也缓冲区 下面我们学习下字节流的缓冲区

我们通过赋值一个mp3的案例来学习怎么使用缓冲区  详细说明在注释中,

 

public class copmp { public static void main(String[] args) {long start=System.currentTimeMillis();//记录程序启动时间copymp3();long end=System.currentTimeMillis();//复制完时间System.out.println((end-start)+"毫秒");//计算耗时 多少}public static void  copymp3(){FileInputStream fis=null;//创建一个文件读入对象 既被复制的文件目录FileOutputStream fos=null;//创建一个文件写入对象 既复制的目录BufferedInputStream bis=null;//创建一个读入缓冲区BufferedOutputStream bos=null;//创建一个写入缓冲区try { fis=new FileInputStream("g:\\src\\a.mp3");//实例化 对象  写入目录 fos=new FileOutputStream("g:\\b.mp3");// bis=new BufferedInputStream(fis);// bos=new BufferedOutputStream(fos); int by=0; while ((by=bis.read())!=-1) { bos.write(by);} bis.close(); bos.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


 

最后 我们来学习一个转换流  

 

public class copmp { public static void main(String[] args) {outsysdemo();}/********** * 直接使用readline 完成键盘输入一行数据的地读取 * 而此时  readline 是burreredreader 类的方法  是字符流的方法 * 而 read是字节流 inputsteam的方法 * 下面我们学习一个将字节流 转成字符流 使用 字符流的对象 * 转换流  字符流体系中的成员 */public static void  sysinter(){InputStream in=System.in;//将字节流对象 转换成字符流的对象  使用转换流 inoutstreamreaderInputStreamReader isr=new InputStreamReader(in);// 提高效率 我们使用 bufferedreaderBufferedReader buf=new BufferedReader(isr);//String line=null;try {while ((line=buf.readLine())!=null) {if("down".equals(line)){break;//当接收down字符时  终止程序}System.out.println(line.toUpperCase());//转换为大写 方法}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/********** *  */public static void  outsysdemo(){InputStream in=System.in;//将字节流对象 转换成字符流的对象  使用转换流 inoutstreamreaderInputStreamReader isr=new InputStreamReader(in);// 提高效率 我们使用 bufferedreaderBufferedReader buf=new BufferedReader(isr);OutputStream out=System.out;OutputStreamWriter osw=new OutputStreamWriter(out);BufferedWriter bufw=new BufferedWriter(osw);String line=null;try {while ((line=buf.readLine())!=null) {bufw.write(line.toUpperCase());bufw.newLine();//换行bufw.flush();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

  下面 我们来总结一下

  1.使用 明确 源和目的

源 输入流 inputstream reader

目的 输出流 outputstream writer

  2.操作是否为纯文本

纯文本 字符流

非文本 字节流

3.明确对象

原设备 :内存 硬盘  键盘

目的设备; 内存 硬 盘 控制台

 

例如:将文本文件复制

源:读取流   文本文件 所以选择reader 

设备 硬盘 所以filereader

目的: 输入流 文本 选择 writer 

设备硬盘 所以 filewriter

 

是否需要提高效率 

Bufferedreader bufferedwriter

2.将键盘录入 保存文件中

源:文本   reader

设备键盘 对应 system.in 字节流 可转为字符流 字符串操作 转换流 inputstreamreader

提高效率 bufferedreader

目的:文本 writer 设备硬盘  filewriter

0 0
原创粉丝点击