JAvaSE学习笔记02_第1页
JAvaSE学习笔记02_第2页
JAvaSE学习笔记02_第3页
JAvaSE学习笔记02_第4页
JAvaSE学习笔记02_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.增强for循环。也叫新循环,增强循环2.增强for循环,就是为了遍历数组和集合用的。 For(元素类型 e : 集合或数组) 循环体 新循环并非是新的语法,而是在编译过程中,编译器会将新循环 转换成迭代器模式,所以循环本质是迭代器 在这个新循环的时候,也不能用集合的方法去修改集合的元素的个数。 新循环遍历集合的时候,接收数据的类型要用Object。因为集合 中可以放任何数据的类型3. 新循环是不关心循环次数的4. 泛型:在java5以后才推出的泛型只能是引用类型:所以不能之际写in类型的,执行写Integer Collection<Integer> c = new ArrayL

2、ist<Intger>();泛型的作用在于,约束这个集合中只能存放什么类型的数据实际上:泛型是假的Collection<String> c = new ArrayList<String>();在这我们定义的是String类型的,当我们在插入值的时候C.add(“a”);/实际上不是直接存入字符串,只是编译器提醒 我们要传入字符串。但是在创建了这个集合的对象的时候,保存的还是Object类型的,我们传入的Object类型的,但是当我们输出的时候会帮我们强转为我们泛型中指定的类型所以泛型的本质是Object类型的5. 泛型:注:泛型是假的 泛型的属性其本质就是O

3、bject类型的,只不过我们在编译程序的时候, Java编译器在帮我们检查师门实际用到属性时给定的类型是否正确 在获取泛型的值时,java虚拟机帮我们做了一次强转类型转换而已 是在get方法的返回值上进行的强转。6. List集合 List是可重复集合:有两个实现了ArrayList , LinkedList7. ArrayList:内部就是一个数组实现的8. LinkedList:内部就是一个链表实现的:链表分单向链表和循环链表 单向链表就是首尾不相连,循环链表就是首尾相连的。 链表结构的增删非常适合。就像我们自行车的链条一样,增删方便。 但是ArrayList的数组实现的,增删就非常不方便

4、,删除了一个。 后面的都有跟着动。但是链表的查询比较慢。 所以ArrayList,与LinkedList两个集合的作用,方法都一样。只是性能不一样9. List继承了Collecion的方法之外还有有其他的方法。是Set也没有的 其中就有,List可以用下标去操作元素,Set集合就没有10. List集合的set();方法。输入一个下标和一个元素。作用是指定下标传入指定值。 但是注意了,它会把你传入的下标的值给替换成了你新传入的值。 有个返回值,就是被你替换了的那个元素。没有的下标是不能替换的 get();方法的作用是,输入一个下标得到这个下标的值。下标也是从0开始的 get();方法只有Li

5、st才有,Collection中就没11. List集合的add方法;传入两个值。如果在已有的元素的下标下添加一个元素 那么会把原有的元素往后挤。12. List集合的remove方法;传入一个下标删除一个元素。返回值就是我们 删除的那个元素。这个可以告诉我们删除了什么元素,因为我们只传入了下标 Collection删除的remove方法没有返回值,因为 在Collection中的remove方法是根据传入一个元素来删除的,不是因为 传入下标来删除元素。13. List的subList();方法传入两个下标截取一定范围的元素。 返回的又是一个新的集合,所以我们接收要用新的集合来接收 如:Lis

6、t<Integer> list2 = list.subList(3,7);System.out.println(list2); /list2相当于list集合的子集合14. 如果一个List集合中放的数字,要把集合中的每个元素都乘以10 如:list这个集合中方法Integer类型的,3,4,5,6 。要把这几个元素 乘以是,可以用for循环,用集合的get方法,根据下标取出每一个 元素,乘以10之后。在用list集合的set方法来,根据下标替换元素。 注:在上面的13,中的subList方法,对list集合进行了截取一部分放到 新的集合list2中去,但是我们把list2中的元素

7、的值都替换成了乘以 10的元素,那么list集合中的对应的元素也会跟着乘以10, 会改变父类元素。15. List,通过toArray();方法把集合转换成数组 注:这个方法是Collection中的,所以Set集合也是能用,只是转换成Set 以后,这个数组就没有以前的顺序了。 在注:这个方法返回的是一个Object类型的数组。想要得到我们想要的类型 的数组还需要转化. 用强转。如: Object ob = list.toArray();/得到list集合转换的数组。 for(Object o : ob) String str = (String)o; System.out.println(s

8、tr); 如果我们一个list集合是String类型的,我们要直接转换成String 类型的数组用方法:String tostr = list.toArray(new Stringlist.size(); /这个方法只要传入一个参数就可以了。 传入的是生成这个数组的长度,如果这个长度你传入的值不能满足 list这个集合的长度,那么系统会自动给我们一个长度。数组的类型 是参照我们给定数组的类型,给的长度。但是这样不提倡16. 数组的工具类。Arrays类。其中sort用于排序;Arrays.sort() 其中:Arrays.asList();这个方法传入一个数组。把这个数组转换成List集合 返

9、回值是list集合。其中注意是不能转换成Set的。如果转换成了Set 集合的话,要是这个数组中有两个相同的元素,那么会出现丢数据 的现象。 List<String> list = Array.asList(array数组); 注意:如果把一个数组转换成了集合后,这个集合不能用,添加和删除的方法 因为这个集合继承了数组的特性。 如果用list集合的set方法,根据下标替换了一个元素,那么数组中的 元素也会因此而改变。17. 想要把一个数组直接输出,也需要用数组的工具类ArraysJava中是没有数组的,java中的数组都是靠Array类去实现的。Array这个类是靠C语言去实现的,A

10、rray是数组类的实现类,Arrays是工具类 用这个类重写了toString();的toString();方法。 System.out.println(Arrays.toString(传入一个数组);18. 集合的复制 所有的集合的实现类都支持一个构造方法,该构造方法传入一个Collection 那么该构造方法创建出来的集合默认就添加了给定集合中的所有的元素,这样的构造方法叫做复制构造器: 已经有集合list 如:List list2 = new ArrayList(list); Set set = new HashSet(list); list集合复制到Set集合也是可以的,Set集合复制

11、到list集合也是可以的 但是list复制到set存在很到的数据丢失的风险。19.集合的工具了Collections Collection是集合的父接口,Collections是集合的父接口20. 集合的排序方法。使用集合的工具类Collections中的sort();方法 Collections.sort();该方法传入一个集合21.Comparable 接口,实现他的compareTo();方法。这个方法返回一个int值 这个int中大于0的时候,说明当前对象大于给定的值,小于0说明当前对象 小于给定值,等于0的时候说明当前对象等于给定的值。 注Comparable接口的作用。是对一些不是

12、具体的值进行排序用的 如以下代码: public class Point implements Comparable<Point>private int x; /实现这个接口传入一个泛型,让这个接口的实现方法private int y; /能直接用这个类型进行比较。public Point(int x,int y)this.x=x;this.y=y;Overridepublic String toString() return "("+x+","+y+")"Overridepublic int compareTo(Poin

13、t o) int len = this.x*this.x+this.y*this.y;int lenl = o.x*o.x+o.y*o.y;return len-lenl; 实现类 public class ListDemo7 public static void main(String args) List<Point> list = new ArrayList<Point>();list.add(new Point(1,2);list.add(new Point(33,4);list.add(new Point(15,6);list.add(new Point(72

14、,8);System.out.println(list);Collections.sort(list);System.out.println(list); 如果我们没有在实体类中实现Comparable接口,那么我们出入的值就没法比较 如果我们实现了这个接口,实现了它的方法。这个方法就是用于这些比较的 其中:int len = this.x*this.x+this.y*this.y; int lenl = o.x*o.x+o.y*o.y; return len-lenl; 我们通过返回的值来进行比较。原理是由x,y值。两个值变成一个点 这个点到原点的距离做比较。这个通过原理得到的值来比较大小。

15、22. 如果传入集合中的是中文的字符串的话,排序方法是 调用Collections.sort();/的重载方法,出入两个参数 第一个参数是要排序的集合,第二个参数是比较规则 如下代码:实现字符串的排序,我们用字符串长度排序 public static void main(String args) List<String> list = new ArrayList<String>();MyComparator m = new MyComparator();list.add("张");list.add("张三2555");list.a

16、dd("张三33");list.add("张三4");Collections.sort(list,m);System.out.println(list); class MyComparator implements Comparator<String> public int compare(String o1, String o2) return o1.length()-o2.length();23.队列 Queue LinkedList是队列的实现类,ArrayList不是 队列添加元素用offer();方法 Queue<String

17、> queue = new LinkedList<String>();queue.offer("a"); 添加添加元素到队列用offer();方法。提取出来用queue.poll();方法, poll();方法的返回值类型是我们用offer();方法传入值时候的类型。 poll();方法是出队,当调用这个方法之后。这个队列中就没有这个元素了 。出队顺序是从第一个开始出。因为队列只有一个一个出队 当我们只是想引用队列中的第一个元素的时候,而不是让这个元素从队列中出来 我们用方法peek();这个方法就不会改变队列中元素的个数。这个方法的返回值 跟poll()

18、;方法的返回值一样 注:我们如果要遍历queue这个集合的时候,用for循环加poll();方法 for(int a=queue.size();a>0;a-) /问什么写这样的循环是因为,队列取一个元素就少一个元素。 如果按常用的for循环,写的a<queue.size()的长度的话, 这个长度会不断的变,最后就会取不完一些值。 所以我们一般遍历队列的时候用while循环,而不用for循环 只要在while中的条件判断queue.size();是不是大于0进可以了第二天1. 双端队列: Deque:双端队列与队列Queue的区别在于,双端队列两端都可以进出队列 当我们对双端队列进行

19、限制的时候,限制为只能从一端进出队列。不能 从双端进出。这样就形成了,经典数据结构:栈: 双端队列的实现类也是LinkedList Deque<String> stack = new LinkedList<String>(); 双端队列,放元素的方法是:stack.push(“one);/push=添加 放进去的元素,第一个放进去的放在最后。 双端队列的pop();方法跟队列Queue的poll方法一样,都是取出并删除 元素。2. Map:Map本身是一个接口。它不是一个集合,跟Collection没什么关系 Map看起来像是一个多行两列的表格,以key,value成对

20、的形式保存 注:在Map中key是不能重复的,如果我们再次用put();方法 往map中添加key相同的值,那么就会把以前对应的value 替换成新的value的值。3.Map的实现类时HashMap4.Map的put()方法;是往Map中存储元素的方法。这个方法需要传入两个参数 一个参数是Key,一个参数是value Map<String,Integer> map = new HashMap<String,Integer>(); map.put(“语文”,80); 注:在Map中如果key不存在的时候,会将key和value存入到Map中去,返回值 是一个null。所

21、以,如果value是一个包装类型的值的时候,我们在获取put 的返回值的时候,也要用包装类型去接收,而不能用基本类型,不然可能会发生 空指针异常。 如果key已经有了的情况下添加进去的话,返回的就是value的值。5. Map:直接用System.out.println(map);输出,Map本身是重写了toString的 可以直接输出Map6. Map:中获得元素的方式是根据给定的key,来获取对应的value的,若给定的 可以再map中不存在,则返回值为null。只是获得,但是不会删除 用get();方法获取元素:map.get(“语文”);/返回的是语文对应的成绩 返回的值,我们接收的时

22、候要注意,如果是包装类型注入的值,我们也用 包装类来接收 7.Map:中删除元素的方法,remove();/传入一个key,根据key删除对应的value 。在这若对应的key存在,那么这个方法的返回值则是这个key对应的值 如果我们传入的key不存在,那么返回值则是null。所在这个的返回值 也要用包装类来接收。8. Map:的containsKey();方法。这个方法传入一个key值。来验证这个map中 是不是存在这个key值,存在返回true,不存在返回false。9.Map:中的key对应一个hashCode值,当我们用map的get方法的时候 传入的key值,那么程序会直接去找key

23、的hashCode值。10. 使用HashMap的注意事项: 我们应该尽量保证,不相同的key,hashCode()值也要不相同。不然会大大的降低HashMap的解锁方法。如果两个对象equals比较返回true,那么这两个对象的hashCode值就相同在java中,我们在重写equals的时候,也要对应的重写hashCode方法。 HashCode();是一个方法。11. 遍历Map中的所以key,:调用的是keySet();方法: 这个方法返回的是一个Set集合。返回的是Set集合是因为Map的Key跟 Set集合一样,都是无序的,不能重复的。Set<String> Set的泛

24、型是字符串类型 这个类型是跟Map中的key对应的。12. Map:的entrySet();方法;返回的Set集合,这个Set<Entry>的泛型是Entry 类型的;这时候Set集合中存放的是Entry的键值对(键值对:就是一个 键值对中保存着一个组数据,包含了Map中key,value。 在这注意:Entry还要加一个泛型 如:Set<Entry<String,Integer>> entry = map.entrySet(); Entry约束的Set中存放的数据的类型,Entry<>中的泛型。是根据 Map中的泛型来的,因为entry中存的是

25、map的键值对。是用来约束 Entry中的数据的类型的。所以在这我们都要用遍历器,先遍历Set集合得到Entry<String,Integer>然后再从Entry中得到key,value Set<Entry<String,Integer>> entry = map.entrySet();Iterator<Entry<String,Integer>> it = entry.iterator();while(it.hasNext()Entry<String,Integer> en = it.next();String key

26、= en.getKey();int value = en.getValue();System.out.println("key:"+key+"-value:"+value);13. Map中遍历所有的value,不常用:方法是values(); 返回的Collection集合类型的 Collection<Integer> values = map.values();for(int value : values)System.out.println(value);14. 有序的Map:LinkedHashMap<> 因为有序,所以效

27、率比HashMap要低。用LinkedHashMap创建 的Map。输出的顺序,就与插入的时候的顺序一样。 使用与HashMap是一样的15. File类:文件操作类 /在Myeclipse中"."表示当前项目的根目录File file = new File(".demo.txt"); 在windows中的层级分隔符是.在liux中的层级分隔符是/ 所以在写一个java程序,要在Windows和Linx中都能运行 那么层级分隔符可以用方法File.separator 如:File file = new File("."+File.se

28、parator+"demo.txt"); 在Windows中注意。有的时候后缀名是隐藏的。16.通过File,我们可以获取文件或目录的属性信息(文件名,站多少字节等信息), 或者操作文件或目录(创建,删除)。但是不能对文件的内容进行修改17. 调用File的isFile();方法。可以获得这个文件是,文本文件还是目录 返回的是true,表示是这个文件是一个文本文件。18.调用File的getName();方法可以获得这个文件的名字19.File的length();方法。获取当前文件占用的字节量。返回的是一个long值20.File的lastModified();方法。可以得

29、到这个文本文件最后修改的时间。 返回的是一个long值的毫秒值。21. File的其他不常用的方法:canRead();/查看这个文件是否可读 canWrite();/ 可写 canExecute();/ 可运行 isHidden();/ 是否为影藏文件22. 怎么用File在硬盘中创建一个文本文件:用createNewFile();方法 代码如:/在当前项目的根目录下创建一个叫名问test.txt的文件File file = new File("test.txt");if(!file.exists()/现在这判断这个文件是否不存在,不在才创建file.createNewF

30、ile();System.out.println("创建文件成功"); Windows中创建文件,目录写 "D:"+File.separator+"zheng.txt"23. 删除硬盘中的一个文本文件用delete();方法。这个方法不要传入参数 这个也是要用exists();方法判断下这个文件是不是存在,再删除 注意:这个删除,在回收站中都已经没有了24. File file = new File(“test.txt”);/我们在这写这个文件的名字与路径 但是我们下面对这些文件的的方法操作不用传参数。那是因为。 都根据我们在这传的信

31、息去找文件了。25.File对目录的操作 File dir = new File(“文件名”); 通过File的isDirectory();方法判断这个文件是否是一个目录26. File中创建目录通过方法:mkdir(); 最好也是用exists();方法判断下这个目录是不是存在。27.File中删除目录通过方法:delete();这个与删除文本文件一样28.File中的mkdir();与mkdirs();方法的区别在于。mkdir();方法只能一次创建 一个目录。而mkdirs();能一次创建多级目录 如:File dir = new File("a"+File.sepa

32、rator+"b"+File.separator+ "c"+File.separator+"d"+File.separator+"e"+File.separator+"f");if(!dir.exists()dir.mkdirs();System.out.println("创建f目录成功");/这个方法能帮我们把f目录的上级没有的目录都创建出来29. File中创建多级目录的方法已经讲了 但是我们用delete删除一个目录的时候,如果这个目录中有类容就会删除不掉。第三天1.怎

33、么用File查询一个目录下,的其他的所有子项 首先判断这个文件是一个目录还是一个文本文件用isDirectory();方法 然后在用 listFiles();方法,这个方法返回的是一个File ,的数组 注意这个方法只能查看下一级的子项,多级下的就没法查 /查看当前项目根目录下的所以子项File dir = new File(".");if(dir.isDirectory()/判断这个文件是不是一个目录.我们项目的跟目录是一 File subs = dir.listFiles(); 个目录for(File sub : subs)String name = sub.getNa

34、me();long length = sub.length();System.out.println(name+":"+length);2. 文件过滤:实现接口FileFileter接口,然后实现这个接口的方法 然后我们在这个接口中定义,过滤条件。 满足这个条件的才输出 File dir = new File("."); if(dir.isDirectory()/创建一个过滤器实例FileFilter filter = new MyFilter();/使用过滤器,过滤子项File subs = dir.listFiles(filter);/把过滤器传入到

35、查询子项的方法中for(File sub :subs)System.out.println(sub.getName(); class MyFilter implements FileFilterOverridepublic boolean accept(File file) String name = file.getName();/得到字符串是不是以给定字符开头的boolean b = name.startsWith(".");/以点开头的那么都过滤掉return b;3. 如果我要创建一个文本文件,但是这个文本文件的父目录都不存在 这个时候用file.createNew

36、File();方法创建就会不成功 我们就要用方法,file.getParentFile();返回的就是一个目录,然后再 判断这个录存不存在,不存在就可以先创建目录,然后在用创建 文本文件的方法创建文本文档。 如下代码: File file = new File("a"+File.separator+"b"+File.separator+"c"+File.separator+"d"+File.separator+"e"+File.separator+"f.txt");/* *

37、创建文件时,首先要判断当前这个文件所在的父目录是否存在。 * ,因为若不存在,会抛出异常 */这个时候就要先判断父目录是不是存在,如果不存在那么就先把父目录创建出来File parent = file.getParentFile();if(!parent.exists()parent.mkdirs();if(!file.exists()file.createNewFile();4. RandomAccessFile类:是一个常用的读写文件内容的类 这个类的读写是基于指针的操作,这个类总是在当前指针的位置读写字节 使用方法:RandomAccessFile(“一个文件名,路径”,”r或rw”);

38、 r表示:只读。 rw表示:可读可写5.向文件中输出值,用RandomAccessFile 的write();方法 每次使用IO的东西,都要用close();关闭IO;6. write();方法向文件中写入值; read();方法从当前文件中读取一个字节。返回的是一个int值。但是一个 Int值是4个字节,所以这个读出来的int就是只有”低8位”有效。 所以最大就是255.当256的时候就会读取不到正确的值,只读的到低8位的值 若read();方法的返回值是-1的时候说明读到了文件的末尾。/我们在用write();方法向文件中写入个十进制的-1.那么对于int来说就是32个1。 在这种情况下的

39、时候write();方法会值写入低8位,那就是8个1进去。那么当我们用read(); 方法读取文件的时候读取的就是8个1.而8个1代表的值就是2557. 把一个源文件中的内容,读取并赋值到一个新的文件中: 方法如下代码 /原文件只需要能读就可以 RandomAccessFile raf = new RandomAccessFile("zheng.txt","r"); /原文件只需要能读就可以RandomAccessFile raf2 = new RandomAccessFile("zheng2.txt","rw")

40、;int a;while(a = raf.read()!=-1)raf2.write(a);raf.close();raf2.close();System.out.println("完毕");在这,我们把zheng.txt这个文件的内容只读,的读取出来,用read();方法read();方法每次读一个字节。我们再把这个字节值,赋值给变量a。 然后在于write();方法,把a写入到zheng2.txt这个文件中注:因为这个方法每次只读一个字节和写一个字节。所以效率非常的慢 若想提高读写效率,那么在读写数据的时候,就必须减少读写次数, 就不要一次只读写一个字节了。 在这wri

41、te(byte b);/write还有一个重载方法,传入一个byte数组, 一次把这个数组的内容全部写进去。 如果要向文本文件中写入一个字符串。用write(byte b);方法那么我们就要先用str.getBytes();/方法。这个方法返回的是一个byte 数组 String str = "我在中国,我在中国,江苏,苏州"byte b = str.getBytes();raf.write(b);/然后直接用这个方法,把字节传进去 注意:getBytes();方法是以当前系统的编码格式转换成的字节 我们还能getBytes(“指定一个编码格式“); 我们写入的方法writ

42、e(byte b);方法能传入一个字节数组。 那么read(byte b);方法也是能传入一个字节数组,让读取也一次从文件 中读取一个字节数组的量。 代码如: byte b = new byte50; int len = raf.read(b);/这个方法只是尝试着读50个字节。因为: 注:我们这个byte 数组声明的是50个字节,但是有可能读最后一次 剩下的不足50个字节了。那就实际有多少个字节就读取多少个字节。 这个返回的值len,就是这个方法实际上读取到的字节。 注:我们写入文件的时候用getBytes();方法,传入一个编码格式 把字符串转为字节数组。我们也可以用byte b = ne

43、w byte50; int len = raf2.read(b); String str = new String(b,"GBK"); 这个方法传入一个编码格式,与getBytes() 的编码格式一样,来读取文件8. 注意:当我们用代码,把一个源文件中的内容写到新的文件中的时候, 我们用byte ;字节数组,来提高两个文件之间的读写效率, 声明一个字节数组byte b = new byte1024*10;/一次读取10KB, 然后用方法read(byte b); 传入这个字节数组,要是不传入字节数组, 那么这个方法一次只读取了一个字节,就要调用write();方法来写入到新

44、的 文件中。所以用read()方法来读取文件,传一个字节数组。这就会以10KB 一次读取了以后才写入到另外一个新的文件中去,当最后一次读取的时候 没有10KB的时候,我们可以通过判断语句来验证read();方法的返回值,如果这个方法的返回值为-1,那么就说明。源文件中没有内容了。 以上是读取方法要注意的事项。当读取了,我们就要调用write();方法来向新文件中写入数据,这个方法也要传入参数,不然的话也会以一个字节一次写一次的效率写入新文件中。这二个方法我们也传入一个byte.注意这个方法除了这个byte数组之外还有两个参数,他们的作用如下:raf.write(byte ,0,len); 注意

45、:其中byte ;数组约束了我们一次能存入多少个字节,但是当我们从 源文件中最后一次读取的字节量,不足这个byte数组约束的字节量的时候那么这个时候的byte ,的其中一部分会是我们最后一次新读取出来的内容, 而还有部分会是我们上次读取的内容。因为我们倒数第二次读取源文件的 时候把读取出来的内容,把倒数第三次读取的内容在byte,中的内容 替换掉。所以我们最后一次我们读取的时候,新的内容不能替换倒数第二次读取的byte数组中的全部的内容。所以我们在用write();方法把字节数组中的内容写入到新文件中的时候,我们不能把这个byte 数组中从0到最后一个字节全部写入。int len = raf2

46、.read(b);raf.write(byte ,0,len);/所以我们用着两句代码可以约上其中0 表示从byte数组的第0个位置开始写入,len,表示写入到byte 数组的len这个位置。len是用read();方法在源文件中读取到多少个字节返回的一个值。如果最后一个读取,就只读取到10个字节,那么len=10那么就只会写入0到10个字节,byte数组中的其他字节不会被写入。那么这就可以避免,最后一次写入的时候会有点倒数第二次读取的部分内容。9:我们的write();方法一次只能写一个字节到文件中去,如果我有一个int 的最大值,int num = Integer.Max. 这个时候我们就

47、要注意了: 我们要把整个int的最大值写入到文件中,那么就要用>>>这个符号 ,这个叫无符号有移。 我们就要把 num>>>.来写入 raf.write(num>>>24); raf.write(num>>>16); raf.write(num>>>8); raf.write(num>>>0); 当然这样写非常麻烦。 这时我们可以用witeInt();方法,还有writDoubel(); writeLong();. 反之:读取也有readInt();方法第四天1. 递归: 有一个多级的目

48、录,用一个方法来一次删除 递归的原理就是,再次遇到同样的情况的时候,那么就再次调用这个方法 而不要再写循环。 方法的内部再次调用这个方法,就叫递归 如下代码: public static void main(String args) File file = new File("tst.txt");deleteFile(file);public static void deleteFile(File file)if(file.isDirectory()/如果这个文件是目录/如果是目录,还要看是否有子项File subs = file.listFiles();/先删除所有子项f

49、or(File sub : subs)deleteFile(sub);/如果sub下面还有目录,那么就再次调用这个方法file.delete();/如果不是目录是文件,那么就不会进入if语句,就直接删除2. 在RandomAccessFile,这个文件读写类中,用个方法可以获得我们 在调用读写方法的时候,产生的指针的移动位置。 方法:getFilePointer(); 这个方法返回的是一个long值,一个单位值为一个字节 因为,我们每次读写一个字节的时候,文件中的指针位置就会对应的 移动位置。 注:当我们往一个文件中用write();方法写入了5个字节的内容的时候。那么 这5个字节对应的下标就

50、是0到5(不包含5)。所以这个时候的指针位置 是在5这个位置。但是当我们用read();方法读取这个问价内容的时候 就需要把5这个位置的指针移动。不然返回的是-1,没有读取到任何内容 。这个时候就要用方法seek();这个方法可以传入一个long值来指定指针 位置。然后再开始阅读。3. RandomAccessFile还有个方法skipBytes() 这个方法跟seek();方法的作用差不多。也能指定指针的位置 其作用是跳过多少个字节。在指针当前的位置往后跳过字节。 传入的是一个int值,返回的也是一个int值 但是注意了。返回的值是实际上跳过的字节数。因为有可能我们指定的字节数 ,但是文件中

51、没有那么多的字节数。所以,返回的是实际跳过的字节数。4. 注意:我们读写都在一个程序中的时候,那么当我们在这个程序中创建了一个 文件,并向这个文件中写入东西的时候,指针会移动,那么当我们 再次在这个程序中写读取方法的时候要移动指针。但是当我们在一个新的 程序中写读取方法的时候,不要移动指针,因为这个时候指针,相对于 这个程序来说是从0开始的。5.节点流(低级流):可以从或向一个特定的地方(节点)读写数据 处理流(高级流):对一个已存在的刘的连接和封装,通过所封装的流的功能 调用实现数据读写。 节点流:有明确的进出去向:是字节流 处理流:不能独立存在,是提高我们程序的读写效率的, 通常是用于处理另外一个低级流用的,所以高级流的构造方法要 传入另外一个流作为参数。6. InputStream,OutputStream, 这两个是不能实例化,他们两个是抽象类。是所有输入输出流的父类 OututStream:所以字节输出流的父类。InputStream:所以字节输入流父类。7. InputStream,OutputStream。的第一个实现类 FileOutputStream,FileInputStream.这连个实现类都是专门用于对文件 进行写入写出的流。是两个低级流。是对字节进行操作的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论