IO流知识点总结

IO流知识点总结


 * 一、IO流概述

 * 1.字符流和字节流基类
 * 字节流两个基类:InputStream  OutputStream  -操作图片
 * 字符流两个基类:Reader           Writer               -操作文字
 
 * 2.字符流和字节流子类
 * 字符流: FileReader               FileWriter 
 *            BufferedReader        BufferedWriter
 * 字节流:FileInputStream           FileOutputStream
 *              BufferedInputStream   BufferedOutputStream

 * 3.流操作的基本规律(重点)
 * 通过三个明确来完成:
 *(1)明确源和目的
 * 源    : 输入流  InputStream    Reader
 * 目的: 输出流  OutputStream  Writer
 *(2)操作的数据是否是纯文本
 * 是:字符流   否:字节流
 *(3)当体系明确后,再明确要使用哪个具体的对象
 * 通过设备来进行区分:
 * 源设备   :硬盘 FileStream;内存 ArrayStream;键盘 System.in
 * 目的设备:硬盘 FileStream;内存 ArrayStream;控制台 System.out;


 * 二、字符流

 * 1.FileWriter
 *(1)FileWriter:用于操作文件的Writer子类对象。后缀名是父类名,前缀名是该流对象的功能。
 *(2)常用方法:
 * void write(String str);//写入数据
 * void flush();//刷新
 * void close();//关闭
 *(3)常用demo
 * FileWriter fw = new FileWriter("demo.txt",true);//创建一个FileWriter对象,传送一个true参数,
 *                                                //代表不覆盖已有的文件,并在已有文件的末尾处进行数据续写。
 * fw.write("as\r\ndfg");//调用write方法,将字符串写入到流中,“\r\n ”表示换行
 * fw.flush();//刷新流对象中的缓冲中的数据 ,将数据刷到目的地中
 * fw.close();//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据

 * 2.FileReader
 *(1)常用方法:
 * int read();//读取
 * void close();//关闭
 *(2)文本文件两种读取方式:
 * 第一种方式:通过字符进行读取
 * FileReader fr = new FileReader("demo.txt");//创建一个文件读取流对象
 * int ch = 0;
 * while((ch=fr.read())!=-1){//调用读取流对象的read方法。read():一次读一个字符,而且会自动往下读。
 * System.out.println((char)ch);
 * }
 * fr.close();//关闭流资源  
 * 第二种方式:通过字符数组进行读取
 * FileReader fr = new FileReader("demo.txt");
 * char[] ch = new char[1024];//定义一个字符数组,用于存储读到字符。一般长度写1024
 * int num = 0;
 * while((num=fr.read(ch))!=-1){//read(char[])返回的是读到字符个数
 *      System.out.print(new String(ch,0,num));//将字符数组转化成字符串
 * }
 * fr.close();

 * 3.BufferedWriter
 * 该缓冲区中提供了一个跨平台的换行符:newLine()
 * 常用demo:
 * FileWriter fw = new FileWriter("buf.txt");//创建一个字符写入流对象
 * BufferedWriter bufw = new BufferedWriter(fw);
 * for(int x=0;x<5;x++){
 * bufw.write("abcde"+x);
 * bufw.newLine();//换行 跨平台
 * bufw.flush();//记住:只要用到缓冲区,就要记得刷新
 * }
 * bufw.close();

 * 4.BufferedReader
 * 该缓冲区提供了一个一次读一行的方法:readLine()
 * 常用demo:
 * FileReader fr = new FileReader("buf.txt");//创建一个读取流对象和文件相关联
 * BufferedReader bufr = new BufferedReader(fr);
 * String line = null;
 * while((line=bufr.readLine())!=null){//读取一行
 * System.out.println("line:"+line);
 * }
 * bufr.close();

 * 5.LineNumberReader
 * 常用方法:
 * int getLineNumber():获取当前行号
 * void setLineNumber(int lineNumber):设置当前行号


 * 三、字节流

 * 1.自定义字节流的缓冲区
 * 思路:定义数组;定义指针;定义计数器

 * 2.读取键盘录入
 * System.out:对应的是标准输出设备:控制台;
 * System.in  :对应的是标准输入设备:键盘


 * 四、File

 * 1.File类常见方法
 *(1)创建
 * boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
 * 注:和输出流不一样,输出流对象一建立便创建文件,而且文件已经存在,会覆盖。
 * boolean mkdir()  :创建文件夹
 * boolean mkdirs():创建多级文件夹
 *(2)删除
 * boolean delete()     :删除失败返回false。如果文件正在被使用,则删除不了返回false
 * void deleteOnExit():在程序退出时删除指定文件
 *(3)判断
 * boolean exists()           :文件是否存在
 * boolean canExecute() :是否是可执行文件
 * boolean isFile()           :是否是文件
 * boolean isDirectory() :是否是目录
 * boolean isHidden()    :是否是隐藏文件
 * boolean isAbsolute() :是否是绝对路径
 *(4)获取信息
 * String getName()  :获取名字
 * String getPath()    :获取路径
 * String getParent() :获取父目录
 * String getAbsolutePath():获取绝对路径
 * long lastModified():获取最后一次修改时间
 * long length()         :获取长度
 *(5)其他
 * boolean renameTo(File dest):给文件重命名
 * 附:String separator:跨平台的分隔符

 * 2.File对象功能-文件列表
 * File[] listFiles()   :返回文件对象
 * File[] listRoots():列出可用的文件系统根
 * String[] list():返回当前目录下的文件或目录
 * String[] list(FilenameFilter filter):文件名过滤器


 * 五、Properties

 * 1.Properties简述:map+io->properties
 * Properties是hashTable的子类。也就是说,它具备map集合的特点,而且它里面存储的键值对都是字符串。
 * 是集合中和IO技术相结合的集合容器。
 * 该对象的特点:可以用于键值对形式的配置文件。那么在加载数据时,需要数据有固定格式:键=值。

 * 2.Properties常用方法
 *(1)Object setProperty(String key,String value):设置(只对内存进行修改)
 *(2)String getProperty(String key):获取
 *(3)Set<String> stringPropertyNames():返回键集
 *(4)void load(InputStream inStream):从输入流中读取属性列表(键和值)
 *(5)void store(OutputStream out,String comments):(内存,文件都进行修改),其中comments为对属   *        性列表的描述
 *(6)void list(PrintStream out):将属性列表输出到指定的输出流


 * 六、其他流

 * 1.转换流
 *(1)将字节流对象转成字符流对象,使用转换流:InputStreamReader
 *         将字符流对象转成字节流对象,使用转换流:OutputStreamWriter
 *(2)键盘录入的常见写法:    
 *        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
       
 * 2.打印流
 * 该流提供了打印方法,可以将各种数据类型的数据都原样打印。
 *(1)字节打印流:PrintStream
 * 构造函数可以接收的参数类型:
 * file对象  :File;
 * 字符串路径:String;
 * 字节输出流:OutputStream;
 *(2)字符打印流:PrintWriter
 * 构造函数可以接收的参数类型:
 * file对象  :File;
 * 字符串路径:String;
 * 字节输出流:OutputStream;
 * 字符输出流:Writer

 * 3.合并流
 * SequenceInputStream
 
 * 4.管道流
 * 管道流是IO和多线程的桥梁;Properties是IO和集合的桥梁
 * PipedInputStream与PipedOutputStream

 * 5.操作基本数据类型的数据的流对象DataStream(常用)
 * DataInputStream与DataOutputStream

 * 6.字节数组流
 * ByteArrayStream
 *(1)简述:用于操作字节数组的流对象。
 *(2)ByteArrayInputStream:在构造的时候,需要接收数据源,而且数据源是一个字节数组。
 *        ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了
 *                                               可变长度的字节数组,这就是数据目的地。
 *(3)因为这两个流对象都操作的数组,并没有使用系统资源,所以,不用进行close关闭。


 * 七、其他

 * 1.装饰设计模式 
 *(1)装饰设计模式:
 * 装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
 *(2)装饰和继承的区别:
 * 装饰模式比继承要灵活,避免了继承体系臃肿,而且降低了类与类之间的关系。
 * 装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能,
 * 所以装饰类和被装饰类通常都是属于一个体系中的。

 * 2.改变标准输入输出设备
 * 常用demo:
 * System.setIn(new FileInputStream("/CalendarDemo.java"));
 * System.setOut(new PrintStream("zc.txt"));

 * 3.对象的序列化
 *(1)定义:把Java对象转换为字节序列的过程
 *        ObjectOutputStream与ObjectInputStream
 *(2)常用demo:
 * transient int age;//前面加transient便不会被序列化
 * static String country = "cn";//静态变量不能被序列化

 * 4.RandomAcessFile
 *(1)该类不算是IO体系中子类,而且直接继承自Object。但是它是IO包中成员,因为它具备读和写功能。
 * 内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置,
 * 同时可以通过seek改变指针的位置。其实完成读写的原理就是内部封装了字节输入流和输出流。
 *(2)通过构造函数可以看出,该类只能操作文件,而且操作文件还有模式。只读r,读写rw等。
 * 如果模式为只读r,不会创建文件,会去读取一个已存在的文件;如果该文件不存在,则会出现异常。
 * 如果模式为读写rw,操作的文件不存在,会自动创建,如果存在则不会覆盖。

 * 5.字符编码
 *(1)编码:字符串变成字节数组   String-->byte[]  str.getBytes(charsetName);
 *        解码:字节数组变成字符串   byte[]-->String  new String(byte[],charsetName);
 *(2)转换流的字符编码
 *        OutputStreamWriter与InputStreamReader
 *(3)GBK:一次读两个字节;UTF-8:一次读一或二或三个字节
 *(4)常用demo:
 * String s = "你好";
 * byte[] b = s.getBytes("GBK");//编码
 * System.out.println(Arrays.toString(b1));
 * String s = new String(b,"ISO8859-1");//解码
 * System.out.println("s="+s);


 * 八、常见练习

 * 创建java文件列表
 * 任务:
 * 将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。建立一个java文件列表文件。 
 * 思路:
 *(1)对指定的目录进行递归;
 *(2)获取递归过程所有的java文件的路径;
 *(3)将这些路径存储到集合中;
 *(4)将集合中的数据写入到一个文件中






猜你喜欢

转载自blog.csdn.net/smiling_chang/article/details/81058774