javaIO流概述

一.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.流操作规律
通过两个明确来完成
第一明确源和目的。
第二明确操作数据类型。
第三明确要使用哪个具体的对象。

原文地址:https://www.cnblogs.com/ss561/p/4574343.html