一:IO流概述
IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,Java对于数据的操作都是通过流实现,而Java用于操作流的对象都在IO包中。
分类:
按操作数据分为:字节流和字符流。如:Reader和InputStream
按流向分:输入流和输出流。如:InputStream和OutputStream
字节流的基类:
InputStream , OutputStream
字符流的抽象基类:
Reader , Writer
缓冲流的基类:
BufferReader,BufferWriter (必须依赖于 Reader和Writer)
二进制流的基类:
DataInputStream,DataOutputStream (必须依赖于InputStream 和 OutputStream)
序列化:
ObjectInputStream,ObjectOutputStream (必须依赖于InputStream 和 OutputStream )
我们的程序需要通过InputStream或Reader从数据源读取数据,然后用OutputStream或者Writer将数据写入到目标媒介中。其中,InputStream和Reader与数据源相关联,OutputStream和writer与目标媒介相关联。 以下的图说明了这一点:
二:字符流
1.字符流简介:
01.字符流中的对象融合了编码表,也就是系统默认的编码表。我们的系统一般都是GBK编码。
02.字符流 只用来处理文本数据,字节流用来处理媒体数据。
03.数据最常见的表现方式是文件,字符流用来操作文件的子类一般是FileReader和FileWriter
2.字符流读写:
注意事项:
01.写入文件后必须要用flush()刷新
02.用完流后记得要关闭流
03.使用流对象要抛出IO异常
04.定义文件路径时,可以用"/"或者"\\"
05.在创建一个文件时,如果目录下有同名文件将被覆盖
06.在读取文件时,必须保证该文件已存在,否则出异常
示例:
public class CharDemo { public static void main( String[] args ) { //创建输入和输出流 Reader reader = null; Writer writer = null; try { //目的是明确数据要存放的目的地。 reader = new FileReader("e:/a.txt"); writer = new FileWriter("e:/a.txt",true); //在文件中写入 writer.write("啦啦啦"); writer.write("啦啦啦"); writer.write("我是卖报的小行家"); //清空缓冲区 writer.flush(); writer.write("啦啦啦"); writer.write("啦啦啦"); writer.write("啦啦啦"); writer.close(); //读取 //创建一次性读取多少个字符 char[] data = new char[1024]; int num = 0; StringBuffer sb = new StringBuffer(); //判断如果文件中有数据,则在后面追加数据 while ((num = reader.read(data))!=-1){ sb.append(data); } System.out.println(sb.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { // writer.close();应该放到添加数据完之后 reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
三:字节流
在Java中,字节流一般适用于处理字节数据(诸如图片、视频),字符流适用于处理字符数据(诸如文本文件),但二者并没有严格的功能划分,因为有转换流的存在,使得对于数据的处理变得更加灵活。InputStream和OutputStream分别是字节输入流与字节输出流的基类,它们的子类都是字节流,主要用在按字节来处理二进制数据。废话不多说,上示例!
public class ByteDemo { public static void main( String[] args ) { //创建输入流和输出流对象 InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new FileInputStream("e:/a.txt"); //true 代表是否向文件中拼接,不删除之前的内容 outputStream = new FileOutputStream("e:/a.txt",true); //先向文件写入内容 outputStream.write("54321".getBytes());//outputStream.flush();自己没有实现 //read方法将返回0-255之间的数字 如果流读到了最后,将返回-1 int num = 0; while ((num=inputStream.read())!=1){ System.out.println((char) num); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
四:二进制流
二进制流有两个顶级类:InputStream和OutputStream, 下面的两个类是各种附属类。作为对比,二进制流的关系比字符流的更加多样化和复杂。关于二进制流,LineNumberInputStream和StringBufferInputStream两个类在JDK1.5中,尽量不要使用,因为它们已被弃用。
给你们看一个简单的小示例,来了解一下吧!
public class DataDemo { public static void main(String[] args) { //创建输入流和输出流对象 InputStream inputStream = null; OutputStream outputStream=null; DataInputStream dis = null; DataOutputStream dos=null; try { //获取了输入流 txt进入内存 inputStream=new FileInputStream("e:/a.txt"); dis=new DataInputStream(inputStream); //获取输出流 outputStream=new FileOutputStream("e:/public/a.txt"); dos=new DataOutputStream(outputStream); //先读取 int num=0; while ((num=dis.read())!=-1){ dos.write(num); //复制 } } catch (Exception e) { e.printStackTrace(); }finally { //释放资源 try { dos.close(); dis.close(); outputStream.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }