java13-IO输入输出流

来源:互联网 发布:python执行linux命令 编辑:程序博客网 时间:2024/05/18 15:54

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


(Input  Output)流

用来处理设备之间的数据传输。java对数据的操作是通过流的方式。java用于操作流的对象都在IO包中。
按操作数据类型分为两种:字节流与字符流。
按流向分为:输入流,输出流。


IO流常用基类
字节流抽象基类
InputStream,OutputStream
字符流抽象基类
Reader,Writer


这四个类派生出来的子类名称都是以父类名作为子类名的后缀。功能为前缀。
如:InputStream的子类FileInputStream
Reader的子类FileReader


2.字符流
Reader,Writer
/*
使用文件操作的Writer子类对象FileWriter。
建立对象,明确数据存放的目的地。
write方法,将字符串写入到流中
flush将数据刷到目的地中
close刷新后流关闭


和flush区别是,flush只是刷新,流还在。close刷新后流关闭刷新后流关闭


*/

import java.io.*;class FileWriterDemo{public static void main(String[] args) throws IOException//建立对象时可能会有异常{/*创建一个FileWriter对象,这个对象一被初始化就必须要明确被操作的文件。该文件会被创建到指定目录下,目录下若有同名文件,会被覆盖。就是明确数据存放的目的地。*/FileWriter fw = new FileWriter("demo.txt");//调用方法write,将字符串写入到流中fw.write("adc");//刷新流对象中缓冲中的数据,将数据刷到目的地中。//fw.flush();/*关闭流资源,但关闭前会刷新一次内部缓冲中的数据将数据刷到目的地中和flush区别是,flush只是刷新,流还在。close刷新后流关闭*/fw.close();}}

3.IO异常基本处理


/*
IO异常的基本处理
1,创建空对象在成员位置,以便作用于类中。

2,try对象初始化,开始输入,以便处理异常。

3,对异常处理。
4,finally关闭缓存。先判断对象是否为空,然后确是否关闭,关闭要try,catch处理。
*/


import java.io.*;class EWriter{public static void main(String[] args){FileWriter fw = null;try{fw = new FileWriter("w:\\demo.txt");//win中\\反转字符fw.write("cabadd");}catch(IOException e){System.out.println("io"+e.toString());//处理异常}finally{if(fw!=null)//判断close是否需要执行try{fw.close();}catch(IOException e){System.out.println(e.toString());}}}}4.对已经存在的文件续写import java.io.*;class XxWriter{public static void main(String[] args){FileWriter fw = null;try{fw = new FileWriter("demo.txt",true);//通过传递一个true,使文件不被覆写,并在文件结尾续写fw.write("cbn");}catch(IOException e){System.out.println(e.toString());}finally{if(fw!=null)try{fw.close();}catch(IOException e){System.out.println(e.toString());}}}}5.读取文件FileReader和FileWriter相似。创建对象,与文件相关联。要保证文件存在,不然会文件不存在异常。读取方法read()一次读一个字符,自动往下读,到文件末尾会自动返回-1.int ch =0;while((ch=对象.rese())!=-1){}------read(char[])返回的是读到的字符个数定义一个字符数组,存储读到的字符char[] buf = new char[1024整数倍];int num = 0;while((num=fr.read(buf))!=-1){new String(buf,0,num)// 返回 char 数组参数的特定子数组的字符串表示形式。}练习:复制文件1,确定要复制文件位置,存储位置2,建立数组,读取文件数据存入数组,数组中文件写入3,关闭流import java.io.*;class Filerw{public static void main(String[] args){//建立流对象变量,初始化为空FileReader fr = null;FileWriter fw = null;try{//确定位置fr = new FileReader("F:\\JAVA学习\\javalx\\MapDemo.java");fw = new FileWriter("F:\\MapDemo.java");//建立字符数组,确定数组长度,用于存储数据char[] ch = new char[1024];//读取文件数据存入数组,并把数组中数据传入写入流//定义变量确定读取的个数int len = 0;while((len=fr.read(ch))!=-1){fw.write(ch,0,len);}}catch(IOException e)//处理异常{throw new RuntimeException("读写失败");}//关闭流finally{if(fr!=null)try{fr.close();}catch(IOException e){throw new RuntimeException("关闭流失败");}if(fw!=null)try{fw.close();}catch(IOException e){throw new RuntimeException("关闭流失败");}}}}



字符流的缓冲区
继承了字符流接口,加了自己的方法。
缓冲区的出现提高了对数据的读写效率。
对应类有
BufferedWriter
BufferedReader
缓冲区要结合流才能使用,对流的功能进行了增强。


建立流对象,建立缓冲区对象bufw(写入),bufr(读取),并把流对象作为参数传入缓冲区的构造函数。
调用缓冲区方法操作文件,
bufw.write("ddd");//写入
bufw.newLine();//换行,不区分系统
bufw.flush();//只要使用缓冲区,就要刷新。
bufw.close();//关闭缓冲区,就是关闭缓冲区中的流对象。
bufr.read();
bufw.readLine();//读取一行;结尾时返回空
bufw.close();//关闭缓冲区


/*
自己写一个BufferedReader
因为缓冲区是给流调用的,异常不能try,只能throws.
1,设置构造函数要有字符流对象参数。
2,定义读取方法,一次一行
3,定义关闭方法,关闭流对象


FileReader
*/

import java.io.*;class MyBufferedReader{//设置私有参数FileReaderprivate FileReader r;//MyBufferedReader(){}//设置构造参数MyBufferedReader(FileReader r){this.r = r;}//设置myReadLinepublic String myReadLine()throws IOException{//设置数据存储容器,偷懒不用字符数组,直接用字符串容器StringBuilder sb= new StringBuilder();//读取字符并存入容器,直到换行int ch = 0;while((ch=r.read())!=-1){//if(ch=='\r')continue;if(ch=='\n')return sb.toString();elsesb.append((char)ch);}//没有数据时返回null;if(sb.length()!=0)return sb.toString();return null;}//定义关闭流对象方法public void myClose()throws IOException{r.close();}}class MyBufferedReaderDemo{public static void main(String[] args){//定义读取流对象FileReader fr =null;MyBufferedReader myBuf = null;try{fr = new FileReader("TreeSet.java");//建立缓冲区对象myBuf = new MyBufferedReader(fr);//读取String line = null;while((line=myBuf.myReadLine())!=null){//换行没有存入,输出时要加上换行System.out.println(line);}}catch(IOException e){throw new RuntimeException("读取错误");}finally{if(myBuf!=null)try{myBuf.myClose();}catch(IOException e){throw new RuntimeException("关闭异常");}}}}LineNumberReaderBufferedReader的子类多了设置和获取行号的功能。也是装饰类。setLineNumber();getLineNumber();//设置在哪开始 

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