Java基础总结大全(实用四)

9、Properties
(1)Properties是HashTable的子类,具备Map集合的特点,里面存储的是键值对
(2)Properties是IO流合集合相结合的集合容器
(3)Properties的特点是可以用于存储键值对形式的配置文件
(4)构造方法:
Properties() 
创建一个无默认值的空属性列表。 
Properties(Properties defaults) 
创建一个带有指定默认值的空属性列表。 
(5)方法摘要:
Object setProperty(String key, String value) 
调用 Hashtable 的方法 put。
String getProperty(String key) 
用指定的键在此属性列表中搜索属性。 
void load(InputStream inStream) 
从输入流中读取属性列表(键和元素对)。 
void load(Reader reader) 
按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。 
void list(PrintStream out) 
将属性列表输出到指定的输出流。 
void list(PrintWriter out) 
将属性列表输出到指定的输出流。
void store(OutputStream out, String comments) 
以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,
将此 Properties 表中的属性列表(键和元素对)写入输出流。 
void store(Writer writer, String comments) 
以适合使用 load(Reader) 方法的格式,将此 Properties 表中的
属性列表(键和元素对)写入输出字符。 
Set<String> stringPropertyNames() 
返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中
未找到同名的键,则还包括默认属性列表中不同的键 

复制代码
 1 (6)Properties代码示例:
 2 public static void show()
 3 {
 4 Properties prop = new Properties();
 5 prop.setProperty("张三","26");
 6 prop.setProperty("李四","30");
 7 prop.setProperty("王五","35");
 8 sop(prop);
 9 String value = prop.getProperty("张三");
10 
11 Set<String> keys = prop.stringPropertyName();
12 for(String key : values)
13 {
14 sop(key+":"+prop.getPropety(key));
15 }
16 }
复制代码

 

(7)需求:记录应用程序的使用次数,如果使用次数已到,则提示用户注册。
思路:
**第一次使用时建立一个配置文件用于记录使用次数
**每次使用都加载该配置文件,并先判断已使用次数
**每次使用完使用次数加1,写入配置文件

复制代码
 1 public static void main(String[] args) throws IOException{
 2 Properties prop = new Properties();//定义Properties,用来和IO流结合
 3 File file = new File("library\\time.ini");//配置文件
 4 if(!file.exists())
 5 file.createNewFile();//如果文件不存在则创建文件(用于第一次使用时创建文件)
 6 FileInputStream fis = new FileInputStream(file);//定义字节读取流,读取配置文件中记录的使用次数
 7 prop.load(fis);//载入流,以获取文件中配置的键值对
 8 int count = 0;//定义使用次数
 9 String countValue = prop.getProperty("time");//通过键获取值
10 if(countValue!=null){//第一次时countValue为null
11 count = Integer.parseInt(countValue);//将字符串次数变成数字次数
12 if(count>3){
13 System.out.println("您使用次数已到,继续使用请注册!");
14 return;
15 }
16 }
17 count++;//如果使用次数未到则次数加1
18 prop.setProperty("time", count+"");//配置新的键值对
19 FileWriter fos = new FileWriter(file);
20 prop.store(fos, "这是应用程序使用次数的配置文件");//将新的键值对写入文件
21 fis.close();
22 fos.close();    
23 }
复制代码

 

10、IO中的其他流:
(1)打印流:
**PrintWriter:字符打印流
****构造方法:
PrintWriter(String fileName) 
创建具有指定文件名称且不带自动行刷新的新 PrintWriter。
PrintWriter(File file) 
使用指定文件创建不具有自动行刷新的新 PrintWriter。
PrintWriter(Writer out) 
创建不带自动行刷新的新 PrintWriter。 
PrintWriter(Writer out, boolean autoFlush) 
自动刷新
PrintWriter(OutputStream out) 
根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。 
PrintWriter(OutputStream out, boolean autoFlush) 
自动刷新
****方法摘要:
PrintWriter append(char c) 
将指定字符添加到此 writer。 
void close() 
关闭该流并释放与之关联的所有系统资源。 
void flush() 
刷新该流的缓冲。 
void print(Object obj) 
打印对象。 
void print(String s) 
打印字符串。
void println() 
通过写入行分隔符字符串终止当前行。 
**PrintStream:字节打印流
****构造方法:
PrintStream(String fileName) 
创建具有指定文件名称且不带自动行刷新的新打印流。
PrintStream(File file) 
创建具有指定文件且不带自动行刷新的新打印流。
PrintStream(OutputStream out) 
创建新的打印流。 
PrintStream(OutputStream out, boolean autoFlush) 
创建新的打印流。 
****方法摘要:
PrintWriter append(char c) 
将指定字符添加到此 writer。 
void close() 
关闭该流并释放与之关联的所有系统资源。 
void flush() 
刷新该流的缓冲。 
void print(Object obj) 
打印对象。 
void print(String s) 
打印字符串。
void println() 
通过写入行分隔符字符串终止当前行。
(2)对象系列化:
**对象实体化:找一个介质,能长期的存储对象。
**对象的属性在Java程序中,都是存在于对内存中,随着对象的消失而消失,
而ObjectOutputStream可以将对象实体化
**Serializable接口没有一个方法,也就是说其是一个标记接口。比如盖章的猪肉才是安全的。
**只有实现Serializable接口的子类才能被ObjectOutputStream系列化写入流,当某个
类实现该接口后,会被Java自动分配UID号,以便编译器识别,区分不同对象。
**用ObjectOutputStream系列化的对象存储到文件后,该文件是乱码,也就是不可读的
的用ObjectInputStream读取该类对象的属性。
**由于对象是有Java给对象分配相应的UID号,而UID号是根据对象的属性不同而分配的。
当一个类对象被系列化到文件后,如果该类改动了对象的属性,比如将某个成员变量变成私有
则该对象再用ObjectInputStream读取时会报异常,也就是说该系列化到文件的对象不能再被使用了
那么,要想继续使用属性被改动后的对象,我们可以自定义给对象分配UID号,让UID号不随对象的属性
变化而变化。
自定义对象分配UID方法如下:
public static final long serialVersion UID = 43L;
**注意:
静态不能被系列化,因为静态成员变量实在内存的方法区,而ObjectOutputStream只能
对对内存里面的数据进行系列化
被transient修饰的非静态成员变量也不能被系列化
被系列化的对象存储到文件中,该文件是不可读的,所以该文件的扩展名一般
不写成.txt,通常后缀名写.object
**ObjectOutputStream
**ObjectInputStream
(3)管道流:
PipedInputStream
PipedOutputStream
(4)随机访问文件:RandomAccess(重要!!!)
**自身具备读写方法(很牛逼!又可以读又可以写)
**通过skipByte(int x)和seek(int x)来达到随机访问文件
**该类不是IO体系子类,而是直接继承Object,但它是IO包中的成员,因为它具备读写方法
**该类内部封装了数组,而且通过指针对数组的元素进行操作,可以通过getFilePoint获取指针位置
同时可以通过seek改变指针位置
**该类完成读写的原理是内部封装了字节输入输出流
**通过该类的构造看出,该类只能操作文件,而且操作的文件只能有固定模式:
"r":只读
"rw":读写
"rws":
"red":
**构造方法:
RandomAccessFile(File file, String mode) 
创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。 
RandomAccessFile(String name, String mode) 
创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。 
**方法摘要:
void write(byte[] b) 
将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。 
void write(byte[] b, int off, int len) 
将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。 
void write(int b) 
向此文件写入指定的字节。 
int read() 
从此文件中读取一个数据字节。 
int read(byte[] b) 
将最多 b.length 个数据字节从此文件读入 byte 数组。 
int read(byte[] b, int off, int len) 
将最多 len 个数据字节从此文件读入 byte 数组。
String readLine() 
从此文件读取文本的下一行。 
long getFilePointer() 
返回此文件中的当前偏移量。 
long length() 
返回此文件的长度。 
void seek(long pos) 
设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
(4)操作基本数据类型的流对象:DateStream
(5)操作字节数组流:
ByteArrayInputStream
ByteArrayOutputStream
11、IO流转换流的字符编码
(1)字符流的出现为了方便操作字符,更重要的是加入了编码转换
(2)通过子类转换流来完成
InputStreamReander
OutputStreamWriter
(3)在两个子类对象进行构造的时候可以加入编码表
(4)编码表:
将各个国家的文字用二进制数字表示并一一对应,形成一张表,这就是编码表
(5)常见的编码表:
**ASCII:美国标准信息交换码,用一个字节的七位表示
**ISO8859-1:拉丁码表,欧洲码表,用一个字节的八位表示
**GB2312:中文编码表,用两个字节表示
**GBK:中文编码表升级,融合录入更多的中文字符,用两个字节表示,为避免和老美重复
两字节的最高位都是1,即汉字都是用负数表示
**Unicode:国际标准码,融合了多种文字,所有文字都用两个字节表示
**UTF-8:用一个字节到三个字节表示。
注:Unicode能识别中文,UTF-8也能识别中文,但两种编码表示一个汉字所用的字节数不同
Unicode用两个字节,UTF-8用三个字节,故涉及到编码转换。
(6)在流中涉及编码表的转换只有转换流:
InputStreamReander
OutputStreamWriter
(7)代码示例:

复制代码
 1 public static void write() throws IOException
 2 {
 3 OutputStreamWriter osw1 = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"GBK");
 4 osw1.write("你好");
 5 osw1.close();
 6 
 7 OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream("utf-8.txt"),"UTF-8");
 8 osw2.write("你好");
 9 osw2.close();
10 }
11 public static void read() throws IOException
12 {
13 InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"),"GBK");
14 byte[] buf = new byte[1024];
15 int len = isr.read(buf);
16 sop(new String(buf,0,len));
17 }
18 (8)
复制代码

 

编码解码

编码:字符串变成字节数组:String-->getBytes()-->byte[]()
解码:字节数组变成字符串:byte[]-->new String(byte[],0,len)-->String
(9)代码示例:
public static void main(String[] args)
{
//编码解码1:默认编码
String str1 = "你好";
byte[] buf1 = str1.getBytes();//默认解码:Unicode,四个字节

//编码解码2:指定编码
String str2 = "你好";
byte[] buf2 = str2.getBytes("UTF-8");//指定解码:UTF-8,六个字节


//编码解码3:编码正确解码错误
String str3 = "你好";
byte[] buf3 = str3.getBytes("GBK");//指定编码:GBK,四个字节
String str3 = new String(buf3,"ISO8859-1");//错误解码

//编码解码4:错误编码正确解码
String str4 = "你好";
byte[] buf4 = str4.getBytes("ISO8859-1");//错误编码
String str4 = new String(buf4,"GBK");//正确解码,读不出来

//编码解码5:编码对了,但是解码错误了,怎么办呢?
//此时可以将错误的解码再错编回去,载用正确编码解码
String str5 = "你好";
byte[] buf5 = str5.getBytes("GBK");//正确编码
String str6 = new String(buf5,"ISO8859-1");//错误解码,读不出来
byte[] buf6 = str6.getBytes("ISO8859-1");//再错误编码
String str7 = new String(buf6,"GBK");//再正确解码,这样就可以读出来了
}

 

posted @ 2018-04-09 15:31  技术专家  阅读(163)  评论(0)    收藏  举报