1 拓 2 新 3 教 4 育 5 6 7 8 一.java中常用工具类 文件 流 9 //object类他 所有类父类 10 /** 11 * 1.equals:判断相等。如果子类要进行重写 该方法要重写 12 * 2. finalize():当垃圾回收器确定没有阻塞 给更多垃圾是则调用该方法 13 * 3.wait:可以将将线程阻塞 并将锁释放 14 * 4.notify.notifyall:将wait 阻塞对象解除阻塞的状态 15 * 16 * system类: 17 * err:标准错误输出流 18 * out:标注输出流 19 * in:标准输入流 20 * exit(n):终止虚拟机。n为0 则但单纯退出虚拟机 21 * 实际上等偶同与Runtime.getRuntime.exit(0); 22 * GC: 23 * 通知垃圾回收器回收垃圾 并不代表表马上执行 24 * 最终会调用finalize方法 25 * arraycopy(object src,int srcPos ,object dest,int destpos,int length): 26 * 用来复制数组的 27 * 参数解析 28 * 1.src-----源数组 29 * srcpos---原数组的起始位置 30 * dest---目标数组 31 * destpos-----目标数组起始位置 32 * currentTimeMillis:返回以毫秒为单位当前时间17071天 33 * String:类 34 * String 创建对象 35 * String s="ee";池中创建对象 36 * 使用String的构造器创建的时候会在堆中创建 37 * String的本质:就是char的数组 38 * String类:的长度确定不能更改 39 * String对象一旦请确定不可更改 40 * String类的常用方法: 41 * (1).charAt(index):返回指定索引出的char 42 * (2).concat(String str):相当于+连接符 43 * (3).endswith(String suffix):判断 该字符串是否已xxx结尾@author Administrator 44 * (4).equals(Object obj):比较两个字符串是否相等 45 * (5).equalsIgnorecase:忽略大小写比较 46 * (6).indexof(ch):返回指定字符在该字符串中第一次出现的位置 47 * (7).indexof(ch ,int fromIndex):返回指定字符在该字符串中第一次出现的位置 并从哪个索引开始 48 * (8).length():长度 集合size 49 * (9).isEmpty():如果length为0 则返回true 50 * (10).lastIndexof(ch):制定字符串最后一次出现的位置 51 * (11).replace(char old,char new ):替换并返回 52 * (12).split(String reg):按照指定的规则截取并返回一个字符创数组 53 * (13).startswith(String ch):判断 开始 54 * (14).substring(int index):从某个位置开始截取到结尾 55 * (15).substring(int begin,int end):从某未开始截取到(某位 之前) 56 * (16).toCharArray():把String 转设为char 型数组 57 * (17).getBytes:返回字节数 58 * (18).toLowersCase() 59 * (19).toUpperCase() 60 * (20).trim:返回字符串副本 去除首尾空格 61 * (4)缓冲字符 62 * Stringbuffer和StringBuilder(效率高):安全问题 63 * 为什么要使用? 64 * (1)可以不创建多个对象 直接改变 对象内容 65 * append():想缓冲区增加字符 66 * insert(int a.String b):将指定在字符插入到制定的位置 67 * delete(int start , int end):删除制定位置上的字符串 68 * (2)Stringbuffer和StringBuilder的区别 69 * (3)Stringbuffer 出现的较早 效率低 线程安全 重量级 70 * (4)StringBuilder 出现的较晚 效率高 线程不安全 轻量级 71 * (5)Data时间类 72 * 获取当前时间Date d=new date(); 73 * (6).处理date日期格式使用simpleDateFormat() * 74 * SimpleDateFormat sdf=new simpleDateFormat("yy mm dd") 75 * String myday =sdf.format(d); 76 * system.out.print(myday); 77 * Timestamp:时间戳 正常时间格式 并精确返回到毫秒 78 * (7)日历类 79 * calendar c=new calendar.getInstance(); 80 * system.out.print(c.getTime); 81 * 82 * eg: 83 * calendar c=new calendar.getInstance(); 84 * system.out.print(c.getTime); 85 * 单例模式: 86 * public class Single { 87 88 //(1).提供私有构造器 89 private Single(){} 90 //(2)提供私有静态的对象实例 91 private static Single instance=new Single(); 92 public static Single getInstance(){ 93 return instance; 94 95 } 96 } 97 98 * (7)Math类: 99 * 常用方法 100 * (7.1)PI:属性,返回一个接近圆周率的数值 101 * (7.2)abs(double a):返回double值得绝对值 102 * (7.3)cbrt(double a):返回的是double的开立方根 103 * (7.4)floor(double):返回值 最接近 最大的前 取整 104 * (7.5)max(double a,double b):两个数取最大的 105 * (7.6)min(double a,double b):两个数取最小的 106 * (7.7)pow(double a,double b):返回第一个参数的 n次幂 ( a的b次幂) 107 * (7.8)sqrt(double a):开的是“正”平方根 108 * (7.9)round(double a):四舍五入 109 * (7.10)random():得到一个随机数 110 * system.out.print(Math.random()*100);100以内随机数 111 * eg:Random ran=new Random(); 112 * int b=ran.nextInt(10); 113 * sysout(b); 114 */ 115 IO流: 116 数据的输入和输出,java中把这种形式抽象表述为“流”stream 117 I/O流: 118 Input:输入 119 Output:输出 120 流的分类 121 1. 方向分: 122 输入流:读取数据(只读) 123 输出流:只写 输出 124 2. 处理数据分: 125 字节流:每次读写的时候一字节为单位 126 字符流:每次读写的时候一字符为单位 127 3. 按照功能分: 128 低级流:(节点流)直接从硬盘络商都读取数据 129 高级流:(处理流)直接在低级流上套一个高级流 130 131 132 133 InputStream: 134 read():一次读取一个字节 如果读到文档末尾则返回-1 135 使用: 136 (1).创建流 137 (2).操作 138 (3).关闭 139 OutputStream: 140 Write():y一次只能写 一个字节 141 File: 142 高级流:只需要低级流上套一层流 143 缓冲流:BufferedInPutStream 144 BufferedOutPutStream 145 Reader和Writer:文本文档 146 序列化 147 就是把对象的信息保存到本地文件 148 反序列化 149 就是把本地文件中存储对象的信息变回对象 150 高级流 151 ObjectInputStream 152 ObjectOutputStream 153 (1)序列化必须实现 serializable接口(implements) 154 (2)版本号要一致 155 二.文件 156 // 创建文件对象 不可重复 157 // File file = new File("D:/hello.txt"); 158 // 159 // try { 160 // boolean issuccess=file.createNewFile(); 161 // System.out.println(issuccess); 162 // } catch (IOException e) { 163 // // TODO Auto-generated catch block 164 // e.printStackTrace(); 165 // } 166 // // 创建目录 不可重复 //单级目录 167 // 168 // 169 // File file1=new File("D:/我的目"); 170 // boolean isSuccess=file1.mkdir(); 171 // System.out.println(isSuccess); 172 // // 创建目录 不可重复 //多级目录 173 // 174 // 175 // File file2=new File("D:/我的目录1/目录1/目录2"); 176 // boolean isSuccess2=file2.mkdirs(); 177 // System.out.println(isSuccess2); 178 // //删除文件 回收站不可找回 179 // 180 // 181 // boolean isSussess=file.delete(); 182 // System.out.println(isSussess); 183 // 删除文件夹 回收站不可找回 184 //绝对路径 185 // File file = new File("D:/我的目录"); 186 // //boolean isSuc=file.mkdir(); 187 // //非空不能删除 188 // boolean isDelte=file.delete(); 189 // //System.out.println(isSuc); 190 // System.out.println(isDelte); 191 //使用相对路径创建文件 不指定盘符 相对路经就是工程文件夹 192 // File file = new File("a.txt"); 193 // boolean isSuc=file.createNewFile(); 194 // System.out.println(isSuc); 195 // file.delete(); 196 // //文件夹只能一级一级删除 197 // File file1 = new File("aa/bb"); 198 // boolean isSuc1=file1.mkdirs(); 199 // System.out.println(isSuc1); 200 // file1.delete(); 201 //package下创建文件 202 File file1 = new File("src3/zz/liwanxu.mp3"); 203 file1.createNewFile(); 204 file1.delete(); 205 } 206 二.字符流 207 1.向一个文件写100个HELLOWORD 208 import java.io.File; 209 import java.io.FileWriter; 210 import java.io.IOException; 211 212 213 public class iodemo1 { 214 215 /** 216 * @param args 217 */ 218 219 public static void main(String[] args) { 220 writeFile1(); 221 // TODO Auto-generated method stubf 222 } 223 public static void writeFile1() { 224 // TODO Auto-generated method stubf 225 226 FileWriter fw=null; 227 try { 228 //创建输出流的对象 229 fw=new FileWriter("b.txt"); 230 for(int i=0;i<100;i++){ 231 //把内容 写到文件 232 fw.write("hellowrite"); 233 if(i%10==0){ 234 //字符流的特点 清空缓冲区 把内容写到文件中 235 fw.flush(); 236 } 237 } 238 //字符流的特点 清空缓冲区 把内容写到文件中 239 fw.flush(); 240 241 } catch (IOException e) { 242 // TODO Auto-generated catch block 243 e.printStackTrace(); 244 }finally{ 245 246 247 if(fw !=null){ 248 249 try { 250 //close关闭输出流之前清空缓冲区 251 fw.close(); 252 } catch (IOException e) { 253 // TODO Auto-generated catch block 254 e.printStackTrace(); 255 } 256 } 257 } 258 259 260 } 261 262 } 263 264 265 2.追加 266 import java.io.File; 267 import java.io.FileWriter; 268 import java.io.IOException; 269 270 271 public class iodemo1 { 272 273 /** 274 * @param args 275 */ 276 277 public static void main(String[] args) { 278 writeFile1(); 279 // TODO Auto-generated method stubf 280 } 281 public static void writeFile1() { 282 // TODO Auto-generated method stubf 283 284 FileWriter fw=null; 285 try { 286 //创建输出流的对象 287 //fw=new FileWriter("b.txt",true); 288 fw=new FileWriter(new File("b.txt"),true); 289 for(int i=0;i<10;i++){ 290 //把内容 写到文件 291 fw.write("我i爱你"); 292 if(i%10==0){ 293 //字符流的特点 清空缓冲区 把内容写到文件中 294 fw.flush(); 295 } 296 } 297 //字符流的特点 清空缓冲区 把内容写到文件中 298 fw.flush(); 299 300 } catch (IOException e) { 301 // TODO Auto-generated catch block 302 e.printStackTrace(); 303 }finally{ 304 305 306 if(fw !=null){ 307 308 try { 309 //close关闭输出流之前清空缓冲区 310 fw.close(); 311 } catch (IOException e) { 312 // TODO Auto-generated catch block 313 e.printStackTrace(); 314 } 315 } 316 } 317 318 319 } 320 321 } 322 323 3.输出换行 324 把文本写入文件中 代表换行 325 Window: ; 在前时eclipse中隔行空格 建议使用 兼容记事本 326 Linux: ; 327 Mc: ; 328 329 330 import java.io.File; 331 import java.io.FileWriter; 332 import java.io.IOException; 333 334 335 public class iodemo2 { 336 337 /** 338 * @param args 339 */ 340 341 public static void main(String[] args) { 342 writeFile1(); 343 // TODO Auto-generated method stubf 344 } 345 public static void writeFile1() { 346 // TODO Auto-generated method stubf 347 348 FileWriter fw=null; 349 try { 350 //创建输出流的对象 351 fw=new FileWriter("b.txt"); 352 353 for(int i=0;i<10;i++){ 354 //把内容 写到文件 355 fw.write("我i爱你"+i+" "); 356 if(i%10==0){ 357 //字符流的特点 清空缓冲区 把内容写到文件中 358 fw.flush(); 359 } 360 } 361 //字符流的特点 清空缓冲区 把内容写到文件中 362 fw.flush(); 363 364 } catch (IOException e) { 365 // TODO Auto-generated catch block 366 e.printStackTrace(); 367 }finally{ 368 369 370 if(fw !=null){ 371 372 try { 373 //close关闭输出流之前清空缓冲区 374 fw.close(); 375 } catch (IOException e) { 376 // TODO Auto-generated catch block 377 e.printStackTrace(); 378 } 379 } 380 } 381 382 383 } 384 385 } 386 387 4.出入流 388 FileReader的爷爷是Reader 389 需求: 390 读取文件Hello word打印到控制台 391 分析: 392 1. 创建出入刘对象FileReader 393 2. 读取数据 394 3. 关系输入流 注意:需自己新建一个helloword.txt 395 package filereader; 396 397 import java.io.File; 398 import java.io.FileNotFoundException; 399 import java.io.FileReader; 400 import java.io.IOException; 401 402 public class Filereader { 403 public static void main(String[] args) { 404 readerFile(); 405 406 } 407 public static void readerFile(){ 408 FileReader fr=null; 409 try { 410 //创建文件都去对象 两种方法 411 //fr=new FileReader("helloWord.txt"); 412 fr=new FileReader(new File("helloWord.txt") ); 413 try { 414 //读取单个字符 返回的是字符的Ascll码 读取一个字符 之后在读取一个字符 415 /*int n=fr.read(); 416 System.out.println((char)n); 417 418 int n1=fr.read(); 419 System.out.println((char)n1);*/ 420 //若果读取完毕,最后没有字符是会返回-1 421 422 int num=0; 423 //通过循环读取字符 判断跳出循环的标志是num=-1; 424 while((num=fr.read()) !=-1){ 425 System.out.println((char)num); 426 427 } 428 } catch (IOException e) { 429 // TODO Auto-generated catch block 430 e.printStackTrace(); 431 } 432 } catch (FileNotFoundException e) { 433 // TODO Auto-generated catch block 434 e.printStackTrace(); 435 } 436 finally{ 437 438 if(fr!=null){ 439 try { 440 fr.close(); 441 } catch (IOException e) { 442 // TODO Auto-generated catch block 443 e.printStackTrace(); 444 } 445 446 447 } 448 } 449 } 450 451 } 452 453 5.读取数据以字符串数组形式读取(相对路径) 454 package filereader; 455 456 import java.io.File; 457 import java.io.FileNotFoundException; 458 import java.io.FileReader; 459 import java.io.IOException; 460 461 public class Filereader { 462 public static void main(String[] args) { 463 readerFile(); 464 465 } 466 public static void readerFile(){ 467 FileReader fr=null; 468 try { 469 //创建文件都去对象 两种方法 470 //fr=new FileReader("helloWord.txt"); 471 fr=new FileReader("helloWord.txt" ); 472 try { 473 //创建一个字符数组 474 475 476 477 // char[] cha=new char[30]; 478 // int sum=fr.read(cha); 479 // String str=new String(cha,0,sum); 480 // System.out.println((char)sum); 481 // System.out.println(str); 482 char[] cha1=new char[1024]; 483 int num1=-1; 484 485 while((num1=fr.read(cha1))!=-1){ 486 System.out.println(new String( cha1,0,num1)); 487 488 489 490 491 } 492 } catch (IOException e) { 493 // TODO Auto-generated catch block 494 e.printStackTrace(); 495 } 496 } catch (FileNotFoundException e) { 497 // TODO Auto-generated catc h block 498 e.printStackTrace(); 499 } 500 finally{ 501 502 if(fr!=null){ 503 try { 504 fr.close(); 505 } catch (IOException e) { 506 // TODO Auto-generated catch block 507 e.printStackTrace(); 508 } 509 510 511 } 512 } 513 } 514 515 } 516 517 5(1)读取数据以字符串数组形式读取(绝对路径) 518 package filereader; 519 520 import java.io.File; 521 import java.io.FileNotFoundException; 522 import java.io.FileReader; 523 import java.io.IOException; 524 525 public class Filereader1 { 526 public static void main(String[] args) { 527 readerFile(); 528 529 } 530 public static void readerFile(){ 531 FileReader fr=null; 532 try { 533 //创建文件都去对象 两种方法 534 //fr=new FileReader("helloWord.txt"); 535 fr=new FileReader("D://helloWord.txt" ); 536 try { 537 //创建一个字符数组 538 539 540 541 // char[] cha=new char[30]; 542 // int sum=fr.read(cha); 543 // String str=new String(cha,0,sum); 544 // System.out.println((char)sum); 545 // System.out.println(str); 546 char[] cha1=new char[1024]; 547 int num1=-1; 548 549 while((num1=fr.read(cha1))!=-1){ 550 System.out.println(new String(cha1,0,num1)); 551 552 553 554 555 } 556 } catch (IOException e) { 557 // TODO Auto-generated catch block 558 e.printStackTrace(); 559 } 560 } catch (FileNotFoundException e) { 561 // TODO Auto-generated catc h block 562 e.printStackTrace(); 563 } 564 finally{ 565 566 if(fr!=null){ 567 try { 568 fr.close(); 569 } catch (IOException e) { 570 // TODO Auto-generated catch block 571 e.printStackTrace(); 572 } 573 574 575 } 576 } 577 } 578 579 } 580 581 582 6.使用字符流来做文件的拷贝 583 范例:把一个java文件拷贝到项目根目录 584 分析:1.创建输入流对象 585 2.创建输出流对象 586 3.把输入的数据写入输出流中 587 4.关闭资源 588 方法一:方法是字节读取(慢) 589 package filereader; 590 591 import java.io.File; 592 import java.io.FileNotFoundException; 593 import java.io.FileReader; 594 import java.io.FileWriter; 595 import java.io.IOException; 596 import java.io.Reader; 597 import java.io.Writer; 598 599 public class CopyFile { 600 public static void main(String[] args) { 601 copy1(); 602 System.out.println("done"); 603 } 604 605 public static void copy1(){ 606 Reader reader =null; 607 Writer writer =null; 608 try { 609 //创建文件读取对象 610 reader =new FileReader ("src3/filereader/Filereader.java"); 611 612 //创建写文件的对象 613 writer =new FileWriter ("Filereader.java"); 614 615 int num=-1; 616 //读取文件 617 //int num=reader.read(); 618 //当未读取完文件时,写入文件 619 620 while((num=reader.read())!=-1){ 621 writer.write(num); 622 623 } 624 625 } catch (FileNotFoundException e) { 626 // TODO Auto-generated catch block 627 e.printStackTrace(); 628 }catch (IOException e) { 629 // TODO Auto-generated catch block 630 e.printStackTrace(); 631 } 632 finally{ 633 //释放资源 634 try { 635 if(writer !=null) 636 writer.close(); 637 if(reader !=null) 638 reader.close(); 639 } catch (IOException e) { 640 // TODO Auto-generated catch block 641 e.printStackTrace(); 642 } 643 644 645 } 646 } 647 } 648 649 650 方法二:数组读取(快) 651 package filereader; 652 653 import java.io.File; 654 import java.io.FileNotFoundException; 655 import java.io.FileReader; 656 import java.io.FileWriter; 657 import java.io.IOException; 658 import java.io.Reader; 659 import java.io.Writer; 660 661 public class CopyFile { 662 public static void main(String[] args) { 663 copy1(); 664 System.out.println("done"); 665 } 666 667 public static void copy1(){ 668 Reader reader =null; 669 Writer writer =null; 670 try { 671 //创建文件读取对象 672 Reader=newFileReader("src3/filereader/Filereader.java"); 673 674 //创建写文件的对象 675 writer =new FileWriter ("Filereader.java"); 676 //定义读取长度的对象 677 int len=-1; 678 //定义存储读取内容字符的数组 679 char[] chs=new char[1024]; 680 //读取文件 681 //int num=reader.read(); 682 //当len!=-1,就一直读取 683 while((len=reader.read(chs))!=-1){ 684 //把读取的文件写到目标文件中 685 writer.write(chs, 0, len); 686 687 } 688 689 } catch (FileNotFoundException e) { 690 // TODO Auto-generated catch block 691 e.printStackTrace(); 692 }catch (IOException e) { 693 // TODO Auto-generated catch block 694 e.printStackTrace(); 695 } 696 finally{ 697 //释放资源 698 try { 699 if(writer !=null) 700 writer.close(); 701 if(reader !=null) 702 reader.close(); 703 } catch (IOException e) { 704 // TODO Auto-generated catch block 705 e.printStackTrace(); 706 } 707 708 709 } 710 } 711 } 712 713 714 高效缓冲区输入输出流 715 BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 716 构造方法摘要 717 BufferedReader(Reader in) 718 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 719 范例一:使用高效缓冲区来读取文件中的内容(建议使用数组读取,字符不够高效) 720 package buffer; 721 722 import java.io.BufferedReader; 723 724 import java.io.FileReader; 725 726 import java.io.IOException; 727 728 public class bufferwriterdemo { 729 public static void main(String[] args) { 730 read(); 731 System.out.println("done"); 732 733 } 734 //使用高效缓冲区向d.txt中写入“java太好学了,真简单” 735 public static void read(){ 736 FileReader fr=null; 737 BufferedReader br=null; 738 try { 739 fr=new FileReader("d.txt"); 740 //创建高效缓冲区的流对象 741 br=new BufferedReader(fr); 742 //输出数据 743 int len=-1; 744 char[] chs=new char[1024]; 745 746 while((len=br.read(chs))!=-1){ 747 748 System.out.println((new String(chs,0,len))); 749 } 750 } catch (IOException e) { 751 // TODO Auto-generated catch block 752 e.printStackTrace(); 753 }finally{ 754 if(br!=null) 755 try { 756 //关闭缓冲区会自动关闭FileWriter 757 br.close(); 758 } catch (IOException e) { 759 // TODO Auto-generated catch block 760 e.printStackTrace(); 761 } 762 } 763 764 } 765 766 } 767 768 769 770 BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 771 构造方法摘要 772 BufferedWriter(Writer out) 773 创建一个使用默认大小输出缓冲区的缓冲字符输出流。 774 775 范例二:使用高效缓冲区来向文件中写入一句话 776 package buffer; 777 778 import java.io.BufferedWriter; 779 import java.io.FileWriter; 780 import java.io.IOException; 781 782 public class bufferwriterdemo { 783 public static void main(String[] args) { 784 writer(); 785 System.out.println("done"); 786 787 } 788 //使用高效缓冲区向d.txt中写入“java太好学了,真简单” 789 public static void writer(){ 790 FileWriter fe=null; 791 BufferedWriter bw=null; 792 try { 793 fe=new FileWriter("d.txt"); 794 //创建高效缓冲区的流对象 795 bw=new BufferedWriter(fe); 796 //输出数据 797 bw.write("java太好学了,真简单"); 798 bw.flush(); 799 } catch (IOException e) { 800 // TODO Auto-generated catch block 801 e.printStackTrace(); 802 }finally{ 803 if(bw!=null) 804 try { 805 //关闭缓冲区会自动关闭FileWriter 806 bw.close(); 807 } catch (IOException e) { 808 // TODO Auto-generated catch block 809 e.printStackTrace(); 810 } 811 } 812 813 } 814 815 } 816 817 换行的两种方法: 818 (1). (2).bw.newLine 819 import java.io.BufferedWriter; 820 import java.io.File; 821 import java.io.FileWriter; 822 import java.io.IOException; 823 824 825 public class iodemo { 826 827 /** 828 * @param args 829 */ 830 831 public static void main(String[] args) { 832 writeFile1(); 833 // TODO Auto-generated method stubf 834 835 } 836 public static void writeFile1() { 837 // TODO Auto-generated method stubf 838 839 FileWriter fw=null; 840 BufferedWriter bw=null; 841 try { 842 //创建输出流的对象 843 fw=new FileWriter("b.txt"); 844 bw=new BufferedWriter(fw); 845 //把内容写到文件 846 for(int i=0; i<10; i++){ 847 bw.write("hello write."); 848 //字符流的特点 清空缓冲区 把内容写到文件中 849 850 //相当于 851 bw.newLine(); 852 853 } 854 bw.flush(); 855 856 } catch (IOException e) { 857 // TODO Auto-generated catch block 858 e.printStackTrace(); 859 }finally{ 860 861 862 if(fw !=null){ 863 864 try { 865 //close关闭输出流是清空缓冲区 866 fw.close(); 867 } catch (IOException e) { 868 // TODO Auto-generated catch block 869 e.printStackTrace(); 870 } 871 } 872 } 873 874 875 } 876 877 } 878 879 读取一行数据readline 880 package filereader; 881 882 import java.io.BufferedReader; 883 import java.io.File; 884 import java.io.FileNotFoundException; 885 import java.io.FileReader; 886 import java.io.IOException; 887 888 public class Filereader1 { 889 public static void main(String[] args) { 890 readerFile(); 891 892 } 893 public static void readerFile(){ 894 FileReader fr=null; 895 BufferedReader br=null; 896 try { 897 //创建文件都去对象 两种方法 898 fr=new FileReader("helloWord.txt"); 899 br=new BufferedReader(fr); 900 //使用高效输入流可以读取一行数据 901 String line=null; 902 while((line=br.readLine())!=null){ 903 System.out.println(line); 904 905 } 906 907 } catch (IOException e) { 908 // TODO Auto-generated catch block 909 e.printStackTrace(); 910 } 911 912 finally{ 913 914 if(fr!=null){ 915 try { 916 fr.close(); 917 } catch (IOException e) { 918 // TODO Auto-generated catch block 919 e.printStackTrace(); 920 } 921 922 923 } 924 } 925 } 926 927 } 928 929 使用高效缓冲流进行复制 930 931 package filereader; 932 933 import java.io.BufferedReader; 934 import java.io.BufferedWriter; 935 import java.io.File; 936 import java.io.FileNotFoundException; 937 import java.io.FileReader; 938 import java.io.FileWriter; 939 import java.io.IOException; 940 import java.io.Reader; 941 import java.io.Writer; 942 943 public class CopyFile { 944 public static void main(String[] args) { 945 copy1(); 946 System.out.println("done"); 947 } 948 949 public static void copy1(){ 950 Reader reader =null; 951 BufferedReader br=null; 952 953 Writer writer =null; 954 BufferedWriter bw=null; 955 try { 956 957 reader =new FileReader ("src3/filereader/Filereader.java"); 958 br=new BufferedReader(reader); 959 960 961 writer =new FileWriter ("Filereader.java"); 962 bw=new BufferedWriter(writer); 963 964 965 String line=null; 966 967 while((line=br.readLine())!=null){ 968 bw.write(line); 969 bw.newLine(); 970 971 } 972 bw.flush(); 973 974 } catch (FileNotFoundException e) { 975 // TODO Auto-generated catch block 976 e.printStackTrace(); 977 }catch (IOException e) { 978 // TODO Auto-generated catch block 979 e.printStackTrace(); 980 } 981 finally{ 982 //释放资源 983 try { 984 if(writer !=null) 985 writer.close(); 986 if(reader !=null) 987 reader.close(); 988 } catch (IOException e) { 989 // TODO Auto-generated catch block 990 e.printStackTrace(); 991 } 992 993 994 } 995 } 996 } 997 998 999 加强版(绝对路径,无覆盖) 1000 package filereader; 1001 1002 import java.io.BufferedReader; 1003 import java.io.BufferedWriter; 1004 import java.io.File; 1005 import java.io.FileNotFoundException; 1006 import java.io.FileReader; 1007 import java.io.FileWriter; 1008 import java.io.IOException; 1009 import java.io.Reader; 1010 import java.io.Writer; 1011 1012 public class CopyFile { 1013 public static void main(String[] args) { 1014 copy1(); 1015 System.out.println("done"); 1016 } 1017 1018 public static void copy1(){ 1019 Reader reader =null; 1020 BufferedReader br=null; 1021 1022 Writer writer =null; 1023 BufferedWriter bw=null; 1024 try { 1025 1026 reader =new FileReader ("D:/helloWord.txt"); 1027 br=new BufferedReader(reader); 1028 1029 1030 writer =new FileWriter ("D:/新建文本文档.txt",true); 1031 bw=new BufferedWriter(writer); 1032 1033 1034 String line=null; 1035 1036 while((line=br.readLine())!=null){ 1037 bw.write(line); 1038 bw.newLine(); 1039 1040 } 1041 bw.flush(); 1042 1043 } catch (FileNotFoundException e) { 1044 // TODO Auto-generated catch block 1045 e.printStackTrace(); 1046 }catch (IOException e) { 1047 // TODO Auto-generated catch block 1048 e.printStackTrace(); 1049 } 1050 finally{ 1051 //释放资源 1052 try { 1053 if(writer !=null) 1054 writer.close(); 1055 if(reader !=null) 1056 reader.close(); 1057 } catch (IOException e) { 1058 // TODO Auto-generated catch block 1059 e.printStackTrace(); 1060 } 1061 1062 1063 } 1064 } 1065 } 1066 1067 1068 1069 1070 ------------------------------------------------------------------------------------------------------------ 1071 以上都是字符流文本复制 1072 1073 三.字节流 1074 字节输入流:InputStream:常用子类FileInputStream 1075 字节输出流:OutputStreram:常用子类FileOutputStream 1076 OutputStream: 1077 构造方法摘要 1078 FileOutputStream(File file) 1079 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 1080 FileOutputStream(File file, boolean append) 1081 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 1082 FileOutputStream(String name) 1083 创建一个向具有指定名称的文件中写入数据的输出文件流。 1084 FileOutputStream(String name, boolean append) 1085 创建一个向具有指定 name 的文件中写入数据的输出文件流。 1086 范例:使用在字节流项文件中写入helloword 1087 package zijieliu; 1088 1089 import java.io.FileNotFoundException; 1090 import java.io.FileOutputStream; 1091 import java.io.IOException; 1092 1093 1094 public class OutputStream { 1095 public static void main(String[] args) { 1096 writeFile(); 1097 } 1098 1099 1100 public static void writeFile(){ 1101 //使用字节流输出对象 1102 FileOutputStream out=null; 1103 try { 1104 out=new FileOutputStream("a.txt"); 1105 String str="helloword"; 1106 byte[] bs=str.getBytes(); 1107 for(byte b:bs){ 1108 //单个字节 1109 out.write(b); 1110 1111 } 1112 } catch (FileNotFoundException e) { 1113 1114 e.printStackTrace(); 1115 } catch (IOException e) { 1116 1117 e.printStackTrace(); 1118 }finally{ 1119 1120 if(out!=null){ 1121 try { 1122 out.close(); 1123 } catch (IOException e) { 1124 // TODO Auto-generated catch block 1125 e.printStackTrace(); 1126 } 1127 } 1128 } 1129 1130 } 1131 1132 } 1133 1134 字节流输出流 1135 package zijieliu; 1136 1137 import java.io.File; 1138 import java.io.FileNotFoundException; 1139 import java.io.FileOutputStream; 1140 import java.io.IOException; 1141 1142 1143 public class OutputStream { 1144 public static void main(String[] args) { 1145 writeFile(); 1146 } 1147 1148 1149 public static void writeFile(){ 1150 //使用字节流输出对象 1151 FileOutputStream out=null; 1152 try { 1153 //追加效果 1154 out=new FileOutputStream("a.txt",true); 1155 //效果一致 1156 //out=new FileOutputStream(new File("a.txt")); 1157 //out=new FileOutputStream(new File("a.txt"),true); 1158 String str="helloword"; 1159 byte[] bs=str.getBytes(); 1160 // 1161 //out.write(bs,0,5); 1162 out.write(bs); 1163 1164 1165 } catch (FileNotFoundException e) { 1166 1167 e.printStackTrace(); 1168 } catch (IOException e) { 1169 1170 e.printStackTrace(); 1171 }finally{ 1172 1173 if(out!=null){ 1174 try { 1175 out.close(); 1176 } catch (IOException e) { 1177 // TODO Auto-generated catch block 1178 e.printStackTrace(); 1179 } 1180 } 1181 } 1182 1183 } 1184 1185 } 1186 package zijieliu; 1187 1188 import java.io.File; 1189 import java.io.FileInputStream; 1190 import java.io.FileNotFoundException; 1191 import java.io.FileOutputStream; 1192 import java.io.IOException; 1193 1194 1195 public class OutputStream { 1196 public static void main(String[] args) { 1197 readFile(); 1198 } 1199 1200 1201 public static void readFile(){ 1202 //使用字节流输出对象 1203 FileInputStream in=null; 1204 try { 1205 //追加效果 1206 in=new FileInputStream("a.txt"); 1207 byte[] bs=new byte[1024]; 1208 //读取文件 存储数组 从字节输入流去三个字节 从第一个索引位置开始 1209 int len= in.read(bs, 1, 3); 1210 // for(byte b:bs){ 1211 // 1212 // System.out.print(b); 1213 // } 1214 System.out.println(new String(bs,1,len)); 1215 1216 1217 1218 } catch (FileNotFoundException e) { 1219 1220 e.printStackTrace(); 1221 } catch (IOException e) { 1222 1223 e.printStackTrace(); 1224 }finally{ 1225 1226 if(in!=null){ 1227 try { 1228 in.close(); 1229 } catch (IOException e) { 1230 // TODO Auto-generated catch block 1231 e.printStackTrace(); 1232 } 1233 } 1234 } 1235 1236 } 1237 1238 } 1239 1240 范例2:使用字节流来拷贝文件 1241 package zijieliu; 1242 1243 import java.io.FileInputStream; 1244 import java.io.FileNotFoundException; 1245 import java.io.FileOutputStream; 1246 import java.io.IOException; 1247 import java.io.InputStream; 1248 1249 public class CopyFileDemo { 1250 1251 /** 1252 * @param args 1253 */ 1254 public static void main(String[] args) { 1255 // TODO Auto-generated method stub 1256 copyFile(); 1257 1258 } 1259 /* 1260 * 1261 * 1.创建输入字节流的对象,输出字节流对象 1262 * 2.读取数据 并且写入数据 1263 * 3.关闭资源 1264 */ 1265 public static void copyFile(){ 1266 InputStream in=null; 1267 FileOutputStream out=null; 1268 try { 1269 1270 in=new FileInputStream("src/zijieliu/OutputStream.java"); 1271 1272 out=new FileOutputStream("OutputStream.java"); 1273 1274 byte[] bs=new byte[1024]; 1275 int len=-1; 1276 try { 1277 while((len=in.read(bs))!=-1){ 1278 //把字节数组中的数据写入到文件中 1279 out.write(bs, 0, len); 1280 1281 } 1282 1283 1284 1285 1286 } catch (FileNotFoundException e) { 1287 // TODO Auto-generated catch block 1288 e.printStackTrace(); 1289 } 1290 } catch (IOException e) { 1291 // TODO Auto-generated catch block 1292 e.printStackTrace(); 1293 }finally{ 1294 if(out!=null){ 1295 try { 1296 out.close(); 1297 } catch (IOException e) { 1298 // TODO Auto-generated catch block 1299 e.printStackTrace(); 1300 } 1301 if(in!=null){ 1302 try { 1303 in.close(); 1304 } catch (IOException e) { 1305 // TODO Auto-generated catch block 1306 e.printStackTrace(); 1307 } 1308 1309 } 1310 } 1311 } 1312 1313 1314 1315 1316 1317 } 1318 1319 } 1320 1321 使用字节流来图片视频拷贝 1322 package zijieliu; 1323 1324 import java.io.FileInputStream; 1325 import java.io.FileNotFoundException; 1326 import java.io.FileOutputStream; 1327 import java.io.IOException; 1328 import java.io.InputStream; 1329 1330 public class CopyFileDemo { 1331 1332 /** 1333 * @param args 1334 */ 1335 public static void main(String[] args) { 1336 // TODO Auto-generated method stub 1337 copyFile1(); 1338 1339 } 1340 /* 1341 * 1342 * 1.创建输入字节流的对象,输出字节流对象 1343 * 2.读取数据 并且写入数据 1344 * 3.关闭资源 1345 */ 1346 public static void copyFile(){ 1347 InputStream in=null; 1348 FileOutputStream out=null; 1349 try { 1350 1351 in=new FileInputStream("src/zijieliu/OutputStream.java"); 1352 1353 out=new FileOutputStream("OutputStream.java"); 1354 1355 byte[] bs=new byte[1024]; 1356 int len=-1; 1357 try { 1358 while((len=in.read(bs))!=-1){ 1359 //把字节数组中的数据写入到文件中 1360 out.write(bs, 0, len); 1361 1362 } 1363 1364 1365 1366 1367 } catch (FileNotFoundException e) { 1368 // TODO Auto-generated catch block 1369 e.printStackTrace(); 1370 } 1371 } catch (IOException e) { 1372 // TODO Auto-generated catch block 1373 e.printStackTrace(); 1374 }finally{ 1375 if(out!=null){ 1376 try { 1377 out.close(); 1378 } catch (IOException e) { 1379 // TODO Auto-generated catch block 1380 e.printStackTrace(); 1381 } 1382 if(in!=null){ 1383 try { 1384 in.close(); 1385 } catch (IOException e) { 1386 // TODO Auto-generated catch block 1387 e.printStackTrace(); 1388 } 1389 1390 } 1391 } 1392 } 1393 1394 1395 1396 1397 1398 } 1399 1400 1401 1402 1403 public static void copyFile1(){ 1404 InputStream in=null; 1405 FileOutputStream out=null; 1406 try { 1407 1408 in=new FileInputStream("D:/1.mp4"); 1409 1410 out=new FileOutputStream("D:/q/1.mp4"); 1411 1412 byte[] bs=new byte[1024]; 1413 int len=-1; 1414 try { 1415 while((len=in.read(bs))!=-1){ 1416 //把字节数组中的数据写入到文件中 1417 out.write(bs, 0, len); 1418 1419 } 1420 1421 1422 1423 1424 } catch (FileNotFoundException e) { 1425 // TODO Auto-generated catch block 1426 e.printStackTrace(); 1427 } 1428 } catch (IOException e) { 1429 // TODO Auto-generated catch block 1430 e.printStackTrace(); 1431 }finally{ 1432 if(out!=null){ 1433 try { 1434 out.close(); 1435 } catch (IOException e) { 1436 // TODO Auto-generated catch block 1437 e.printStackTrace(); 1438 } 1439 if(in!=null){ 1440 try { 1441 in.close(); 1442 } catch (IOException e) { 1443 // TODO Auto-generated catch block 1444 e.printStackTrace(); 1445 } 1446 1447 } 1448 } 1449 } 1450 1451 1452 1453 1454 1455 } 1456 1457 } 1458 1459 字节流的高效缓冲区(复制三种方法) 1460 1461 package zijieliu; 1462 1463 import java.io.BufferedInputStream; 1464 import java.io.BufferedOutputStream; 1465 import java.io.FileInputStream; 1466 import java.io.FileNotFoundException; 1467 import java.io.FileOutputStream; 1468 import java.io.IOException; 1469 import java.io.InputStream; 1470 1471 public class CopyBufferFileDemo { 1472 1473 /** 1474 * @param args 1475 */ 1476 public static void main(String[] args) { 1477 // TODO Auto-generated method stub 1478 long startTime=System.currentTimeMillis(); 1479 1480 copyFile1(); 1481 long endTime=System.currentTimeMillis(); 1482 System.out.println("耗时:"+(endTime-startTime)+"毫秒"); 1483 1484 } 1485 /* 1486 * 1487 * 1.创建输入字节流的对象,输出字节流对象 1488 * 2.读取数据 并且写入数据 1489 * 3.关闭资源 1490 */ 1491 public static void copyFile(){ 1492 InputStream in=null; 1493 BufferedOutputStream out=null; 1494 try { 1495 //创建高效缓冲区输入流对象 1496 in=new BufferedInputStream(new FileInputStream("D:/1.mp4")); 1497 1498 out=new BufferedOutputStream(new FileOutputStream("D:/q/1.mp4")); 1499 1500 1501 int len=-1; 1502 try { 1503 while((len=in.read())!=-1){ 1504 //把字节数组中的数据写入到文件中 1505 out.write( len); 1506 1507 } 1508 1509 1510 1511 1512 } catch (FileNotFoundException e) { 1513 // TODO Auto-generated catch block 1514 e.printStackTrace(); 1515 } 1516 } catch (IOException e) { 1517 // TODO Auto-generated catch block 1518 e.printStackTrace(); 1519 }finally{ 1520 if(out!=null){ 1521 try { 1522 out.close(); 1523 } catch (IOException e) { 1524 // TODO Auto-generated catch block 1525 e.printStackTrace(); 1526 } 1527 if(in!=null){ 1528 try { 1529 in.close(); 1530 } catch (IOException e) { 1531 // TODO Auto-generated catch block 1532 e.printStackTrace(); 1533 } 1534 1535 } 1536 } 1537 } 1538 1539 1540 1541 1542 1543 } 1544 1545 1546 1547 //复制最快 1548 public static void copyFile1(){ 1549 InputStream in=null; 1550 FileOutputStream out=null; 1551 try { 1552 1553 in=new FileInputStream("D:/1.mp4"); 1554 1555 out=new FileOutputStream("D:/q/1.mp4"); 1556 1557 byte[] bs=new byte[1024]; 1558 int len=-1; 1559 try { 1560 while((len=in.read(bs))!=-1){ 1561 //把字节数组中的数据写入到文件中 1562 out.write(bs, 0, len); 1563 1564 } 1565 1566 1567 1568 1569 } catch (FileNotFoundException e) { 1570 // TODO Auto-generated catch block 1571 e.printStackTrace(); 1572 } 1573 } catch (IOException e) { 1574 // TODO Auto-generated catch block 1575 e.printStackTrace(); 1576 }finally{ 1577 if(out!=null){ 1578 try { 1579 out.close(); 1580 } catch (IOException e) { 1581 // TODO Auto-generated catch block 1582 e.printStackTrace(); 1583 } 1584 if(in!=null){ 1585 try { 1586 in.close(); 1587 } catch (IOException e) { 1588 // TODO Auto-generated catch block 1589 e.printStackTrace(); 1590 } 1591 1592 } 1593 } 1594 } 1595 1596 1597 1598 1599 1600 } 1601 1602 } 1603 1604 范例3:从键盘输入学生信息存储到文件中,学生按年龄排序。 1605 1606 package stu_model; 1607 1608 public class Student implements Comparable<Student> { 1609 private String name; 1610 public String getName() { 1611 return name; 1612 } 1613 1614 1615 public void setName(String name) { 1616 this.name = name; 1617 } 1618 1619 1620 public int getAge() { 1621 return age; 1622 } 1623 1624 1625 public void setAge(int age) { 1626 this.age = age; 1627 } 1628 1629 1630 private int age; 1631 1632 1633 @Override 1634 public int compareTo(Student o) { 1635 int num=this.age-o.getAge(); 1636 if(num==0){ 1637 1638 num=this.name.compareTo(o.getName()); 1639 } 1640 // TODO Auto-generated method stub 1641 return num; 1642 } 1643 1644 } 1645 1646 1647 package stu_model; 1648 1649 import java.io.BufferedWriter; 1650 import java.io.FileWriter; 1651 import java.io.IOException; 1652 import java.util.Scanner; 1653 import java.util.TreeSet; 1654 1655 public class ScannerTest { 1656 public static void main(String[] args) { 1657 //定义学生的集合 1658 TreeSet<Student> ts=new TreeSet<Student>(); 1659 //创建键盘输入对象 1660 Scanner sc=new Scanner (System.in); 1661 System.out.println("请输入你要输入几个学生:"); 1662 int count=sc.nextInt(); 1663 1664 for(int i=0;i<count;i++){ 1665 sc=new Scanner (System.in); 1666 //获得学身份姓名 1667 System.out.println("请输入学生姓名:"); 1668 String name=sc.nextLine(); 1669 //获得学生年龄 1670 System.out.println("请输入学生年龄:"); 1671 Integer age=sc.nextInt(); 1672 //创建一个学生的对象 1673 Student s=new Student(); 1674 s.setAge(age); 1675 s.setName(name); 1676 //把学生加入到集合中 1677 ts.add(s); 1678 1679 1680 } 1681 BufferedWriter bw=null; 1682 try { 1683 bw=new BufferedWriter (new FileWriter("student")); 1684 for(Student s:ts){ 1685 bw.write(s.getName()+"----"+s.getAge()); 1686 bw.newLine(); 1687 1688 1689 } 1690 bw.flush();//字节流要用flash 1691 } catch (IOException e) { 1692 // TODO Auto-generated catch block 1693 e.printStackTrace(); 1694 }finally{ 1695 try { 1696 if(bw!=null){ 1697 bw.close(); 1698 } 1699 } catch (IOException e) { 1700 // TODO Auto-generated catch block 1701 e.printStackTrace(); 1702 } 1703 } 1704 System.out.println("写入文件完毕"); 1705 } 1706 1707 } 1708 1709 设计模式之装饰者模式 1710 装饰着模式的目的是给类的功能增强。 1711 继承也能给类的功能增强。 1712 Writer类是写文件的类:有三个子类TxtWriter. Mp3Wrter. AviWriter 1713 在Writer 中定义了与文件的标准。三个文件分别去实现Writer 中写的方法 1714 |------- TXTWriter. 1715 |----BufferedTxtWriter 1716 |------- MP3Wrter. 1717 |----BufferedMP3Writer 1718 |------- AVIWriter 1719 |----BufferedAVIWriter 1720 如果想继续添加写文件的子类,如果想要对他做增强。还需要创建行营的缓冲区 1721 装饰器的设计模式可以解决我们使用高效缓冲区,但是不需要每一个写文件的类都添加高效缓冲区 1722 如果写文件的缓冲区是同样的原理,那么我们就可以把缓冲区抽取出来,作为装饰器 1723 角色: 1724 1. 抽象构件角色(定义写文件标准):Writer 1725 1726 2. 具体构件角色(实现写文件标准):三个子类TXTWriter. MP3Wrter. AVIWriter 1727 1728 3. 装饰角色(高效缓冲区) 1729 代码示例 1730 装饰者代码拓展 1731 字符流和字节流的转换桥梁 1732 范例:把从键盘输入的文本写入文件中 1733 代码 1734 家 1735 package xiejpan_wjian; 1736 import java.util.*; 1737 import java.io.BufferedWriter; 1738 import java.io.FileWriter; 1739 import java.io.IOException; 1740 import java.io.InputStream; 1741 1742 public class ScannerDemo { 1743 1744 1745 1746 1747 public static void main(String[] args) { 1748 1749 //创建一个Scanner对象 1750 Scanner sc=new Scanner(System.in); 1751 System.out.println("请输入数据:"); 1752 1753 BufferedWriter bw=null; 1754 try { 1755 bw=new BufferedWriter(new FileWriter("c.txt")); 1756 String line=null; 1757 while((line=sc.nextLine())!=null){ 1758 if("exit".equals(line)){ 1759 break; 1760 1761 } 1762 bw.write(line); 1763 bw.newLine(); 1764 bw.flush(); 1765 1766 1767 } 1768 1769 1770 } catch (IOException e) { 1771 // TODO Auto-generated catch block 1772 e.printStackTrace(); 1773 }finally{ 1774 1775 if(bw!=null){ 1776 1777 try { 1778 bw.close(); 1779 } catch (IOException e) { 1780 // TODO Auto-generated catch block 1781 e.printStackTrace(); 1782 } 1783 1784 } 1785 } 1786 } 1787 1788 private String nextLine() { 1789 // TODO Auto-generated method stub 1790 return null; 1791 } 1792 1793 } 1794 1795 1.字节流转向字符流(InputStreamReader(System.in));) 1796 package xiejpan_wjian; 1797 1798 import java.io.BufferedReader; 1799 import java.io.BufferedWriter; 1800 import java.io.FileWriter; 1801 import java.io.IOException; 1802 import java.io.InputStream; 1803 import java.io.InputStreamReader; 1804 1805 1806 public class converterINDemo { 1807 1808 1809 1810 1811 public static void main(String[] args) { 1812 //字符流和字节流的转换 1813 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 1814 //定义写入的文件夹 1815 1816 BufferedWriter bw=null; 1817 try { 1818 bw=new BufferedWriter(new FileWriter("w.txt")); 1819 } catch (IOException e1) { 1820 // TODO Auto-generated catch block 1821 e1.printStackTrace(); 1822 } 1823 1824 String line=null; 1825 try { 1826 while((line=br.readLine())!=null){ 1827 if("exit".equals(line)){ 1828 1829 break; 1830 } 1831 bw.write(line); 1832 bw.newLine(); 1833 bw.flush(); 1834 1835 } 1836 } catch (IOException e) { 1837 // TODO Auto-generated catch block 1838 e.printStackTrace(); 1839 } 1840 1841 1842 } 1843 } 1844 1845 2.字符流转换成字节流new OutputStreamWriter(System.out)); 1846 范例:从一个文件中读取内容使用标准字节流来输出到控制台(使用字符串操作) 1847 package xiejpan_wjian; 1848 1849 import java.io.BufferedReader; 1850 import java.io.BufferedWriter; 1851 import java.io.FileNotFoundException; 1852 import java.io.FileReader; 1853 import java.io.FileWriter; 1854 import java.io.IOException; 1855 import java.io.InputStream; 1856 import java.io.InputStreamReader; 1857 import java.io.OutputStreamWriter; 1858 1859 1860 public class converterOUTDemo { 1861 1862 1863 1864 1865 public static void main(String[] args) { 1866 BufferedWriter bw=null; 1867 BufferedReader br=null; 1868 try { 1869 br=new BufferedReader(new FileReader("w.txt")); 1870 bw=new BufferedWriter(new OutputStreamWriter(System.out)); 1871 String line=null; 1872 try { 1873 while((line=br.readLine())!=null){ 1874 bw.write(line); 1875 bw.newLine(); 1876 bw.flush(); 1877 } 1878 } catch (IOException e) { 1879 // TODO Auto-generated catch block 1880 e.printStackTrace(); 1881 } 1882 1883 } catch (FileNotFoundException e) { 1884 // TODO Auto-generated catch block 1885 e.printStackTrace(); 1886 }finally{ 1887 1888 if(bw!=null){ 1889 try { 1890 bw.close(); 1891 } catch (IOException e) { 1892 // TODO Auto-generated catch block 1893 e.printStackTrace(); 1894 } 1895 1896 } 1897 if(br!=null){ 1898 1899 try { 1900 br.close(); 1901 } catch (IOException e) { 1902 // TODO Auto-generated catch block 1903 e.printStackTrace(); 1904 } 1905 1906 } 1907 } 1908 1909 } 1910 } 1911 1912 打印流(强大) 1913 打印流只做输出 没有输入 1914 打印流分为字节打印流和字符打印流 1915 PrintWriter:字符打印流 1916 特点 1917 1. 可以打印各种数据流 1918 2. 封装了字符输出流,还可以字符流和字节流转换 1919 3. 可以自动使用自动刷新,只有在调用println printf 或format时才可能完成此操作 1920 4. 可以直接想文件中写数据 1921 PrintWriter 1922 1923 package print; 1924 1925 import java.io.FileNotFoundException; 1926 import java.io.PrintWriter; 1927 1928 public class printDemo { 1929 public static void main(String[] args) { 1930 //System.out.println("helloword"); 1931 PrintWriter pw=null; 1932 try { 1933 pw=new PrintWriter("b.txt"); 1934 pw.print(true); 1935 pw.print('q'); 1936 pw.print("rwn"); 1937 pw.print(12); 1938 } catch (FileNotFoundException e) { 1939 // TODO Auto-generated catch block 1940 e.printStackTrace(); 1941 }finally{ 1942 1943 1944 1945 1946 if(pw!=null){ 1947 pw.close(); 1948 1949 } 1950 } 1951 1952 } 1953 1954 1955 } 1956 范例:从文件中读取数据并且打印在控制台 1957 package print; 1958 1959 import java.io.BufferedReader; 1960 import java.io.FileNotFoundException; 1961 import java.io.FileReader; 1962 import java.io.IOException; 1963 import java.io.PrintWriter; 1964 1965 public class printDemo1 { 1966 public static void main(String[] args) { 1967 //定义缓冲区输入流对象 1968 BufferedReader br=null; 1969 PrintWriter pw=null; 1970 try { 1971 br=new BufferedReader(new FileReader("a.txt")); 1972 // pw=new PrintWriter(System.out); 1973 //设置自动刷新 1974 pw=new PrintWriter(System.out,true); 1975 String line=null; 1976 try { 1977 while((line=br.readLine())!=null){ 1978 pw.print(line); 1979 pw.flush(); 1980 1981 } 1982 } catch (IOException e) { 1983 // TODO Auto-generated catch block 1984 e.printStackTrace(); 1985 } 1986 1987 } catch (FileNotFoundException e) { 1988 // TODO Auto-generated catch block 1989 e.printStackTrace(); 1990 }finally{ 1991 if(pw!=null){ 1992 1993 1994 pw.close(); 1995 } 1996 if(br!=null){ 1997 1998 try { 1999 br.close(); 2000 } catch (IOException e) { 2001 // TODO Auto-generated catch block 2002 e.printStackTrace(); 2003 } 2004 2005 } 2006 2007 } 2008 2009 } 2010 2011 2012 } 2013 范例:使用打印流来复制文本文件 2014 package print; 2015 2016 import java.io.BufferedReader; 2017 import java.io.FileNotFoundException; 2018 import java.io.FileReader; 2019 import java.io.FileWriter; 2020 import java.io.IOException; 2021 import java.io.PrintWriter; 2022 2023 public class printDemo1 { 2024 public static void main(String[] args) { 2025 //定义缓冲区输入流对象 2026 BufferedReader br=null; 2027 PrintWriter pw=null; 2028 try { 2029 br=new BufferedReader(new FileReader("a.txt")); 2030 // pw=new PrintWriter(System.out); 2031 //设置自动刷新 2032 // pw=new PrintWriter(System.out,true); 2033 try { 2034 pw=new PrintWriter(new FileWriter("a1.txt"),true); 2035 } catch (IOException e1) { 2036 // TODO Auto-generated catch block 2037 e1.printStackTrace(); 2038 } 2039 String line=null; 2040 try { 2041 while((line=br.readLine())!=null){ 2042 pw.print(line); 2043 2044 } 2045 } catch (IOException e) { 2046 // TODO Auto-generated catch block 2047 e.printStackTrace(); 2048 } 2049 2050 } catch (FileNotFoundException e) { 2051 // TODO Auto-generated catch block 2052 e.printStackTrace(); 2053 }finally{ 2054 if(pw!=null){ 2055 2056 2057 pw.close(); 2058 } 2059 if(br!=null){ 2060 2061 try { 2062 br.close(); 2063 } catch (IOException e) { 2064 // TODO Auto-generated catch block 2065 e.printStackTrace(); 2066 } 2067 2068 } 2069 2070 } 2071 2072 } 2073 2074 2075 } 2076 187over 2077 Properties类 2078 Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。 2079 特点: 2080 1. 继承与HashTable,是线程安全的键值对存储数据 2081 2. Properties可保存在流中或从流中加载 2082 3. 只保存字符串的键值对, 2083 构造器 2084 构造方法摘要 2085 Properties() 2086 创建一个无默认值的空属性列表。 2087 2088 代码示例 2089 2090 List 2091 package Properties; 2092 2093 import java.io.FileWriter; 2094 import java.io.IOException; 2095 import java.io.PrintWriter; 2096 import java.util.Properties; 2097 import java.util.Set; 2098 2099 public class Properties2 { 2100 public static void main(String[] args) { 2101 2102 Properties prop=new Properties(); 2103 2104 prop.setProperty("name","zhangsan "); 2105 prop.setProperty("gender", "male"); 2106 prop.setProperty("age", "10"); 2107 PrintWriter pw =null; 2108 try { 2109 pw =new PrintWriter(new FileWriter("prop1.txt")); 2110 prop.list(pw); 2111 2112 } catch (IOException e) { 2113 // TODO Auto-generated catch block 2114 e.printStackTrace(); 2115 }finally{ 2116 2117 if(pw!=null){ 2118 2119 pw.close(); 2120 2121 } 2122 } 2123 2124 2125 } 2126 2127 } 2128 Load 2129 package Properties; 2130 2131 import java.io.FileReader; 2132 import java.io.FileWriter; 2133 import java.io.IOException; 2134 import java.io.PrintWriter; 2135 import java.util.Properties; 2136 import java.util.Set; 2137 2138 public class Properties3 { 2139 public static void main(String[] args) { 2140 2141 Properties prop=new Properties(); 2142 FileReader fr=null; 2143 2144 2145 try { 2146 fr=new FileReader("prop1.txt"); 2147 prop.load(fr); 2148 String name=prop.getProperty("name"); 2149 String age=prop.getProperty("age"); 2150 String gender=prop.getProperty("gender"); 2151 System.out.println(name); 2152 System.out.println(age); 2153 System.out.println(gender); 2154 } catch (IOException e) { 2155 // TODO Auto-generated catch block 2156 e.printStackTrace(); 2157 }finally{ 2158 2159 if(fr!=null){ 2160 2161 try { 2162 fr.close(); 2163 } catch (IOException e) { 2164 // TODO Auto-generated catch block 2165 e.printStackTrace(); 2166 } 2167 2168 } 2169 } 2170 2171 2172 } 2173 2174 } 2175 Store 2176 package Properties; 2177 2178 import java.io.FileReader; 2179 import java.io.FileWriter; 2180 import java.io.IOException; 2181 import java.io.PrintWriter; 2182 import java.util.Properties; 2183 import java.util.Set; 2184 2185 public class Properties5 { 2186 public static void main(String[] args) { 2187 2188 Properties prop=new Properties(); 2189 2190 prop.setProperty("name","zhangsan "); 2191 prop.setProperty("gender", "male"); 2192 prop.setProperty("age", "10"); 2193 FileWriter fw=null; 2194 try { 2195 fw=new FileWriter("prop2.txt"); 2196 prop.store(fw,null); 2197 } catch (IOException e) { 2198 // TODO Auto-generated catch block 2199 e.printStackTrace(); 2200 }finally{ 2201 2202 if(fw!=null){ 2203 2204 try { 2205 fw.close(); 2206 } catch (IOException e) { 2207 // TODO Auto-generated catch block 2208 e.printStackTrace(); 2209 } 2210 2211 } 2212 } 2213 2214 2215 } 2216 2217 } 2218 四.线程 2219 1.线程的概述 2220 进程:计算机中特定功能的程序在数据集上的一次一年运行 2221 线程:线程是进程的一个单元 2222 多线程:一个进程有多个线程在同时运行,如寻来的下载 迅雷运行一次就是一个进程,那么在迅雷中可以同时下载等多个电影 ,这就是多线程(每一个下载都是一个线程) 2223 Jvm是多线程的,在我们运行Jvm 时候后台会运行垃圾回收的线程,来清理没有被引用的对象。 2224 2225 2226 2227 2228 2229 2230 2231 2.线程的实现方法一 2232 创建新执行线程两种方法,(1)酱类声明为Thread的子类 该子类应重写 Thread类的run方法。接下来而可以分配并启动盖子类的实例, 2233 线程启动的时候使用线程的start方法 而我不是run 2234 package Tread; 2235 2236 public class treaddemo { 2237 2238 2239 public static void main(String[] args) { 2240 //创建现成的实例对象 2241 CountThread ct=new CountThread(); 2242 CountThread ct1=new CountThread(); 2243 2244 //并不是线程 只是调用run方法 ct.run(); 2245 //启动线程(双启动) 2246 ct.start(); 2247 ct1.start(); 2248 2249 } 2250 2251 } 2252 2253 package Tread; 2254 2255 public class CountThread extends Thread { 2256 //线程的执行体 2257 @Override 2258 public void run() { 2259 for(int i=0;i<17;i++){ 2260 System.out.println(this.getName()+"hello"+i); 2261 2262 } 2263 // TODO Auto-generated method stub 2264 2265 } 2266 2267 2268 2269 } 2270 2271 2272 .线程的实现方法二 2273 创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。 2274 示例代码: 2275 package Tread; 2276 2277 public class CountThread1 implements Runnable { 2278 2279 @Override 2280 public void run() { 2281 for(int i=0;i<17;i++){ 2282 //输出线程的名字 2283 System.out.println(Thread.currentThread().getName()+"---hello"+i); 2284 2285 } 2286 2287 } 2288 } 2289 2290 测试代码 2291 package Tread; 2292 2293 public class treaddemo1 { 2294 2295 2296 public static void main(String[] args) { 2297 //创建两个线程 2298 CountThread1 ct =new CountThread1(); 2299 //实际工程中很少命名 2300 //Thread t1 =new Thread(ct,"线程一"); 2301 Thread t1 =new Thread(ct); 2302 CountThread1 ct2 =new CountThread1(); 2303 //Thread t2 =new Thread(ct2,"线程二"); 2304 Thread t2 =new Thread(ct2); 2305 t1.start(); 2306 t2.start(); 2307 2308 2309 2310 } 2311 2312 } 2313 2314 197over 2315 3.线程的执行原理 2316 2317 2318 2319 三个随机开始(抢资源) 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 线程的并发执行通过多个线程不断的切换CPU的资源这个速度非常快,我么嗯感受不到 我们能感受到的就是三个个线程在并发的执行 2331 4. 线程的生命周期 2332 1. 新建:线程被NEW出来 2333 2. 准备就绪:线程具有执行资格,即线程调用了START() 2334 3. 运行:具备执行的资格和执行的权力。 2335 4. 阻塞:没有执行资格和执行权力 2336 5. 销毁:线程的对象变成垃圾,释放资源 2337 2338 Start() 2339 2340 2341 Sleep时间到 等cpu的状态 2342 Notify() 强到cpu 2343 2344 Sleep() Run()结束 2345 2346 Wait() 2347 2348 2349 5.并发 2350 互联网的项目中存在着大量的并发案例,如买火车票 电商项目 2351 范例:火车站有一百张票 4个窗口同是卖 2352 分析:四个窗口是四个线程同时运行 100张票四个线程的共享资源 2353 采用继承Thread来实现(并发问题:避免两个窗口同时卖一张票) 2354 2355 线程一 线程二 2356 2357 2358 2359 2360 2361 2362 2363 解决方案: 2364 2365 2366 2367 2368 2369 2370 2371 针对线程的案的安全性,我们需要使用同步(就是加锁,共享资源只能一个人同时访问) 2372 语法:synchronized(锁对象(非共享)){ 2373 //操作共享资源的代码 2374 } 2375 同步代码加在什么地方? 2376 1. 代码同时多个线程访问 2377 2. 代码中有共享资源 2378 3. 共享数据被多条语句操作 2379 package tickets; 2380 /* 2381 4. * 2382 5. * 买票的床口 2383 6. */ 2384 7. public class selltickets extends Thread{ 2385 8. 2386 9. private String name; 2387 10. public selltickets(String name) { 2388 11. super(name); 2389 12. 2390 13. 2391 14. } 2392 15. 2393 16. //100 张票是共享资源 2394 17. private static int tickets = 100; 2395 18. 2396 19. //同步钥匙(一把钥匙) 2397 20. //private static Object obj=new Object(); 2398 21. private static A a=new A(); 2399 22. public void run() { 2400 23. while(true){ 2401 24. 2402 25. synchronized(a){ 2403 26. if(tickets>0){ 2404 27. try { 2405 28. //放慢线程运行速度 2406 29. Thread.sleep(20); 2407 30. } catch (InterruptedException e) { 2408 31. // TODO Auto-generated catch block 2409 32. e.printStackTrace(); 2410 33. } 2411 34. System.out.println(this.getName()+"正在卖"+tickets--+"票"); 2412 35. }else{ 2413 36. 2414 37. System.out.println("票已经售完了"); 2415 38. break; 2416 39. } 2417 40. } 2418 41. } 2419 42. 2420 43. // TODO Auto-generated constructor stub 2421 44. } 2422 45. 2423 46. 2424 47. 2425 48. 2426 49. 2427 50. 2428 51. } 2429 52. class A{ 2430 53. 54. 55. } 2431 package tickets; 2432 2433 public class TicketsTest { 2434 2435 /** 2436 * @param args 2437 */ 2438 public static void main(String[] args) { 2439 // TODO Auto-generated method stub 2440 selltickets st1=new selltickets("窗口一"); 2441 selltickets st2=new selltickets("窗口二"); 2442 selltickets st3=new selltickets("窗口三"); 2443 selltickets st4=new selltickets("窗口四"); 2444 st1.start(); 2445 st2.start(); 2446 st3.start(); 2447 st4.start(); 2448 2449 } 2450 2451 } 2452 2453 Synchronized同步代码块的锁定对象可以是任意的类对象 (线程的实现方式是继承于Thread)这个对象必须是线程共享的(静态的) 2454 Synchronized是可以加在方法上的,如果是静态方法Synchronized的锁对象就是类的类对象,如果不是静态的方法,Synchronized如果加在对象方法上,那么他的锁是this 2455 实例; 2456 package tickets1; 2457 /* 2458 * 2459 * 买票的床口 2460 */ 2461 public class selltickets implements Runnable{ 2462 2463 2464 //100 张票是共享资源 2465 private int tickets = 100; 2466 private Object obj =new Object(); 2467 //同步钥匙(一把钥匙) 2468 //private static Object obj=new Object(); 2469 //private static A a=new A(); 2470 public void run() { 2471 while(true){ 2472 int i=0; 2473 if(i%2==0){ 2474 //同步代码块 2475 synchronized(obj){ 2476 if(tickets>0){ 2477 try { 2478 //放慢线程运行速度 2479 Thread.sleep(50); 2480 } catch (InterruptedException e) { 2481 // TODO Auto-generated catch block 2482 e.printStackTrace(); 2483 } 2484 System.out.println(Thread.currentThread().getName()+"正在卖"+tickets--+"票"); 2485 }else{ 2486 2487 System.out.println("票已经售完了"); 2488 break; 2489 } 2490 } 2491 }else { 2492 //同步代码块 2493 2494 if(tickets>0){ 2495 try { 2496 //放慢线程运行速度 2497 Thread.sleep(100); 2498 } catch (InterruptedException e) { 2499 // TODO Auto-generated catch block 2500 e.printStackTrace(); 2501 } 2502 System.out.println(Thread.currentThread().getName()+"正在卖"+tickets--+"票"); 2503 }else{ 2504 2505 System.out.println("票已经售完了"); 2506 break; 2507 } 2508 } 2509 //saleTickets(); 2510 i++; 2511 } 2512 2513 } 2514 } 2515 2516 /* 2517 * 静态方法synchronized锁是当前类的类对象 2518 * 2519 */ 2520 // TODO Auto-generated constructor stub 2521 /*public synchronized void saleTickets(){ 2522 2523 if(tickets>0){ 2524 try { 2525 //放慢线程运行速度 2526 Thread.sleep(50); 2527 } catch (InterruptedException e) { 2528 // TODO Auto-generated catch block 2529 e.printStackTrace(); 2530 } 2531 System.out.println(Thread.currentThread().getName()+"正在卖"+tickets--+"票"); 2532 }else{ 2533 2534 System.out.println("票已经售完了"); 2535 2536 } 2537 } 2538 2539 }*/ 2540 package tickets1; 2541 2542 public class TicketsTest { 2543 2544 /** 2545 * @param args 2546 */ 2547 public static void main(String[] args) { 2548 // TODO Auto-generated method stub 2549 selltickets st1=new selltickets(); 2550 Thread t1=new Thread(st1,"窗口1"); 2551 Thread t2=new Thread(st1,"窗口2"); 2552 Thread t3=new Thread(st1,"窗口3"); 2553 Thread t4=new Thread(st1,"窗口4"); 2554 t1.start(); 2555 t2.start(); 2556 t3.start(); 2557 t4.start(); 2558 2559 } 2560 2561 } 2562 2563 6. 线程的休眠 2564 在线程的休眠是必要的,在做服务端的时候为了减少服务器的压力我们需要休眠,如果休眠是在同步代码块中执行,休眠不会让出锁对象。 2565 7.线程之间的通信 2566 生产者和消费者 2567 2568 2569 生产者线程 消费者线程 2570 2571 2572 2573 2574 2575 2576 生产者生成水果,如果水果没有被买走那么就不生产处于等待状态,如果水果被消费者买走就生产买走的时候会通知生产者告诉他我们已经把水果买走了请生产,消费者同理,如果水果已经生产出来那么就买走 ,买走之后再通知生产者水果偶已经没了请生产。 2577 2578 注意:1.线程间的通信共享数据一定要在同步代码块synchronized: 2579 2.一定要有wait和notify ,而且二者一定是成对出现 2580 3.生产者和消费者的线程实现一定是在while(true)中 2581 示例代码: 2582 2583 Tx 2584 8线程优先级 2585 通过 public final void setPriority (int newPriority) 来设置线程的有优先级 但是优先级并不是绝对大的 只是相对其他的线程得到的CPU资源更多一些。(随机性) 2586 示例代码: 2587 package prio; 2588 2589 public class prioThread extends Thread { 2590 2591 private String name; 2592 2593 public prioThread(String name) { 2594 //super(); 2595 this.name=name; 2596 2597 } 2598 2599 @Override 2600 public void run() { 2601 for(int i=0;i<10;i++){ 2602 2603 System.out.println(this.getName()+"正在运行"+i); 2604 } 2605 2606 } 2607 2608 2609 } 2610 2611 package prio; 2612 2613 public class prioTest { 2614 public static void main(String[] args) { 2615 prioThread pt =new prioThread("线程1"); 2616 prioThread pt1 =new prioThread("线程2"); 2617 prioThread pt2 =new prioThread("线程3"); 2618 /*System.out.println(pt.getPriority()); 2619 System.out.println(pt1.getPriority()); 2620 System.out.println(pt2.getPriority());*/ 2621 pt.setPriority(10); 2622 2623 pt.start(); 2624 pt1.start(); 2625 pt2.start(); 2626 2627 2628 } 2629 2630 2631 2632 } 2633 2634 9.加入线程 2635 join 线程都会抢先执行CPU执行线程 其他线程再来执行 2636 package prio.join; 2637 2638 public class joinThread extends Thread { 2639 2640 private String name; 2641 2642 public joinThread(String name) { 2643 //super(); 2644 this.name=name; 2645 2646 } 2647 2648 @Override 2649 public void run() { 2650 for(int i=0;i<10;i++){ 2651 2652 System.out.println(this.getName()+"正在运行"+i); 2653 } 2654 2655 } 2656 2657 2658 } 2659 2660 package prio.join; 2661 2662 public class joinTest { 2663 public static void main(String[] args) { 2664 joinThread pt =new joinThread("线程1"); 2665 joinThread pt1 =new joinThread("线程2"); 2666 joinThread pt2 =new joinThread("线程3"); 2667 /*System.out.println(pt.getPriority()); 2668 System.out.println(pt1.getPriority()); 2669 System.out.println(pt2.getPriority());*/ 2670 pt.setPriority(10); 2671 2672 pt2.start(); 2673 try { 2674 //join 线程都会抢先执行CPU 来执行线程 其他线程再来执行 2675 pt2.join(); 2676 } catch (InterruptedException e) { 2677 // TODO Auto-generated catch block 2678 e.printStackTrace(); 2679 } 2680 pt.start(); 2681 pt1.start(); 2682 2683 2684 2685 } 2686 2687 2688 2689 } 2690 2691 10.等待线程 2692 Static void Vield() 2693 暂停的当前正在执行的线程对象并执行其他线程 2694 当前的线程从运行回到就绪状态 目的把CPU资源让给其他线程 2695 package prio.yield; 2696 2697 public class yieldThread extends Thread { 2698 2699 private String name; 2700 2701 public yieldThread(String name) { 2702 //super(); 2703 this.name=name; 2704 2705 } 2706 2707 @Override 2708 public void run() { 2709 for(int i=0;i<10;i++){ 2710 2711 System.out.println(this.getName()+"正在运行"+i); 2712 //当前线程回到就绪状态 让出CPU (谦让执行 ) 2713 Thread.yield(); 2714 } 2715 2716 } 2717 2718 2719 } 2720 2721 package prio.yield; 2722 2723 public class yieldTest { 2724 public static void main(String[] args) { 2725 yieldThread pt =new yieldThread("线程1"); 2726 yieldThread pt1 =new yieldThread("线程2"); 2727 yieldThread pt2 =new yieldThread("线程3"); 2728 2729 2730 pt2.start(); 2731 pt.start(); 2732 pt1.start(); 2733 2734 2735 2736 } 2737 2738 2739 2740 } 2741 2742 11.守护线程 2743 Void SetDaemon(Boolean on) 2744 将线程标记为守护线程或用户线程 2745 守护线程会随着主线程的结束而结束 2746 package prio.daemon; 2747 2748 public class daemonThread extends Thread { 2749 2750 private String name; 2751 2752 public daemonThread(String name) { 2753 //super(); 2754 this.name=name; 2755 2756 } 2757 2758 @Override 2759 public void run() { 2760 for(int i=0;i<10;i++){ 2761 2762 System.out.println(this.getName()+"正在运行"+i); 2763 //当前线程回到就绪状态 让出CPU (谦让执行 ) 2764 Thread.yield(); 2765 } 2766 2767 } 2768 2769 2770 } 2771 2772 package prio.daemon; 2773 2774 public class daemonTest { 2775 public static void main(String[] args) { 2776 daemonThread pt =new daemonThread("线程1"); 2777 daemonThread pt1 =new daemonThread("线程2"); 2778 2779 2780 2781 pt.setDaemon(true); 2782 pt1.setDaemon(true); 2783 pt.start(); 2784 pt1.start(); 2785 for(int i=0;i<10;i++){ 2786 2787 System.out.println(Thread.currentThread().getName()+"线程正在在运行"+i); 2788 } 2789 2790 2791 } 2792 2793 2794 2795 } 2796 2797 12.线程死锁 2798 2799 2800 2801 2802 2803 2804 2805 2806 示例代码: 2807 package dirrlock; 2808 2809 public class Lock { 2810 static Object lock1 =new Object(); 2811 static Object lock2 =new Object(); 2812 2813 2814 } 2815 2816 package dirrlock; 2817 2818 public class DirLockDemo implements Runnable{ 2819 private boolean flag; 2820 2821 public DirLockDemo(boolean flag) { 2822 super(); 2823 this.flag = flag; 2824 } 2825 2826 public void run() { 2827 if(flag){ 2828 synchronized (Lock.lock1){ 2829 System.out.println("线程1 拿到带第1把锁"); 2830 synchronized (Lock.lock2) { 2831 System.out.println("线程1拿到带第2把锁"); 2832 2833 } 2834 2835 } 2836 2837 }else{ 2838 2839 synchronized (Lock.lock2) { 2840 System.out.println("线程2拿到带第2把锁"); 2841 synchronized (Lock.lock1) { 2842 System.out.println("线程2拿到带第1把锁"); 2843 2844 } 2845 } 2846 } 2847 2848 } 2849 2850 2851 } 2852 2853 package dirrlock; 2854 2855 public class DieLockTest { 2856 public static void main(String[] args) { 2857 DirLockDemo dl1=new DirLockDemo(true); 2858 DirLockDemo dl2=new DirLockDemo(true); 2859 2860 Thread t1=new Thread(dl1); 2861 Thread t2=new Thread(dl2); 2862 t1.start(); 2863 t2.start(); 2864 2865 2866 2867 } 2868 2869 } 2870 2871 五.网络编程 2872 网络通信三大条件: 2873 IP 端口 协议 2874 package net1; 2875 2876 import java.net.DatagramPacket; 2877 import java.net.DatagramSocket; 2878 import java.net.InetAddress; 2879 2880 public class UDPClient { 2881 public static void main(String[] args) { 2882 // 创建客户端的套换字对象 2883 DatagramSocket ds = null; 2884 try { 2885 ds = new DatagramSocket(); 2886 byte[] bs = "你好".getBytes(); 2887 // 创建要发送的目的地IP对象 2888 InetAddress ia = InetAddress.getByName("192.168.1.1"); 2889 // 打数据包 2890 DatagramPacket dp = new DatagramPacket(bs, bs.length, ia, 10000); 2891 // 发送 2892 ds.send(dp); 2893 2894 } catch (Exception e) { 2895 // TODO Auto-generated catch block 2896 e.printStackTrace(); 2897 } finally { 2898 if (ds != null) { 2899 ds.close(); 2900 } 2901 } 2902 } 2903 2904 } 2905 package net1; 2906 2907 import java.net.DatagramPacket; 2908 import java.net.DatagramSocket; 2909 import java.net.InetAddress; 2910 2911 2912 public class UDPCSerever { 2913 public static void main(String[] args) { 2914 // 创建UDP服务端对象 必须指定端口 2915 DatagramSocket ds = null; 2916 try { 2917 ds = new DatagramSocket(10000); 2918 2919 // 定义接受数据字节的数组 2920 byte[] bs = new byte[1024]; 2921 // 定义接收的数据包 2922 DatagramPacket dp = new DatagramPacket(bs, bs.length); 2923 System.out.println("服务器已启动"); 2924 // 数据包的接收 2925 ds.receive(dp); 2926 // 获得发送端的IP 2927 InetAddress ia = dp.getAddress(); 2928 // 获取数据包中的数据,这个数组的长度是我们自己定义时的长度(1024) 2929 byte[] bs1 = dp.getData(); 2930 //获得接受数据的长度(实际接受的数据的长度) 2931 int len =dp.getLength(); 2932 // 组装接受的数据 2933 String data = new String(bs1, 0, len); 2934 System.out.println(ia.getHostAddress() + "发送了:" + data); 2935 } catch (Exception e) { 2936 // TODO Auto-generated catch block 2937 e.printStackTrace(); 2938 } finally { 2939 2940 if (ds != null) { 2941 2942 ds.close(); 2943 } 2944 } 2945 2946 } 2947 2948 }