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 把文本写入文件中 \n代表换行
325 Window:\r\n;\n在前时eclipse中隔行空格 建议使用 兼容记事本
326 Linux:\n;
327 Mc:\r;
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+"\n\r");
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).\r\n (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 //相当于\r\n
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 }