原文地址 :http://blog.csdn.net/ac_dao_di/article/details/53750028

github : https://github.com/google/guava

Maven:

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>24.0-jre</version><!-- or, for Android: --><version>24.0-android</version>
</dependency>

jar :

https://github.com/google/guava/releases/tag/v24.0

一、概述

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. // 从尾部不断补充T只到总共8个字符,如果源字符串已经达到或操作,则原样返回。类似的有padStart
  7. 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. Book book2 = new Book();
  10. book2.setAuthor("Amy");
  11. book2.setTitle("Children King");
  12. book2.setIsbn("111");
  13. System.out.println(book2);
  14. System.out.println(book2.hashCode());
  15. 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. public String getAuthor() {
  8. return author;
  9. }
  10. public void setAuthor(String author) {
  11. this.author = author;
  12. }
  13. public String getTitle() {
  14. return title;
  15. }
  16. public void setTitle(String title) {
  17. this.title = title;
  18. }
  19. public String getPublisher() {
  20. return publisher;
  21. }
  22. public void setPublisher(String publisher) {
  23. this.publisher = publisher;
  24. }
  25. public String getIsbn() {
  26. return isbn;
  27. }
  28. public void setIsbn(String isbn) {
  29. this.isbn = isbn;
  30. }
  31. public double getPrice() {
  32. return price;
  33. }
  34. public void setPrice(double price) {
  35. this.price = price;
  36. }
  37. // 定义第一二关键字
  38. @Override
  39. public int compareTo(Book o) {
  40. return ComparisonChain.start().compare(this.title, o.title).compare(this.isbn, o.isbn).result();
  41. }
  42. public String toString(){
  43. return Objects.toStringHelper(this).omitNullValues().add("author", author).add("title", title)
  44. .add("publisher", publisher).add("isbn", isbn).add("price", price).toString();
  45. }
  46. public int hashCode(){
  47. return Objects.hashCode(author, title, publisher, isbn, price);
  48. }
  49. }

八、整体迭代接口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. // 过滤年龄大于等于32的person
  7. Iterable<Person> personsFilteredByAge =
  8. FluentIterable.from(personList).filter(new Predicate<Person>() {
  9. @Override
  10. public boolean apply(Person input) {
  11. return input.getAge() > 31;
  12. }
  13. });
  14. // Iterable有一个iterator方法,集合类都有一个Iterator方法
  15. for(Iterator<Person> it = personsFilteredByAge.iterator(); it.hasNext();){
  16. System.out.println(it.next());
  17. }
  18. 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. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public String getSex() {
  17. return sex;
  18. }
  19. public void setSex(String sex) {
  20. this.sex = sex;
  21. }
  22. public int getAge() {
  23. return age;
  24. }
  25. public void setAge(int age) {
  26. this.age = age;
  27. }
  28. @Override
  29. public String toString() {
  30. return "Person{" +
  31. "name='" + name + '\'' +
  32. ", sex='" + sex + '\'' +
  33. ", age=" + age +
  34. '}';
  35. }
  36. }

九、 集合运算工具类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(1, 1, "book");
  4. table.put(1, 2, "turkey");
  5. table.put(2, 2, "apple");
  6. System.out.println(table.get(1, 1)); // book
  7. System.out.println(table.contains(2, 3)); // false
  8. System.out.println(table.containsRow(2)); // true
  9. table.remove(2, 2);
  10. System.out.println(table.get(2, 2)); // 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(30, 33);
  3. System.out.println(closedRange.contains(30)); // true
  4. System.out.println(closedRange.contains(33)); // true
  5. // 开区间
  6. Range<Integer> openRange = Range.open(30, 33);
  7. System.out.println(openRange.contains(30)); // false
  8. System.out.println(openRange.contains(33)); // false
  9. Function<Person, Integer> ageFunction = new Function<Person, Integer>(){
  10. @Override
  11. public Integer apply(Person person) {
  12. return person.getAge();
  13. }
  14. };
  15. // Range实现了Predicate接口,这里的第一个参数是Predicate,第二个参数是Function
  16. // ageFunction必须返回整数
  17. Predicate<Person> agePredicate = Predicates.compose(closedRange, ageFunction);
  18. 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. @Override
  14. public List<String> getResult() {
  15. return titles;
  16. }
  17. }

十九、 读输入字节流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. // sink是目的地的意思,封装输出流,流会自动关闭
  14. File tmpFile = new File("/home/gzx/Documents/hello.txt"); // acd
  15. ByteSink byteSink = Files.asByteSink(tmpFile);
  16. try {
  17. byteSink.write(new byte[]{'a', 'c', 'd', '\n'});
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }

二十、 编码工具类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. Optional<Person> optional2 = Optional.of(person1); // 不允许参数为null。如果person1 == null, 将抛出NullPointerException
  5. System.out.println(optional2.isPresent()); // true

guava 工具类及代码相关推荐

  1. 谷歌Guava工具类的使用(1):BloomFilter的使用

    谷歌Guava工具类的使用(1):BloomFilter的使用 具体代码实现如下所示: // 创建布隆过滤器,设置存储的数据类型,预期数据量,误判率 (必须大于0,小于1) int insertion ...

  2. Java Guava工具类的使用

    Guava工具类简介 在开发中,工具类的使用避免上重复造轮子,极大的节省了开发时间,提高了工作效率,Google公司提供的Guava工具类,高效设计良好的API,遵循高效的java语法,使代码更加简洁 ...

  3. java ajax翻页_分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解

    [博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] htt ...

  4. java工具谷歌工具-Google guava工具类的介绍和使用

    工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率.谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来.所以就诞生了guava. guava的优点: 高效设计 ...

  5. Guava工具类真心好用,无须重复轮子!

    文章来源:https://c1n.cn/gST6P 目录 Google Guava 概述 不可变集合与对象 Guava 新集合类型 JDK 集合辅助工具类 JDK 基本类型辅助工具类 JDK 字符串辅 ...

  6. 使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码

     1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/ 案例效果如下: 2.引入JCrop的js代码,具体要引入那 ...

  7. 汉字转拼音 java_Java汉字转拼音工具类完整代码实例

    添加依赖 com.belerweb pinyin4j 2.5.1 工具类代码: public class PinYinUtils { public static HanyuPinyinOutputFo ...

  8. JAVA emoji表情处理工具类EmojiCharacterUtil代码修正

    之前做emoji表情处理的时候在网上找到这个工具类源码,复制下来后发现反解析是不正确,不知这个是作者故意设的小坑让我们去读代码还是copy的人粗心大意,经仔细查看,送上正确的源码,修正内容为83-90 ...

  9. C#万能工具类部分代码

    C#万能工具类 class Utils {//获取路径public static string GetImagePath(){string personImgPath = Path.GetDirect ...

  10. java pinyin4j.jar 下载_Java pinyin4j 工具类实现代码分享

    工具类代码:package com.what21.util.pinyin; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourc ...

最新文章

  1. 使用KMeanCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小距离点
  2. SDN第三次上机作业
  3. 深度学习RCNN, Fast-RCNN, Faster-RCNN的一些事
  4. C++ 私有构造函数的作用
  5. Kaggle Titanic补充篇
  6. Swift中文教程(十八) 类型检查
  7. Linux定时器:无节拍机制tickless(CONFIG_NO_HZ)
  8. python3怎么使用mnist_loader_Python读取mnist
  9. ios简单sqlite使用
  10. 计算机基础(二):嵌入式驱动、图像处理知识设备小结
  11. win10下驱动级套节字通信(ksocket)
  12. 【转】3个普通IO识别22个按键试验
  13. 《数字图像处理》——高频强调滤波
  14. LQR控制算法及代码实践
  15. 在线发送免费传真(五个网上免费发传真网站介绍)
  16. python谐音梗_谐音梗生成器
  17. 怎样在html中插入ppt,PPT怎么插入网页中的视频
  18. 生活感悟-1 小胜凭智,大胜靠德
  19. 火狐浏览器怎么样 火狐浏览器都有哪些优缺点
  20. 聊一聊DDR3中的ODT(On-die termination)

热门文章

  1. Crossoft Minesweeper Hexagon for Mac
  2. Resource is out of sync with the file system
  3. 20款优秀的可以替代桌面软件的Web应用(转载自JavaEye)
  4. Gadgets 侧边栏小工具 跟踪调试方法
  5. 为什么使用梯度下降法或者梯度上升法
  6. nginx 二级目录 php,nginx两个tp程序一个放到二级目录下,我们要如何访问
  7. 进程被kill原因_Linux内核系列 简析进程生命周期:从生到死的这一生(一)
  8. 拓端tecdat|matlab对MCMC贝叶斯方法用于加筋复合板的冲击载荷识别
  9. pands库中的一些函数用法
  10. 带头结点的单链表的插入删除和遍历操作