一.IO流概述
(1)
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流与字符流
流按流向分为:输入流,输出流。
(2)
IO流常用基类
字节流的抽象基类
InputStream,OutputStream
字符流的抽象基类
Reader,Writer
这四个类派生出的子类名称都是以其父类名作为子类名的后缀。
二.字符流
1.FileWrite
数据的最常见体现形式是文件
FileWriter是专门用于操作文件的Writer子类对象,无空参的构造函数,因为该对象一杯初始化就必须要明确被操作的文件。也米有特有的方法,只有继承来的共性方法。
FileWriter(String fileName)
(1)创建一个文件并且输入一定内容
第一步,创建存储文件
FileWritier fw=new FileWriter("")//此处需要对IO异常进行处理,可以抛也可以try。创建一个文件并且该文件会被创建在指定的目录下。如果该目录下已有同名文件将会被覆盖。该步就是要明确数据要存储的位置。
第二步,调用Writer的写入方法,将字符串写入到流中
fw.write("");//该方法也会抛出内存异常
第三步,刷新流对象中缓冲的数据,并将该数据刷入到目标文件中。
fw.flush();//同样会抛出异常,另外fw.close()也可以刷新流,但是会关闭流资源,不能再对流进行操作从而不能再写入数据。只能出现不再使用该流的时候用来释放资源。
完整代码如下
FileWriter fw = null;//外部建立写入流引用,因为如果词语写在try语句中,在finally语句中则无法访问到该对象。 try{ fw = new FileWriter("Test.txt");//创建流与写入方法时会抛出异常进行异常处理 fw.write("text"); } catch (IOException e){ System.out.println(e.toString()); } finally{ If(fw!=null)//此处必须进行判断以防止流创建时格式不对创建不成功,方法找不到调用的对象 try{ fw.close();//同样也会抛出异常进行处理 } catch (IOException e){ System.out.println(e.toString()); } }
(2)续写一个文件
FileWriter(String fileName,boolean append);通过构造函数创建流,当append为true时,不覆盖已有文件,并在已有文件的末尾处进行数据的续写。其他过程与上步骤一致。
2.FileReader
该流读取数据有两种方式,一是单个字符去读,一是以字符数组为单位去读取
(1)
第一步;FileReader fr=new FileReader("");//创建一个文件读取刘对象,和指定名称的文件相关联,而且要保证该文是已经存在的,如果不存在会发生异常FileNotFoundException是IOException的子类。
第二步;fr.read();返回一个int型对象字符的int表示,需要强制转换成Char类型,一次只读取一个字符,而且再读的时候会读取下一个。当已达到流的末尾时,会返回-1。返回时int型不是byte型是因为当碰巧取到111111111时也是-1就可能造成程序停止,所以提升成int型,有多个字节存储一个字节,在前面补00000000111111111
完整代码如下
FileReader fr = null; try{ fr = new FileReader("c:\\test.txt"); int ch=0; while((ch=fr.read())!=-1){ System.out.prinln("ch="+(Char)ch); } } catch (IOException e){ System.out.println("read-Exception :"+e.toString()); } finally{ if(fr!=null){ try{ fr.close(); } catch (IOException e){ System.out.println("close-Exception :"+e.toString()); }
}
}
(2)
以字符数组为单位读取,与上部分代码没有太大区别,数据的容器变了而已
代码如下
FileReader fr = null; try{ fr = new FileReader("c:\\test.txt"); char[] buf = new char[1024];//通常数组长度定义为1024的整数倍。 int len= 0; while((len=fr.read(buf))!=-1){ System.out.println(new String(buf,0,len));//当最后一行未能占满数组内容时,读取数组中的一部分。 } } catch (IOException e){ System.out.println("read-Exception :"+e.toString()); } finally{ if(fr!=null){ try{ fr.close(); } catch (IOException e){ System.out.println("close-Exception :"+e.toString()); }
}
}
3.缓冲区技术
(1)BufferedWriter
字符流的缓冲区
不同于之前读一次写一次,提高了对数据读写的效率
缓冲区要结合流才可以使用,在流的基础上对功能进行了增强。
BufferedWriter(Writer out);构造函数中传入写入流作为实际参数,所以在创建缓冲区之前必须要先有流对象,此构造方法创建一个默认大小的缓冲字符写入流。
//第一步创建一个写入流 FileWriter fw=new FileWriter(""); //第二步加入缓冲技术 BufferedWriter bufw=new BufferedWriter(fw); //第三步调用BufferedWriter的写入方法 bufw.write("");//因为缓冲区BufferedWriter是FileWriter的子类,所以可以使用从父类中继承的方法。记住只要用到缓冲区,就要记得刷新缓冲流, bufw.flush(); bufw.close();//此处关闭缓冲区其实也就是关闭缓冲中流对象,所以不用在fw.close(); newLine()//换行,缓冲区中的特有方法将换行动作进行了封装,是跨平台的换行方法。在写入的时候使用、
(2)BufferReader
BufferedReader(Reader r);构造函数中传入读取流作为实际参数。
//第一步创建读取流对象与目标文件相关联 FileReader fr=new FileReader(""); //第二步创建缓冲区,将字符读取流对象作为实际参数换递给缓冲对象 BufferedReader bufr =new BufferReader(fr); //第三步,对文本数据进行读取 String line=null;//缓冲区提供了一次读取一行的方法readLine(),方便文本数据的获取,此处用来读取返回的字符串类型数据,当没有数据的时候返回null,可以用来当做判断条件停止读取动作 while((line=bufr.readLine())!=null){ System.ou.println(line);//返回的数据不包含终止符,所以需要手动换行。 } bufr.close();//同样缓冲区读取对象的关闭也是关闭读取流。
三.字节流
操作与字符流一样,只不过字符流有码表对应字符操作文本,而字节流没有码表。
InputStream读取,OutputStream写入
FileOutputStream fos=new FileOutputStream("");
fos.write("".getBytes());//字节流没有指定缓冲区的时候是没有缓冲的,不像字符流需要缓冲字节查表转换保存然后再刷新。但是依然需要关闭资源
fos.close();
读取操作依然是有上面两种方式。但是还有一种特有的读取方式
通过available()方法返回可读取的全部字节数,然后指定对应大小的数组,一次读取然后输出,不用再通过事先指定数组的长度用循环的方式读取。
byte []buf=new byte[fis.available()]//但是只建议在数据大小较小时使用,如果过大可能会造成内存溢出的情况。
fis.read(buf);
四.其他常用流对象
1.读取转换流提高了效率。
字节流转换成字符流的桥梁
InputStreamReader(InputStream in)
//第一步获取键盘录入对象 InputStream in=System.in; //第二步将获取的字节流转换成字符流对象,使用转换流 InputStreamReader isr=new InputStreamReader(in); //第三步为了提高效率,加入字符流缓冲区计数 BufferReader bufr=new BufferReader(isr); String line=null; while((line=bufr.readLine())!=null){ if("over".equals(line)) break; System.out.println(line.toUpperCase()); } bufr.close();
2.写入转换流
字符流转换成字节流的桥梁
OutputStreamWriter(OutputStream out)
3.标准输入输出流
System类中的字段:in,out。
它们各代表了系统标准的输入和输出设备。
默认输入设备是键盘,输出设备是显示器。
System.in的类型是InputStream.
System.out的类型是PrintStream是
OutputStream的子类FilterOutputStream 的子类。
4.流操作规律
通过两个明确来完成
第一明确源和目的。
第二明确操作数据类型。
第三明确要使用哪个具体的对象。