java的缓冲流及使用Properties集合存取数据(遍历,store,load)

缓冲流 概述

  • 字节缓冲流:BufferedInputStream,BufferedOutputStream
  • 字符缓冲流:BufferedReader,BufferedWriter
缓冲流原理
  • 缓冲区是内存中的一块特定区域,与在内存中定义一个数组的区域不同
【java的缓冲流及使用Properties集合存取数据(遍历,store,load)】java的缓冲流及使用Properties集合存取数据(遍历,store,load)
文章图片

BufferedOutputStream
import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; /* java.io.BufferedOutputStream BufferedOutputStream:字节缓冲输出流继承自父类的共性成员方法: - public void close():关闭此输出流并释放与此流相关联的任何系统资源 - public void flush():刷新此输出流并强制任何缓冲的输出字节被写出 - public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流 - public void write(byte[] b, int off, int len):从指定的字节数组写入len字节,从偏移量off开始输出到此输出流 - public abstract void write(int b):将指定的字节输出流构造方法: BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流 BufferedOutputStream(OutputStream, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流 参数: OutputStream out:字节输出流 我们可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率 int size:指定缓冲流内部缓冲区的大小,不指定默认 使用步骤(重点) 1.创建FileOutputStream对象,构造方法中绑定要输出的目的地 2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象的效率 3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中 4.使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中 5.释放资源(会先调用flush方法刷新数据,第四步可以省略) */ public class Demo01BufferedOutputStream { public static void main(String[] args) throws IOException { //1.创建FileOutputStream对象,构造方法中绑定要输出的目的地 FileOutputStream fos = new FileOutputStream("D:\\environment\\java_project\\javase\\a.txt"); //2.创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象的效率 BufferedOutputStream bos = new BufferedOutputStream(fos); //3.使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中 bos.write("我把数据写入到内部缓冲区中".getBytes()); //4.使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中 bos.flush(); //5.释放资源(会先调用flush方法刷新数据,第四步可以省略) bos.close(); } }

BufferedInputStream
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; /* java.io.BufferedInputStream extends InputStream BufferedInputStream:字节缓冲输入流继承自父类的成员方法: int read()从输入流中读取数据的下一个字节 int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中 void close()关闭此输入流并释放与该流关联的所有系统资源构造方法: BufferedInputStream(InputStream in) 创建一个BufferedInputStream并保存其参数,即输入流in,以便将来使用 BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in,以便将来使用 参数: InputStream in:字节输入流 我们可以传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读取效率 int size:指定缓冲流内部缓冲区的大小,不指定默认使用步骤(重点): 1.创建FileInputStream对象,构造方法中绑定要读取的数据源 2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象的读取效率 3.使用BufferedInputStream对象中的方法read,读取文件 4.释放资源 */ public class Demo02BufferedInputStream { public static void main(String[] args) throws IOException { //1.创建FileInputStream对象,构造方法中绑定要读取的数据源 FileInputStream fis = new FileInputStream("D:\\environment\\java_project\\javase\\a.txt"); //2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象的读取效率 BufferedInputStream bis = new BufferedInputStream(fis); //3.使用BufferedInputStream对象中的方法read,读取文件 //int read()从输入流中读取数据的下一个字节 /*int len = 0; //记录每次读取到的字节 while ((len = bis.read())!=-1){ System.out.println(len); }*///int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中 byte[] bytes = new byte[1024]; int len = 0; while ((len = bis.read(bytes))!=-1){ System.out.println(new String(bytes,0,len)); }//4.释放资源(只关闭缓冲流即可,关闭缓冲流会自动将字节流关闭) bis.close(); } }

BufferedWriter
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; /* java.io.BufferedWriter extends Writer BufferedWriter:字符缓冲输出流继承自父类的共性成员方法: - void write(int c) 写入单个字符 - void write(char[] cbuf) 写入字符数组 - abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len写的字符个数 - void write(String str) 写入字符串 - void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数 - void flush() 刷新该流的缓冲 - void close() 关闭此流,但要先刷新它构造方法: BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流 BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流 参数: Writer out:字符输出流 我们可以传递FileWriter,缓冲流会给FileWriter增加一个缓冲区,提高FileWriter的写入效率 int sz:指定缓冲区的大小,不写默认大小特有的成员方法: 换行:void newLine() 写入一个行分隔符,会根据不同的操作系统,获取不同的行分隔符 换行:换行符号 windows:\r\n linux:/n mac:/r 使用步骤: 1.创建字符缓冲输出流对象,构造方法中传递字符输出流 2.调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中 3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中 4.释放资源 */ public class Demo03BufferedWriter { public static void main(String[] args) throws IOException { //System.out.println(); 其中调用的ln方法就是newLine()。 //1.创建字符缓冲输出流对象,构造方法中传递字符输出流 BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\environment\\java_project\\javase\\a.txt")); //2.调用字符缓冲输出流中的方法write,把数据写入到内存缓冲区中 for (int i = 0; i < 10; i++) { bw.write("传智播客"); //bw.write("\r\n"); bw.newLine(); } //3.调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中 bw.flush(); //4.释放资源 bw.close(); } }

BufferedReader
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /* java.io.BufferedReader extends Reader继承自父类的共性成员方法: int read() 读取单个字符并返回 int read(char[] cbuf) 一次读取多个字符,将字符读入数组 void close() 关闭该流并释放与之关联的所有资源构造方法: BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流 BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流 参数: Reader in:字符输入流 我们可以传递FileReader,缓冲流会给FileReader增加一个缓冲区,提高FileReader的读取效率 特有的成员方法: String readLine() 读取一个文本行,读取一行数据 行的终止符号:通过下列字符之一即可认为某行已终止:换行('\n')、回车('\r')或回车后直接跟着换行(\r\n)。 返回值: 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null使用步骤: 1.创建字符缓冲输入流对象,构造方法中传递字符输入流 2.使用字符缓冲输入流对象中的方法read/readLine读取文本 3.释放资源 */ public class Demo04BufferedReader { public static void main(String[] args) throws IOException { //1.创建字符缓冲输入流对象,构造方法中传递字符输入流 BufferedReader br = new BufferedReader(new FileReader("D:\\environment\\java_project\\javase\\a.txt")); //2.使用字符缓冲输入流对象中的方法read/readLine读取文本 /*String line = br.readLine(); System.out.println(line); line = br.readLine(); System.out.println(line); line = br.readLine(); System.out.println(line); line = br.readLine(); System.out.println(line); line = br.readLine(); System.out.println(line); *//* 发现以上读取是一个重复的过程,所以可以使用循环优化 不知道文件中有多少行数据,所以使用while循环 while的结束条件,读取到null结束 */ String line; while ((line = br.readLine())!=null){ System.out.println(line); } //3.释放资源 br.close(); } }

使用Properties集合存储数据,遍历,store,load
import java.io.*; import java.util.Properties; import java.util.Set; /* java.util.Properties集合 extends Hashtable implements Map Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载 Properties集合是一个唯一和IO流相结合的集合 可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储 可以使用Properties集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用属性列表中每个键及其对应值都是一个字符串 Properties集合是一个双列集合,key和value默认都是字符串 */ public class Demo01Properties { public static void main(String[] args) throws IOException { show01(); show02(); show03(); }/* 可以使用Properties集合中的方法load,把硬盘中(键值对),读取到集合中使用 void load(InputStream inStream) void load(Reader reader) 参数: InputStream inStream:字节输入流,不能读取含有中文的键值对 Reader reader:字符输入流,能读取含有中文的键值对 使用步骤: 1.创建Properties集合对象 2.使用Properties集合对象中的方法load读取保存键值对的文件 3.遍历Properties集合 注意: 1.存储键值对的文件中,键与值默认的连接符号可以使用=,空格(或其他符号) 2.存储键值对的文件中,可以使用#进行注释,被注释的键值对不会再被读取 3.存储键值对的文件中,键与值默认都是字符串,不用再加引号 */ private static void show03() throws IOException{ //1.创建Properties集合对象 Properties prop = new Properties(); //2.使用Properties集合对象中的方法load读取保存键值对的文件 prop.load(new FileReader("D:\\environment\\java_project\\javase\\prop.txt")); //3.遍历Properties集合 Set set = prop.stringPropertyNames(); for (String key : set) { String value = https://www.it610.com/article/prop.getProperty(key); System.out.println(key+"="+value); } }/* 可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储 void store(OutputStream out, String comments) void store(Writer write, String comments) 参数: OutputStream out:字节输出流,不能写中文 Writer writer:字符输出流,可以写中文 String comments:注释,用来解释说明保存的文件是做什么用的 不能使用中文,会产生乱码,默认是Unicode编码 一般使用""空字符串使用步骤: 1.创建Properties集合对象,添加数据 2.创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地 3.使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储 4.释放资源 */ private static void show02() throws IOException { //1.创建Properties集合对象,添加数据 Properties prop = new Properties(); prop.setProperty("赵丽颖","168"); prop.setProperty("迪丽热巴","165"); prop.setProperty("古力娜扎","160"); //2.创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地 FileWriter fw = new FileWriter("D:\\environment\\java_project\\javase\\prop.txt"); //3.使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储 prop.store(fw,"save data"); //4.释放资源 fw.close(); //字符流可以写中文,字节流不能写中文 //prop.store(new FileOutputStream("D:\\environment\\java_project\\javase\\prop.txt"),""); //匿名对象使用完后自动关闭}/* 使用Properties集合存储数据,遍历取出Properties集合中的数据 Properties集合是一个双列集合,key和value默认都是字符串 Properties集合有一些操作字符串的特有方法 Object setProperty(String key, String value) 调用Hashtable的方法put String getProperty(String key) 通过key找到value值,此方法相当于Map集合中的get(key)方法 Set stringPropertyNames() 返回此属性列表中的键集,其中该键及其对应值是字符串,此方法相当于Map集合中的keySet方法 */ private static void show01() { //创建Properties集合对象 Properties prop = new Properties(); //使用setProperty往集合中添加数据 prop.setProperty("赵丽颖","168"); prop.setProperty("迪丽热巴","165"); prop.setProperty("古力娜扎","160"); //使用stringPropertyNames把Properties集合中的键取出,存储到一个Set集合中 Set set = prop.stringPropertyNames(); //遍历Set集合,取出Properties集合中的每一个键 for (String key : set) { //使用getProperty方法通过key获取value String value = https://www.it610.com/article/prop.getProperty(key); System.out.println(key+"="+value); } } }

    推荐阅读