Properties和RandomAccessFile类

             

一、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();    // 关闭此随机访问文件流并释放与该流关联的所有系统资源。
 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Robust28

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值