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)将集合中的数据写入到一个文件中
* 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)将集合中的数据写入到一个文件中