Guava工具类

一、概述

    Guava是对Java API的补充,对Java开发中常用功能进行更优雅的实现,使得编码更加轻松,代码容易理解。Guava使用了多种设计模式,同时经过了很多测试,得到了越来越多开发团队的青睐。Java最新版本的API采纳了Guava的部分功能,但依旧无法替代。本文以Getting Started With Google Guava原文为学习材料,对Guava中常用的API进行学习,尽量覆盖比较有用的API,包括字符串处理,集合类处理,文件IO处理等。

二、字符串连接器Joiner

2.1 连接多个字符串并追加到StringBuilder

[java]  view plain  copy
  1. StringBuilder stringBuilder = new StringBuilder("hello");  
  2. // 字符串连接器,以|为分隔符,同时去掉null元素  
  3. Joiner joiner1 = Joiner.on("|").skipNulls();  
  4. // 构成一个字符串foo|bar|baz并添加到stringBuilder  
  5. stringBuilder = joiner1.appendTo(stringBuilder, "foo""bar"null"baz");  
  6. System.out.println(stringBuilder); // hellofoo|bar|baz  

2.2 连接List元素并写到文件流

[java]  view plain  copy
  1. FileWriter fileWriter = null;  
  2. try{  
  3.     fileWriter = new FileWriter(new File("/home/gzx/Documents/tmp.txt"));  
  4. }  
  5. catch(Exception e){  
  6.     System.out.println(e.getMessage());  
  7. }  
  8. List<Date> dateList = new ArrayList<Date>();  
  9. dateList.add(new Date());  
  10. dateList.add(null);  
  11. dateList.add(new Date());  
  12. // 构造连接器:如果有null元素,替换为no string  
  13. Joiner joiner2 = Joiner.on("#").useForNull("no string");  
  14. try{  
  15.     // 将list的元素的tostring()写到fileWriter,是否覆盖取决于fileWriter的打开方式,默认是覆盖,若有true,则是追加  
  16.     joiner2.appendTo(fileWriter, dateList);  
  17.     // 必须添加close(),否则不会写文件  
  18.     fileWriter.close();  
  19. }  
  20. catch(IOException e){  
  21.     System.out.println(e.getMessage());  
  22. }  

最后tmp.txt的内容为:

Tue Dec 20 16:51:09 CST 2016#no string#Tue Dec 20 16:51:09 CST 2016

2.3 将Map转化为字符串

[java]  view plain  copy
  1. Map<String, String> testMap = Maps.newLinkedHashMap();  
  2. testMap.put("Cookies""12332");  
  3. testMap.put("Content-Length""30000");  
  4. testMap.put("Date""2016.12.16");  
  5. testMap.put("Mime""text/html");  
  6. // 用:分割键值对,并用#分割每个元素,返回字符串  
  7. String returnedString = Joiner.on("#").withKeyValueSeparator(":").join(testMap);  
  8. System.out.println(returnedString); // Cookies:12332#Content-Length:30000#Date:2016.12.16#Mime:text/html  

三、 字符串分割器Splitter

3.1 将字符串分割为Iterable

[java]  view plain  copy
  1. // 分割符为|,并去掉得到元素的前后空白  
  2. Splitter sp = Splitter.on("|").trimResults();  
  3. String str = "hello | world | your | Name ";  
  4. Iterable<String> ss = sp.split(str);  
  5. for(String it : ss){  
  6.     System.out.println(it);  
  7. }  

结果为:

hello
world
your
Name

3.2 将字符串转化为Map

[java]  view plain  copy
  1. // 内部类的引用,得到分割器,将字符串解析为map  
  2. Splitter.MapSplitter ms = Splitter.on("#").withKeyValueSeparator(':');  
  3. Map<String, String> ret = ms.split(returnedString);  
  4. for(String it2 : ret.keySet()){  
  5.     System.out.println(it2 + " -> " + ret.get(it2));  
  6. }  
结果为:
Cookies -> 12332
Content-Length -> 30000
Date -> 2016.12.16
Mime -> text/html

四、 字符串工具类Strings

[java]  view plain  copy
  1. System.out.println(Strings.isNullOrEmpty("")); // true  
  2. System.out.println(Strings.isNullOrEmpty(null)); // true  
  3. System.out.println(Strings.isNullOrEmpty("hello")); // false  
  4. // 将null转化为""  
  5. System.out.println(Strings.nullToEmpty(null)); // ""  
  6.   
  7. // 从尾部不断补充T只到总共8个字符,如果源字符串已经达到或操作,则原样返回。类似的有padStart  
  8. System.out.println(Strings.padEnd("hello"8'T')); // helloTTT  

五、字符匹配器CharMatcher

5.1 空白一一替换

[java]  view plain  copy
  1. // 空白回车换行对应换成一个#,一对一换  
  2. String stringWithLinebreaks = "hello world\r\r\ryou are here\n\ntake it\t\t\teasy";  
  3. String s6 = CharMatcher.BREAKING_WHITESPACE.replaceFrom(stringWithLinebreaks,'#');  
  4. System.out.println(s6); // hello#world###you#are#here##take#it###easy  

5.2 连续空白缩成一个字符

[java]  view plain  copy
  1. // 将所有连在一起的空白回车换行字符换成一个#,倒塌  
  2. String tabString = "  hello   \n\t\tworld   you\r\nare             here  ";  
  3. String tabRet = CharMatcher.WHITESPACE.collapseFrom(tabString, '#');  
  4. System.out.println(tabRet); // #hello#world#you#are#here#  

5.3 去掉前后空白和缩成一个字符

[java]  view plain  copy
  1. // 在前面的基础上去掉字符串的前后空白,并将空白换成一个#  
  2. String trimRet = CharMatcher.WHITESPACE.trimAndCollapseFrom(tabString, '#');  
  3. System.out.println(trimRet);// hello#world#you#are#here  

5.4 保留数字

[java]  view plain  copy
  1. String letterAndNumber = "1234abcdABCD56789";  
  2. // 保留数字  
  3. String number = CharMatcher.JAVA_DIGIT.retainFrom(letterAndNumber);  
  4. System.out.println(number);// 123456789  

六、 断言工具类Preconditions   

[java]  view plain  copy
  1. // 检查是否为null,null将抛出异常IllegalArgumentException,且第二个参数为错误消息。  
  2. trimRet = null;  
  3. //Preconditions.checkNotNull(trimRet, "label can not be null");  
  4. int data = 10;  
  5. Preconditions.checkArgument(data < 100"data must be less than 100");  

七、对象工具类 Objects

7.1 Objects的toStringHelper和hashCode方法

[java]  view plain  copy
  1. // Book用Objects的相关方法简化toString(),hashCode()的实现。  
  2. // 用ComparisonChain简化compareTo()(Comparable接口)方法的实现。  
  3. Book book1 = new Book();  
  4. book1.setAuthor("Tom");  
  5. book1.setTitle("Children King");  
  6. book1.setIsbn("11341332443");  
  7. System.out.println(book1);  
  8. System.out.println(book1.hashCode());  
  9.   
  10. Book book2 = new Book();  
  11. book2.setAuthor("Amy");  
  12. book2.setTitle("Children King");  
  13. book2.setIsbn("111");  
  14. System.out.println(book2);  
  15. System.out.println(book2.hashCode());  
  16.   
  17. System.out.println(book1.compareTo(book2));  

结果为:

Book{author=Tom, title=Children King, isbn=11341332443, price=0.0}
268414056
Book{author=Amy, title=Children King, isbn=111, price=0.0}
-1726402621
1

7.2 Objects的firstNonNull方法

[java]  view plain  copy
  1. // 如果第一个为空,则返回第二个,同时为null,将抛出NullPointerException异常  
  2. String someString = null;  
  3. String value = Objects.firstNonNull(someString, "default value");  
  4. System.out.println(value); // deafult value  

Book.java

[java]  view plain  copy
  1. class Book implements Comparable<Book>{  
  2.     private String author;  
  3.     private String title;  
  4.     private String publisher;  
  5.     private String isbn;  
  6.     private double price;  
  7.   
  8.     public String getAuthor() {  
  9.         return author;  
  10.     }  
  11.   
  12.     public void setAuthor(String author) {  
  13.         this.author = author;  
  14.     }  
  15.   
  16.     public String getTitle() {  
  17.         return title;  
  18.     }  
  19.   
  20.     public void setTitle(String title) {  
  21.         this.title = title;  
  22.     }  
  23.   
  24.     public String getPublisher() {  
  25.         return publisher;  
  26.     }  
  27.   
  28.     public void setPublisher(String publisher) {  
  29.         this.publisher = publisher;  
  30.     }  
  31.   
  32.     public String getIsbn() {  
  33.         return isbn;  
  34.     }  
  35.   
  36.     public void setIsbn(String isbn) {  
  37.         this.isbn = isbn;  
  38.     }  
  39.   
  40.     public double getPrice() {  
  41.         return price;  
  42.     }  
  43.   
  44.     public void setPrice(double price) {  
  45.         this.price = price;  
  46.     }  
  47.   
  48.     // 定义第一二关键字  
  49.     @Override  
  50.     public int compareTo(Book o) {  
  51.         return ComparisonChain.start().compare(this.title, o.title).compare(this.isbn, o.isbn).result();  
  52.     }  
  53.   
  54.     public String toString(){  
  55.         return Objects.toStringHelper(this).omitNullValues().add("author", author).add("title", title)  
  56.                 .add("publisher", publisher).add("isbn", isbn).add("price", price).toString();  
  57.     }  
  58.   
  59.     public int hashCode(){  
  60.         return Objects.hashCode(author, title, publisher, isbn, price);  
  61.     }  
  62. }  

八、整体迭代接口FluentIterable

8.1 使用Predicate整体过滤

[java]  view plain  copy
  1. Person person1 = new Person("Wilma"30"F");  
  2. Person person2 = new Person("Fred"32"M");  
  3. Person person3 = new Person("Betty"32"F");  
  4. Person person4 = new Person("Barney"33"M");  
  5. List<Person> personList = Lists.newArrayList(person1, person2, person3, person4);  
  6.   
  7. // 过滤年龄大于等于32的person  
  8. Iterable<Person> personsFilteredByAge =  
  9.         FluentIterable.from(personList).filter(new Predicate<Person>() {  
  10.             @Override  
  11.             public boolean apply(Person input) {  
  12.                 return input.getAge() > 31;  
  13.             }  
  14.         });  
  15.   
  16. // Iterable有一个iterator方法,集合类都有一个Iterator方法  
  17. for(Iterator<Person> it = personsFilteredByAge.iterator(); it.hasNext();){  
  18.     System.out.println(it.next());  
  19. }  
  20. System.out.println(Iterables.contains(personsFilteredByAge, person2));  

结果为:

Person{name='Fred', sex='M', age=32}
Person{name='Betty', sex='F', age=32}
Person{name='Barney', sex='M', age=33}
true

8.2 使用Function整体替换,将List<Person>转化为List<String>

[java]  view plain  copy
  1. // 将List<Person> 转化为 List<String>,数据源为personList。整体迭代。  
  2. List<String> transformPersonList = FluentIterable.from(personList).transform(  
  3.         new Function<Person, String>(){  
  4.             @Override  
  5.             public String apply(Person person) {  
  6.                 // 不定参数,返回String类型  
  7.                 return Joiner.on("#").join(person.getName(), person.getSex(), person.getAge());  
  8.             }  
  9.         }  
  10. ).toList();  
  11. for(int i = 0; i < transformPersonList.size(); i++){  
  12.     System.out.println(transformPersonList.get(i));  
  13. }  

结果为:

Wilma#F#30
Fred#M#32
Betty#F#32
Barney#M#33

Person.java

[java]  view plain  copy
  1. class Person{  
  2.     private String name;  
  3.     private String sex;  
  4.     private int age;  
  5.     public Person(String name, int age, String sex){  
  6.         this.name = name;  
  7.         this.sex = sex;  
  8.         this.age = age;  
  9.     }  
  10.   
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.   
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.   
  19.     public String getSex() {  
  20.         return sex;  
  21.     }  
  22.   
  23.     public void setSex(String sex) {  
  24.         this.sex = sex;  
  25.     }  
  26.   
  27.     public int getAge() {  
  28.         return age;  
  29.     }  
  30.   
  31.     public void setAge(int age) {  
  32.         this.age = age;  
  33.     }  
  34.   
  35.     @Override  
  36.     public String toString() {  
  37.         return "Person{" +  
  38.                 "name='" + name + '\'' +  
  39.                 ", sex='" + sex + '\'' +  
  40.                 ", age=" + age +  
  41.                 '}';  
  42.     }  
  43. }  

九、 集合运算工具类Sets

9.1 集合差

[java]  view plain  copy
  1. // s1 - s2  
  2. Set<String> s1 = Sets.newHashSet("1""2""3""4");  
  3. Set<String> s2 = Sets.newHashSet("2""3""4""5");  
  4. // 得到第一个集合中有而第二个集合没有的字符串  
  5. Sets.SetView res = Sets.difference(s1, s2);  
  6. for(Iterator<String> it = res.iterator(); it.hasNext();){  
  7.     System.out.println(it.next()); // 1  
  8. }  

9.2 集合对称差

[java]  view plain  copy
  1. Sets.SetView res2 = Sets.symmetricDifference(s1, s2);  
  2. for(Object it14 : res2){  
  3.     System.out.println(it14); // 1 5  
  4. }  

9.3 集合交

[java]  view plain  copy
  1. // s1和s2的交集  
  2. Sets.SetView<String> res3 = Sets.intersection(s1, s2);  
  3. for(String it14 : res3){  
  4.     System.out.println(it14); // 2 3 4  
  5. }  

9.4 集合并

[java]  view plain  copy
  1. // 合并s1和s2  
  2. Sets.SetView<String> res4 = Sets.union(s1, s2);  
  3. for(String it14 : res4){  
  4.     System.out.println(it14); // 1 2 3 4 5  
  5. }  

十、Function和Predicate

10.1 利用Functions将Map转化为Function

[cpp]  view plain  copy
  1. Map<String, Person> mp = Maps.newHashMap();  
  2. mp.put(person1.getName(), person1);  
  3. mp.put(person2.getName(), person2);  
  4. mp.put(person3.getName(), person3);  
  5. mp.put(person4.getName(), person4);  
  6. // 将map转化为Function,Function的功能是将一个类型转化为另一个类型  
  7. Function<String, Person> lookup = Functions.forMap(mp);  
  8. // 如果键值不存在,则会抛出异常。lookup内部已经有元素  
  9. Person tmp = lookup.apply("Betty");  
  10. System.out.println(tmp == person3); // true  

10.2 Predicate单个判断

[java]  view plain  copy
  1. Predicate<Person> agePre = new Predicate<Person>(){  
  2.     @Override  
  3.     public boolean apply(Person person) {  
  4.         return person.getAge() < 32;  
  5.     }  
  6. };  
  7. Predicate<Person> namePre = new Predicate<Person>(){  
  8.     @Override  
  9.     public boolean apply(Person person) {  
  10.         return person.getName().equals("Betty");  
  11.     }  
  12. };  
  13. // 判断是否符合条件  
  14. System.out.println(agePre.apply(person2)); // false  
  15. System.out.println(agePre.apply(person3)); // false  
  16. System.out.println(namePre.apply(person2)); // false  
  17. System.out.println(namePre.apply(person3)); // true  

10.3 Predicates的and运算

[java]  view plain  copy
  1. // 利用Predicates工具类,同时满足两个条件成一个predicate  
  2. Predicate<Person> both = Predicates.and(agePre, namePre);  
  3. System.out.println(both.apply(person1)); // false  
  4. System.out.println(both.apply(person3)); // false  

10.4 Predicates的or运算

[java]  view plain  copy
  1. // 至少一个满足组成一个Predicate  
  2. Predicate<Person> orPre = Predicates.or(agePre, namePre);  
  3. System.out.println(orPre.apply(person2)); // false  

10.5 Predicates的compose运算

[java]  view plain  copy
  1. // 通过键name获得值Person,然后检查Person的age < 32,即agepre.apply(lookup.apply(name)) == true?  
  2. // lookup内部已经有集合  
  3. Predicate<String> two = Predicates.compose(agePre, lookup);  
  4. System.out.println(two.apply("Wilma")); // true  

十一、 Map工具类Maps

[java]  view plain  copy
  1. // 将List<Person> 转化为Map<String, Person>,其中键值对是person.name -> Person  
  2. Map<String, Person> myMp = Maps.uniqueIndex(personList.iterator(), new Function<Person, String>(){  
  3.     // name作为person的键  
  4.     @Override  
  5.     public String apply(Person person) {  
  6.         return person.getName();  
  7.     }  
  8. });  
  9. for(String name : myMp.keySet()){  
  10.     System.out.println(myMp.get(name));  
  11. }  
结果为:
Person{name='Wilma', sex='F', age=30}
Person{name='Fred', sex='M', age=32}
Person{name='Betty', sex='F', age=32}
Person{name='Barney', sex='M', age=33}

十二、一键多值类Multimap

12.1 数组存储多值类ArrayListMultimap

[java]  view plain  copy
  1. // 用ArrayList保存,一键多值,值不会被覆盖  
  2. ArrayListMultimap<String, String> multimap = ArrayListMultimap.create();  
  3. multimap.put("foo""1");  
  4. multimap.put("foo""2");  
  5. multimap.put("foo""3");  
  6. multimap.put("bar""a");  
  7. multimap.put("bar""a");  
  8. multimap.put("bar""b");  
  9. for(String it20 : multimap.keySet()){  
  10.     // 返回类型List<String>  
  11.     System.out.println(it20 + " : " + multimap.get(it20));  
  12. }  
  13. // 返回所有ArrayList的元素个数的和  
  14. System.out.println(multimap.size());  
结果为:
bar : [a, a, b]
foo : [1, 2, 3]
6

12.2 HashTable存储多值类 HashMultimap

[java]  view plain  copy
  1. //这里采用HashTable保存  
  2. HashMultimap<String, String> hashMultimap = HashMultimap.create();  
  3. hashMultimap.put("foo""1");  
  4. hashMultimap.put("foo""2");  
  5. hashMultimap.put("foo""3");  
  6. // 重复的键值对值保留一个  
  7. hashMultimap.put("bar""a");  
  8. hashMultimap.put("bar""a");  
  9. hashMultimap.put("bar""b");  
  10. for(String it20 : hashMultimap.keySet()){  
  11.     // 返回类型List<String>  
  12.     System.out.println(it20 + " : " + hashMultimap.get(it20));  
  13. }  
  14. // 5  
  15. System.out.println(hashMultimap.size());  
结果为:
bar : [a, b]
foo : [1, 2, 3]
5

十三、多键类Table

13.1 两个键操作

[java]  view plain  copy
  1. // 两个键row key和column key,其实就是map中map, map<Integer, map<Integer, String> > mp  
  2. HashBasedTable<Integer, Integer, String> table = HashBasedTable.create();  
  3. table.put(11"book");  
  4. table.put(12"turkey");  
  5. table.put(22"apple");  
  6. System.out.println(table.get(11)); // book  
  7. System.out.println(table.contains(23)); // false  
  8. System.out.println(table.containsRow(2)); // true  
  9. table.remove(22);  
  10. System.out.println(table.get(22)); // null  

13.2 获取一个Map

[java]  view plain  copy
  1. // 获取单独的一个map  
  2. Map<Integer, String> row = table.row(1);  
  3. Map<Integer, String> column = table.column(2);  
  4. System.out.println(row.get(1)); // book  
  5. System.out.println(column.get(1)); // turkey  

十四、 可以通过value获取key的HashBiMap 

14.1 value不可以有相同的key

[java]  view plain  copy
  1. BiMap<String, String> biMap = HashBiMap.create();  
  2. // value可以作为Key,即value不可以有多个对应的值  
  3. biMap.put("hello""world");  
  4. biMap.put("123""tell");  
  5. biMap.put("123""none"); // 覆盖tell  
  6. // biMap.put("abc", "world"); 失败  
  7. // 下面是强制替换第一对  
  8. biMap.forcePut("abc""world");  
  9. System.out.println(biMap.size()); // 2  
  10. System.out.println(biMap.get("hello"));// null  
  11. System.out.println(biMap.get("abc")); // world  
  12. System.out.println(biMap.get("123")); // none  

14.2 键值对互换得到新的BiMap

[java]  view plain  copy
  1. // 键值对互换  
  2. BiMap<String, String> inverseMap = biMap.inverse();  
  3. System.out.println(inverseMap.get("world")); // abc  
  4. System.out.println(inverseMap.get("tell")); // null  
  5. System.out.println(inverseMap.get(null)); // null  

十五、不可变集合类ImmutableListMultimap

[java]  view plain  copy
  1. // 不可变的集合,都有一个Builder内部类。不可以修改和添加  
  2. Multimap<Integer, String> map = new ImmutableListMultimap.Builder<Integer, String>().put(1"hello")  
  3.         .putAll(2"abc""log""in").putAll(3"get""up").build();  
  4. System.out.println(map.get(2)); // [abc, log, in]  

十六、 区间工具类Range

[java]  view plain  copy
  1. // 闭区间  
  2. Range<Integer> closedRange = Range.closed(3033);  
  3. System.out.println(closedRange.contains(30)); // true  
  4. System.out.println(closedRange.contains(33)); // true  
  5.   
  6. // 开区间  
  7. Range<Integer> openRange = Range.open(3033);  
  8. System.out.println(openRange.contains(30)); // false  
  9. System.out.println(openRange.contains(33)); // false  
  10.   
  11. Function<Person, Integer> ageFunction = new Function<Person, Integer>(){  
  12.     @Override  
  13.     public Integer apply(Person person) {  
  14.         return person.getAge();  
  15.     }  
  16. };  
  17. // Range实现了Predicate接口,这里的第一个参数是Predicate,第二个参数是Function  
  18. // ageFunction必须返回整数  
  19. Predicate<Person> agePredicate = Predicates.compose(closedRange, ageFunction);  
  20. System.out.println(agePredicate.apply(person1)); // person1.age == 30 true  

 十七、比较器工具类 Ordering

17.1 逆置比较器

[java]  view plain  copy
  1. // 自定义比较器,嵌入式的比较器,匿名类。注意这里有两个person参数,与Comparable的区别  
  2. Comparator<Person> ageCmp = new Comparator<Person>(){  
  3.     // Ints是Guava提供的,递增  
  4.     @Override  
  5.     public int compare(Person o1, Person o2) {  
  6.         return Ints.compare(o1.getAge(), o2.getAge());  
  7.     }  
  8. };  
  9. List<Person> list = Lists.newArrayList(person1, person2, person3, person4);  
  10. // 将比较器转化为Ordering,得到比较器ageCmp的相反比较器,递减  
  11. Collections.sort(list, Ordering.from(ageCmp).reverse());  
  12. for(Iterator<Person> iter = list.iterator(); iter.hasNext(); ){  
  13.     System.out.println(iter.next());  
结果为:
Person{name='Barney', sex='M', age=33}
Person{name='Fred', sex='M', age=32}
Person{name='Betty', sex='F', age=32}
Person{name='Wilma', sex='F', age=30}

17.2 组合多个比较器

[java]  view plain  copy
  1. // 按照名字排序  
  2. Comparator<Person> nameCmp = new Comparator<Person>(){  
  3.     @Override // 两个对象,而Comparable是this和一个对象  
  4.     public int compare(Person o1, Person o2) {  
  5.         return o1.getName().compareTo(o2.getName());  
  6.     }  
  7. };  
  8. // 组合两个比较器,得到第一二排序关键字  
  9. // 年龄相同时按照名字排序  
  10. Ordering order = Ordering.from(ageCmp).compound(nameCmp);  
  11. Collections.sort(list, order);  
  12. for(Iterator<Person> iter = list.iterator(); iter.hasNext(); ){  
  13.     System.out.println(iter.next());  
  14. }  

结果为:

Person{name='Wilma', sex='F', age=30}
Person{name='Betty', sex='F', age=32}
Person{name='Fred', sex='M', age=32}
Person{name='Barney', sex='M', age=33}

17.3 直接获取最小几个和最大几个

[java]  view plain  copy
  1. Ordering order2 = Ordering.from(nameCmp);  
  2. // 最小的两个,无序  
  3. System.out.println("least 2...");  
  4. List<Person> least = order2.leastOf(personList, 2);  
  5. for(int i = 0; i < 2; i++){  
  6.     System.out.println(least.get(i));  
  7. }  
  8. // 最大的三个,无序  
  9. System.out.println("greatest 3....");  
  10. List<Person> great = order2.greatestOf(personList, 3);  
  11. for(int i = 0; i < 3; i++){  
  12.     System.out.println(great.get(i));  
  13. }  
结果为:
least 2...
Person{name='Barney', sex='M', age=33}
Person{name='Betty', sex='F', age=32}
greatest 3....
Person{name='Wilma', sex='F', age=30}
Person{name='Fred', sex='M', age=32}
Person{name='Betty', sex='F', age=32}

十八、 文件工具类Files

18.1 复制移动重命名文件

[java]  view plain  copy
  1. // 文件操作:复制,移动,重命名  
  2. File originFile = new File("/home/gzx/Documents/Program/Java/abc.java");  
  3. File copyFile = new File("/home/gzx/Documents/test.java");  
  4. File mvFile = new File("/home/gzx/Documents/abc.java");  
  5. try {  
  6.     Files.copy(originFile, copyFile);  
  7.     Files.move(copyFile, mvFile); // 重命名  
  8. }  
  9. catch(IOException e){  
  10.     e.printStackTrace();  
  11. }  

18.2 获取文件哈希码

[java]  view plain  copy
  1. try {  
  2.     // File,HashFunction  
  3.     HashCode hashCode = Files.hash(originFile, Hashing.md5());  
  4.     System.out.println(originFile.getName() + " : " + hashCode);  
  5. catch (IOException e) {  
  6.     e.printStackTrace();  
  7. }  
结果为:abc.java : 66721c8573de09bd17bafac125e63e98

18.3 读取文件流,将文件行转化为List

[java]  view plain  copy
  1. // 读文件流  
  2. int lineNumber = 1;  
  3. try {  
  4.     // 读出所有的行到list中,去掉\n  
  5.     List<String> list2 = Files.readLines(mvFile, Charsets.UTF_8);  
  6.     for(Iterator<String> it = list2.iterator(); it.hasNext();){  
  7.         System.out.println("line " + lineNumber + ":" + it.next());  
  8.         lineNumber++;  
  9.     }  
  10. catch (IOException e) {  
  11.     e.printStackTrace();  
  12. }  

结果为:

line 1:public class test{
line 2: static String str;
line 3: public static void main(String[] args){
line 4:
line 5: System.out.println(str);
line 6: }
line 7:}

18.4 将文件行进行处理,再得到List

[java]  view plain  copy
  1. // LineProcessor处理每一行,得到返回值  
  2. /* 
  3.     内容: 
  4.     Linux命令行大全,人民邮电出版社 
  5.     Linux内核完全注释,机械工业出版社 
  6.     Linux命令行和shell脚本编程大全,人民邮电出版社 
  7.  */  
  8. File bookFile = new File("/home/gzx/Documents/book.txt");  
  9. try {  
  10.     // 只取书名  
  11.     List<String> list3 = Files.readLines(bookFile, Charsets.UTF_8, new TitleLineProcessor());  
  12.     for(Iterator<String> it = list3.iterator(); it.hasNext();){  
  13.         System.out.println(it.next());  
  14.     }  
  15. catch (IOException e) {  
  16.     e.printStackTrace();  
  17. }  

结果为:

Linux命令行大全
Linux内核完全注释
Linux命令行和shell脚本编程大全

18.5 写文件流

[java]  view plain  copy
  1. // 写文件流  
  2. File writeFile = new File("/home/gzx/Documents/write.txt");  
  3. try {  
  4.     // 不必打开或关闭文件流,会自动写盘  
  5.     Files.write("hello world!", writeFile, Charsets.UTF_8); // 重新写  
  6.     Files.append("你的名字", writeFile, Charsets.UTF_8); // 追加  
  7. catch (IOException e) {  
  8.     e.printStackTrace();  
  9. }  

write.txt的内容为

hello world!你的名字

TitleLineProcessor.java

[java]  view plain  copy
  1. class TitleLineProcessor implements LineProcessor<List<String>>{  
  2.     private final static int INDEX = 0;  
  3.     private final static Splitter splitter = Splitter.on(",");  
  4.     private List<String> titles = new ArrayList<String>();  
  5.     // 每一行都会调用这个函数,进而追加成一个list  
  6.     @Override  
  7.     public boolean processLine(String s) throws IOException {  
  8.         // 获取第一项,并追加到titles  
  9.         titles.add(Iterables.get(splitter.split(s), INDEX));  
  10.         return true;  
  11.     }  
  12.   
  13.     // 最终的结果  
  14.     @Override  
  15.     public List<String> getResult() {  
  16.         return titles;  
  17.     }  
  18. }  

十九、 读输入字节流ByteSource和写输出字节流ByteSink

[java]  view plain  copy
  1. // source是源的意思,封装输入流  
  2. ByteSource byteSource = Files.asByteSource(writeFile);  
  3. try {  
  4.     byte[] contents1 = byteSource.read();  
  5.     byte[] contents2 = Files.toByteArray(writeFile); // 两个方法的作用相同  
  6.     for(int i = 0; i < contents1.length; i++){  
  7.         assert(contents1[i] == contents2[i]);  
  8.         System.out.print(contents1[i] + " ");  
  9.     }  
  10. catch (IOException e) {  
  11.     e.printStackTrace();  
  12. }  
  13.   
  14. // sink是目的地的意思,封装输出流,流会自动关闭  
  15. File tmpFile = new File("/home/gzx/Documents/hello.txt"); // acd  
  16. ByteSink byteSink = Files.asByteSink(tmpFile);  
  17. try {  
  18.     byteSink.write(new byte[]{'a''c''d''\n'});  
  19. catch (IOException e) {  
  20.     e.printStackTrace();  
  21. }  

二十、 编码工具类BaseEncoding

[java]  view plain  copy
  1. File pdfFile = new File("/home/gzx/Documents/google.pdf");  
  2. BaseEncoding baseEncoding = BaseEncoding.base64();  
  3. try {  
  4.     byte[] content = Files.toByteArray(pdfFile);  
  5.     String encoded = baseEncoding.encode(content); // 将不可打印的字符串转化为可以打印的字符串A-Za-z0-9/+=,pdf不是纯文本文件  
  6.     System.out.println("encoded:\n" + encoded);  
  7.     System.out.println(Pattern.matches("[A-Za-z0-9/+=]+", encoded));  
  8.     // 获得对应的加密字符串,可以解密,可逆的,得到原来的字节  
  9.     byte[] decoded = baseEncoding.decode(encoded);  
  10.     for(int i = 0; i < content.length; i++){  
  11.         assert(content[i] == decoded[i]);  
  12.     }  
  13. catch (IOException e) {  
  14.     e.printStackTrace();  
  15. }  

二十一、 提醒处理null的类Optional

[java]  view plain  copy
  1. Optional<Person> optional = Optional.fromNullable(person1); // 允许参数为null  
  2. System.out.println(optional.isPresent()); // true  
  3. System.out.println(optional.get() == person1); // 如果是person1 == null,get将抛出IllegalStateException, true  
  4.   
  5. Optional<Person> optional2 = Optional.of(person1); // 不允许参数为null。如果person1 == null, 将抛出NullPointerException  
  6. System.out.println(optional2.isPresent()); // true  

猜你喜欢

转载自blog.csdn.net/xiaohanzuofengzhou/article/details/80075844