一、Properties的概述及其方法
1、Properties的概述
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。
因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put和 putAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。相反,应该使用 setProperty 方法。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键)上调用 propertyNames 或 list 方法,则该调用将失败。
load(Reader) / store(Writer, String) 方法按下面所指定的、简单的面向行的格式在基于字符的流中加载和存储属性。除了输入/输出流使用 ISO8859-1 字符编码外,load(InputStream) / store(OutputStream, String) 方法与 load(Reader)/store(Writer, String) 对的工作方式完全相同。可以使用 Unicode 转义来编写此编码中无法直接表示的字符;转义序列中只允许单个 'u' 字符。可使用 native2ascii 工具对属性文件和其他字符编码进行相互转换。loadFromXML(InputStream) 和 storeToXML(OutputStream, String, String)
方法按简单的 XML 格式加载和存储属性。默认使用 UTF-8 字符编码,但如果需要,可以指定某种特定的编码。
2、Properties的方法
1、getProperty(String key)
用指定的键在此属性列表中搜索属性。
2、propertyNames()
返回属性列表中所有键的枚举,如果在主属性列表中未找到同名的键,则包括默认属性列表中不同的键。
3、list(PrintStream out)
将属性列表输出到指定的输出流。
4、setProperty(String key,String value)
调用Hashtable 的方法 put
。
5、store(OutputStream out,String comments)
以适合使用load(InputStream)
方法加载到Properties
表中的格式,将此Properties
表中的属性列表(键和元素对)写入输出流。
6stringPropertyNames()
返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。
7、loadFromXML(InputStream in)
将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。
3、实例
(1)演示,如何将流中数据存储到集合中。
想要将info.txt中的键值数据存到集合中进行操作
1、用一个流和info.txt文件关联。
2、读取一行数据,将该行数据用”=“进行切割
3、等号左边作为键,右边作为值。存入到Properties集合中即可
public static void method1() throws IOException
{BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));//创建带缓冲区的读取流对象
String line = null;
Properties prop = new Properties(); //创建一个Properties对象
while ((line = bufr.readLine()) != null) //循环读取
{
String[] arr = line.split("="); //将读取的内容以=号分割
// System.out.println(line);
prop.setProperty(arr[0], arr[1]); //将分割后的内容加入到prop中
}
bufr.close(); //关闭缓冲区
System.out.println(prop);//打印prop内容
}
(2)设置和获取元素
public static void setAndGet()
{
Properties prop=new Properties();
//设置prop的键和值
prop.setProperty("张三", "30");
prop.setProperty("lisi","39");
prop.setProperty("lisi"," ");
//System.out.println(prop);
String value=prop.getProperty("lisi");//定义键为“lisi”的值
//System.out.println(value);
Set<String> names=prop.stringPropertyNames();
for(String s:names)
{
System.out.println(s+"::"+prop.getProperty(s)); //输出prop内容
}
}
二、RandomAccessFile类及其方法
1、RandomAccessFile类
该类不是算IO体系中子类,而是直接继承自Object。但是它是IO包中的成员。因为它具备读和写功能。
内部封装了一个数组,而且通过指针对数组的元素进行操作,可以通过getFilePointer获取指针位置,并通过 seek
方法设置。
其完成读写的原理就是内部封装了字节输入流和输出流
通过构造函数可以看出,该类智能操作文件
而且操作文件还有模型:只读r,读写rw等
如果模式为只读r。不会创建文件。会去读取一个已存在,如果该文件不存在,则会出现异常。
如果模式rw.操作的文件不存在,会自动创建。如果存在则不覆盖
2、RandomAccessFile类的主要方法
(1)close()
关闭此随机访问文件流并释放与该流关联的所有系统资源。
(2)getFilePointer()
返回此文件中的当前偏移量
(3)length()
返回此文件的长度。
(4)read(byte[] b)
将最多b.length
个数据字节从此文件读入 byte 数组。
(5)seek(long pos)
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
(6)write(byte[] b)
将b.length
个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
(7)writeUTF(String str)
使用modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。
(8)readUTF()
此文件读取一个字符串。
3、代码实现
通过RandomAccessFile类向ran.txt中写入和读取数据。
public static void writeFile_1() throws IOException
{
RandomAccessFile raf=new RandomAccessFile("ran.txt","rw");
//当设置成0的时候,若有原来数据,则会替换。当设置成大的数字时,中间会闪出空格
raf.seek(8);
//将“多少”长度字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
raf.write("多少".getBytes());
raf.writeInt(91); // 按四个字节将 int
写入该文件,先写高字节。
raf.close(); // 关闭此随机访问文件流并释放与该流关联的所有系统资源。
}
public static void readFile() throws IOException
{
//创建RandomAccessFile对象raf,并设置为r只读
RandomAccessFile raf=new RandomAccessFile("ran.txt","r");
// 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取操作
raf.seek(8);
byte[] buf=new byte[4];
raf.read(buf); // 将最多 buf.length
个数据字节从此文件读入 byte 数组。
String name=new String(buf);
int age=raf.readInt();
System.out.println("name="+name); //输出name
System.out.println("age="+age); //输出age
raf.close();// 关闭此随机访问文件流并释放与该流关联的所有系统资源。
}
//通过 RandomAccessFile向ran.txt中写入数据
public static void writeFile() throws IOException
{
//创建RandomAccessFile对象raf,并设置为rw可读可写
RandomAccessFile raf=new RandomAccessFile("ran.txt","rw");
//将 b.length
个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
raf.write("李四".getBytes());
raf.writeInt(91); // 按四个字节将int
写入该文件,先写高字节。
raf.write("李五".getBytes());
raf.writeInt(97);
raf.write("李六".getBytes());
raf.writeInt(92);
raf.write("李起".getBytes());
raf.writeInt(93);
raf.write("李八".getBytes());
raf.writeInt(94);
raf.close(); // 关闭此随机访问文件流并释放与该流关联的所有系统资源。
}