Java学习 之 IO流(Properties、序列化与反序列化、打印流、commons-IO)
1 /* 2 3 Properties类表示一个持久的属性集,可以保存在流中或从流中加载,属性列表中每个键及其对应值都是一个字符串 4 5 特点: 6 7 1、Hashtable的子类,map集合中的方法都可以用 8 9 2、该集合没有泛型,键值都是字符串 10 11 3、是一个持久化的属性集,键值可以存储到集合中,也可以存储到持久化的设备(硬盘,u盘、光盘)上,键值的来源也可以是持久化的设备 12 13 方法: 14 15 void load(InputStream in)把指定流所对应的文件中的数据,读取出来,保存到Properties集合中 16 17 void load(Reader reader)从输入字符流中读取属性列表 18 19 void store(OutputStream out, String comments)把集合中的数据,保存到指定的流所对应的文件中,参数comments代表对描述的信息 20 21 void store(Writer writer , String comments)将Properties表中的属性列表(键和值)写入输出字符 22 23 */ 24 25 public class PropertiesDemo1{ 26 27 public static void main(String[] args){ 28 29 //创建集合对象 30 31 Properties pro = new Properties(); 32 33 //添加元素到集合 34 35 pro.setProperty("a" , "1"); 36 37 pro.setProperty("b" , "2"); 38 39 //遍历集合 40 41 Set<String> keys = pro.stringPropertyNames(); 42 43 for(Strng key : keys){ 44 45 //通过键,找值 46 47 String value = pro.getProperty(key); 48 49 System.out.println(key +"=="+value); 50 51 } 52 53 } 54 55 } 56 57 /* 58 59 将集合中内容存储到文件 60 61 */ 62 63 public class PropertiesDemo2{ 64 65 public static void main(String[] args) throws IOException{ 66 67 //创建Properties集合 68 69 Properties pro = new Properties(); 70 71 //添加元素到集合 72 73 pro.setProperty("name" , "张三"); 74 75 pro.setProperty("names" , "李四"); 76 77 //创建流 78 79 FileWriter fw = new FileWriter("pro.properties"); 80 81 //把集合中的数据存储到流对应的文件中 82 83 pro.store(fw , ""); 84 85 //关闭流 86 87 fw.close(); 88 89 } 90 91 } 92 /* 93 94 读取文件中的数据,并保存到集合 95 96 */ 97 98 public class PropertiesDemo3{ 99 100 public static void main(String[] args) throws IOException{ 101 102 //创建集合 103 104 Properties pro = new Properties(); 105 106 //创建流对象 107 108 FileInputStream fis = new FileInputStream("pro.porperties"); 109 110 //把流所对应的文件中的数据,读取到集合中 111 112 pro.load(fis); 113 114 //关闭流 115 116 fis.close(); 117 118 //显示集合中的数据 119 120 System.out.println(pro); 121 122 } 123 124 } 125 126 /* 127 128 序列化和反序列化: 129 130 用于从流中读取对象的操作流ObjectInputStream称为反序列化 131 132 构造方法:ObjectInputSream(InputStream in)创建从指定InputStream读取的ObjectInputStream 133 134 方法:Object readObject()从ObjectInputStream读取对象 135 136 用于从流中写入对象的操作流ObjectOutputStream称为序列化 137 构造方法: ObjectOutputStream(OutputStream out)创建写入指定OutputStream的ObjectOutputStream 138 139 方法: void writeObject(Object obj)将指定的对象写入ObjectOutputStream 140 141 序列化接口:当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口,否则会发生异常NotSerializableException异常 142 143 同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常InvalidClassException,发生异常的原因: 144 145 1、该类的序列版本号于从流中读取的类描述符的版本号不匹配 146 147 2、该类包含未知数据类型 148 149 3、该类没有可访问的无参数构造方法 150 151 Serializable标记接口,该接口给需要序列化的类,提供了一个序列版本号,serialVersionUID,该版本号的目的在于验证序列化的对象和对应类是否版本匹配 152 153 */ 154 155 public class ObjectStreamDemo{ 156 157 public static void main(String[] args) throws IOException{ 158 159 writeObj() //对象的序列化 160 161 } 162 163 public static writeObj() throws IOException{ 164 165 //明确存储对象的文件 166 167 FileOutputStream fos = new FileOutputStream("temp\\obj.object"); 168 169 //给操作文件对象加入写入对象功能 170 171 ObjectOutputStream oos = new ObjectOutputStream(fos); 172 173 //调用了写入对象的方法 174 175 oos.writeObject(new Person("张三" , 20)); 176 177 //关闭资源 178 179 oos.close(); 180 181 } 182 183 } 184 185 public class Person implements Serializable{ 186 187 //给类声明一个序列化版本号 188 189 private static final long serivalVersionUID = 1L; 190 191 private String name; 192 193 private int age; 194 195 public Person(){ 196 197 super(); 198 199 } 200 201 public Person(String name , int age){ 202 203 super(); 204 205 this.name = name; 206 207 this.age = age; 208 209 public void setName(String name){ 210 211 this.name = name; 212 213 } 214 215 public String getName(){ 216 217 return name; 218 219 } 220 221 public void setAge(int age){ 222 223 this.age = age; 224 225 } 226 227 public int getAge(){ 228 229 return age; 230 231 } 232 233 @Override 234 235 public String toString(){ 236 237 return "Person [name=" + name +" , age = " + age +"]"; 238 239 } 240 241 } 242 243 } 244 245 public class ObjectStreamDemo2{ 246 247 public static void main(String[] args) throws IOException{ 248 249 readObj(); 250 251 } 252 253 public staitc readObj() throws IOException , ClassNotFoundException{ 254 255 //定义流对象关联存储了对象文件 256 257 FileInputStream fis = new FileInputStream("temp\\obj.object"); 258 259 //建立用于读取对象的功能对象 260 261 ObjectInputStream ois = new ObjectInputStream(fis); 262 263 Person obj = (Person)ois.readObj(); 264 265 System.out.println(obj.toString()); 266 267 } 268 269 } 270 271 /* 272 273 瞬态关键字transient: 274 275 当一个类的对象需要被序列化时,某些属性不需要被序列化,不需要序列化的属性可以使用关键字transient修饰 276 277 静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化 278 279 */ 280 281 /* 282 283 打印流: 284 285 字节打印流: PrintStream 286 287 字符打印流:PrintWriter 288 289 方法: 290 291 void print(String str)输出任意类型的数据 292 293 void println(String str)输出任意类型的数据,自动写入换行操作 294 打印流完成数据自动刷新: 295 296 构造方法: 297 298 public PrintWriter(OutputStream out , boolean autoFlush) 299 300 public PrintWriter(Writer out , boolean autoFlush) 301 302 */ 303 304 public class PrintWriterDemo{ 305 306 public static void main(String[] args) throws IOException{ 307 308 //创建流 309 310 PrintWriter fw = new PrintWriter("print.txt"); 311 312 //写数据 313 314 for(int i =0 ; i < 5 ; i++){ 315 316 fw.println("hello"); 317 318 } 319 320 //关闭流 321 322 fw.close(); 323 324 } 325 326 } 327 328 public class PrintWriterDemo2{ 329 330 public static void main(String[] args) throws IOException{ 331 332 //创建流 333 334 PrintWriter pw = new PrintWriter("print.txt" , true); 335 336 //写数据 337 338 for(int i = 0 ; i < 5 ; i++){ 339 340 pw.println("hello"); 341 342 } 343 344 //关闭流 345 346 pw.close(); 347 348 } 349 350 } 351 352 /* 353 354 commons - io: 355 356 FilenameUtils:这个工具类用来处理文件名的 357 358 方法: 359 360 getExtension(String path)获取文件的扩展名 361 362 getName()获取文件名 363 364 isExtension(String fileName , String ext) 判断fileName是否是ext后缀名 365 366 FileUtils:提供文件操作的方法 367 368 方法: 369 370 readFileToString(File file) 读取文件内容,并返回一个String 371 372 writeStringToFile(File file , String content)将内容content写入到file中 373 374 copyDirectoryToDirectory(File srcDir , File destDir)文件夹复制 375 376 copyFile(File srcFile , File destFile)文件夹复制 377 378 379 380 */