Java中的一些基础代码片段_3


=Start=

缘由:

在学习Java的过程中不断用文章进行整理总结(常用功能的Java实现),争取早日能较为熟练的使用Java进行开发。

正文:

参考解答:
7. Java中 文件操作 的方法总结
package com.ixyzero.learn.misc;

import java.io.*;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by ixyzero.com on 2018/6/9.
 */
public class TestFileRW {
    private String classPath = this.getClass().getClassLoader().getResource("").getPath();

    public static void main(String[] args) {

        // 项目所在路径
        System.out.println("System.getProperty(\"user.dir\") == " + System.getProperty("user.dir"));
        System.out.println("Paths.get(\".\").toAbsolutePath().normalize().toString() ==" + Paths.get(".").toAbsolutePath().normalize().toString());

        File currentDirectory = new File(new File(".").getAbsolutePath());
        try {
            System.out.println("currentDirectory.getCanonicalPath() == " + currentDirectory.getCanonicalPath());
            System.out.println("currentDirectory.getAbsolutePath() == " + currentDirectory.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
        }

        // class文件所在路径
        System.out.println(TestFileRW.class.getProtectionDomain().getCodeSource().getLocation().getFile());

        TestFileRW aFile = new TestFileRW();
        System.out.println(aFile.classPath);

        Map<String, Integer> exceptionMap = new HashMap<>();
        String filename = "/tmp/testInput.txt"; //最好指定绝对路径,避免找不到
        try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
            String line;
            while ( (line = br.readLine()) != null ) {
                line = line.replace(",", "").replace(";", "");
                String[] words = line.split(" ");
                for (String word: words) {
                    if (word.contains("Exception")) {
                        if (exceptionMap.get(word) != null) {
                            exceptionMap.put(word, exceptionMap.get(word)+1);
                        } else {
                            exceptionMap.put(word, 1);
                        }
                    }
                }
            }
            System.out.println();
            for (String key: exceptionMap.keySet()) {
                System.out.println(String.format("%s: %d", key, exceptionMap.get(key)));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
8. Java中 MySQL 的操作总结
package com.ixyzero.learn.misc;

import java.sql.*;

/**
 * Created by ixyzero.com on 2018/6/9.
 */
public class TestMySQL {
    // JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/db_name";

    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "username";
    static final String PASS = "password";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            // 注册 JDBC 驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // 执行查询
            System.out.println("实例化Statement对象...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, name, url FROM websites";
            ResultSet rs = stmt.executeQuery(sql);

            // 展开结果集数据库
            while(rs.next()){
                // 通过字段检索
                int id  = rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("url");

                // 输出数据
                System.out.print("ID: " + id);
                System.out.print(", 站点名称: " + name);
                System.out.print(", 站点 URL: " + url);
                System.out.println();
            }
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        } catch(SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch(Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if(stmt!=null) stmt.close();
            } catch(SQLException se2) {
                // 什么都不做
            }
            try {
                if(conn!=null) conn.close();
            } catch(SQLException se) {
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }

}

&

现在一般都是通过Maven管理的jar包依赖了,所以,根据本机的实际情况,在项目的pom.xml进行相应的添加,以避免「java.lang.ClassNotFoundException: com.mysql.jdbc.Driver」错误:

# ll ~/.m2/repository/mysql/mysql-connector-java
# tree ~/.m2/repository/mysql/mysql-connector-java

# add to pom.xml
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
9. Java中 redis 的操作总结
package com.ixyzero.learn.misc;

import redis.clients.jedis.Jedis;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * Created by ixyzero.com on 2018/6/9.
 */
public class TestRedis {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");

        //查看服务是否运行
        System.out.println("服务正在运行: " + jedis.ping());

        //设置 redis 字符串数据
        jedis.set("aKey", "ixyzero.com");
        // 获取存储的数据并输出
        System.out.println("redis 存储的字符串为: "+ jedis.get("aKey"));

        //存储数据到列表中
        jedis.lpush("site-list", "ixyzero");
        jedis.lpush("site-list", "Google");
        jedis.lpush("site-list", "Taobao");
        // 获取存储的数据并输出
        List<String> list = jedis.lrange("site-list", 0 ,2);
        for(int i=0; i<list.size(); i++) {
            System.out.println("列表项为: " + list.get(i));
        }

        // 获取数据并输出
        Set<String> keys = jedis.keys("*");
        Iterator<String> it = keys.iterator() ;
        while(it.hasNext()){
            String key = it.next();
            System.out.print(key + "\t");
            System.out.println(jedis.type(key));
            if (jedis.type(key).equals("string")) {
                System.out.println(jedis.get(key));
            } else if ( jedis.type(key).equals("list") ) {
                System.out.println(jedis.lrange(key, 0, -1));
            }
        }
    }
}

 

参考链接:
  • 如上

=END=

,

《 “Java中的一些基础代码片段_3” 》 有 16 条评论

  1. 对高并发流量控制的一点思考
    http://blog.51cto.com/zhangfengzhe/2066683
    `
    限流的常用处理手段有:计数器、滑动窗口、漏桶、令牌。

    限流神器:Guava RateLimiter
    Guava不仅仅在集合、缓存、异步回调等方面功能强大,而且还给我们封装好了限流的API!
    Guava RateLimiter基于令牌桶算法,我们只需要告诉RateLimiter系统限制的QPS是多少,那么RateLimiter将以这个速度往桶里面放入令牌,然后请求的时候,通过tryAcquire()方法向RateLimiter获取许可(令牌)。

    上面所说的限流的一些方式,都是针对单机而言的,其实大部分的场景,单机的限流已经足够了。分布式下限流的手段常常需要多种技术相结合,比如Nginx+Lua,Redis+Lua等去做。本文主要讨论的是单机的限流,这里就不在详细介绍分布式场景下的限流了。
    `

  2. Java中如何将日期字符串转换成ms的形式
    https://stackoverflow.com/questions/8826270/how-to-convert-hhmmss-sss-to-milliseconds
    https://www.mkyong.com/java/how-do-get-time-in-milliseconds-in-java/
    `
    private static final String TIME_FORMAT = “yyyy-MM-dd HH:mm:ss”;
    private static SimpleDateFormat sdf = new SimpleDateFormat(TIME_FORMAT);

    private long datetimeToLong(String datetime) {
    Date date = null;
    try {
    date = sdf.parse(datetime);
    return date.getTime();
    } catch (ParseException e) {
    e.printStackTrace();
    return -1;
    }
    }
    `

  3. 你应该知道的缓存进化史
    https://mp.weixin.qq.com/s/wnPrE4MglmCFxyAwtTh_5A
    `
    第一阶段:数据同步加redis
    通过消息队列进行数据同步至redis,然后Java应用直接去取缓存 这个阶段优点是:由于是使用的分布式缓存,所以数据更新快。缺点也比较明显:依赖Redis的稳定性,一旦redis挂了,整个缓存系统不可用,造成缓存雪崩,所有请求打到DB。

    第二,三阶段:JavaMap到Guava cache
    这个阶段使用进程内缓存作为一级缓存,redis作为二级。优点:不受外部系统影响,其他系统挂了,依然能使用。缺点:进程内缓存无法像分布式缓存那样做到实时更新。由于java内存有限,必定缓存得设置大小,然后有些缓存会被淘汰,就会有命中率的问题。

    第四阶段:Guava Cache刷新
    为了解决上面的问题,利用Guava Cache可以设置写后刷新时间,进行刷新。解决了一直不更新的问题,但是依然没有解决实时刷新。

    第五阶段:外部缓存异步刷新
    这个阶段扩展了Guava Cache,利用redis作为消息队列通知机制,通知其他java应用程序进行刷新。
    `

  4. 自己写分布式限流组件-基于Redis的RateLimter
    http://wuwenliang.net/2018/10/27/%E8%87%AA%E5%B7%B1%E5%86%99%E5%88%86%E5%B8%83%E5%BC%8F%E9%99%90%E6%B5%81%E7%BB%84%E4%BB%B6-%E5%9F%BA%E4%BA%8ERedis%E7%9A%84RateLimter/
    `
    1. 原理
    2. 需求
    3. 为何使用Lua
    4. 正式开发
    4.1. 1. 工程定义
    4.2. 2. Redis整合
    4.2.1. 2.1 坐标引入
    4.2.2. 2.2 注入CacheManager及RedisTemplate
    4.2.3. 2.3 调用方application.propertie需要增加Redis配置
    4.3. 3. 定义注解
    4.4. 4. 解析注解
    4.5. 5. Lua脚本
    5. 测试
    6. 总结
    `

  5. Java中判断某个字符串是否在某个集合中?
    https://stackoverflow.com/questions/4689334/how-can-i-check-if-an-element-exists-in-a-set-of-items
    `
    static final Set fruit = new HashSet(
    Arrays.asList(“APPLE”, “ORANGES”, “GRAPES”, /*many more*/));
    String fruitname = “test”;

    if (fruit.contains(fruitname)) {
    System.out.println(String.format(“fruit.contains(‘%s’) is True”, fruitname));
    }
    `
    https://stackoverflow.com/questions/12909871/how-to-check-in-java-if-set-contains-object-with-some-string-value
    https://softwareengineering.stackexchange.com/questions/280642/check-if-a-variable-is-equal-to-any-of-several-values

  6. Which version of guava is compatible with java 1.7 [closed]
    https://stackoverflow.com/questions/36045121/which-version-of-guava-is-compatible-with-java-1-7
    https://github.com/google/guava#guava-google-core-libraries-for-java
    `
    所有 Guava 20 及之前的版本都支持 Java 1.7 ,但 Guava 21 就需要 Java 8 或以上了。(All versions of Guava up to version 20 are compatible with Java 1.7.)

    Guava 20 (to be released in early 2016) will be the final Guava release to support Java 6, or even Java 7. Guava 21 (ideally mid-2016) will require Java 8.

    With version 21 we will also kick off a new fork, presumably called guava-android. It will maintain Java 6 compatibility, allowing it to be used for Android apps supporting a minimum version of Gingerbread.
    `

  7. 50道Java集合经典面试题(收藏版)
    https://mp.weixin.qq.com/s/wgdGuQ3rdmBpE7f4-htVGw
    https://github.com/whx123/JavaHome
    `
    1. Arraylist与LinkedList区别
    2. Collections.sort和Arrays.sort的实现原理
    3. HashMap原理,java8做了什么改变
    4. List 和 Set,Map 的区别
    5. poll()方法和 remove()方法的区别?
    6. HashMap,HashTable,ConcurrentHash的共同点和区别
    7. 写一段代码在遍历 ArrayList 时移除一个元素
    8. Java中怎么打印数组?
    9. TreeMap底层?
    10. HashMap 的扩容过程
    11. HashSet是如何保证不重复的
    12. HashMap 是线程安全的吗,为什么不是线程安全的?死循环问题?
    13. LinkedHashMap的应用,底层,原理
    14. 哪些集合类是线程安全的?哪些不安全?
    15. ArrayList 和 Vector 的区别是什么?
    16. Collection与Collections的区别是什么?
    17. 如何决定使用 HashMap 还是TreeMap?
    18. 如何实现数组和 List之间的转换?
    19. 迭代器 Iterator 是什么?怎么用,有什么特点?
    20. Iterator 和 ListIterator 有什么区别?
    21. 怎么确保一个集合不能被修改?
    22. 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
    23. 什么是Java优先级队列(Priority Queue)?
    24. JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。
    25. 阻塞队列的实现,ArrayBlockingQueue的底层实现?
    26. Java 中的 LinkedList是单向链表还是双向链表?
    27. 说一说ArrayList 的扩容机制吧
    28. HashMap 的长度为什么是2的幂次方,以及其他常量定义的含义~
    29. ConcurrenHashMap 原理?1.8 中为什么要用红黑树?
    30. ArrayList的默认大小
    31. 为何Collection不从Cloneable和Serializable接口继承?
    32. Enumeration和Iterator接口的区别?
    33. 我们如何对一组对象进行排序?
    34. 当一个集合被作为参数传递给一个函数时,如何才可以确保函数不能修改它?
    35. 说一下HashSet的实现原理?
    36. Array 和 ArrayList 有何区别?
    37. 为什么HashMap中String、Integer这样的包装类适合作为key?
    38. 如果想用Object作为hashMap的Key?;
    39. 讲讲红黑树的特点?
    40. Java集合类框架的最佳实践有哪些?
    42. HashSet和TreeSet有什么区别?
    43. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()?
    44. 说出ArrayList,LinkedList的存储性能和特性
    45. HashMap在JDK1.7和JDK1.8中有哪些不同?
    46. ArrayList集合加入1万条数据,应该怎么提高效率
    47. 如何对Object的list排序
    48. ArrayList 和 HashMap 的默认大小是多数?
    49. 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的
    50. HashMap是怎么解决哈希冲突的
    `

  8. Maven:Failed to create a Maven project ‘…pom.xml’ already exists in VFS 解决
    https://blog.csdn.net/chenyufeng1991/article/details/73724686/

    Failed to create maven project:’…/pom. xml”already exists in VFS
    https://mindartisan.blog.csdn.net/article/details/103876936
    `
    这往往是由于我们在同一个目录中创建了Project Name相同的项目导致的。因为在同一目录下不能创建两个Project Name相同的Project。

    解决办法:
    1. 用 IDEA 打开一个任意可以打开的项目;
    2. 选择 File->Invalidate Caches / Restart
    3. 点击 Invalidate and Restar 后即可重新创建项目
    `
    https://stackoverflow.com/questions/44443772/failed-to-create-maven-project-pom-xml-already-exists-in-vfs-intellij

  9. JDBC Connection
    https://appts4jvi.zhishibox.net/b/5d644b6f81cbc9e40460fe7eea3c7925
    `
    Java通过java.sql.DriverManager来管理所有数据库的驱动注册,所以如果想要建立数据库连接需要先在java.sql.DriverManager中注册对应的驱动类,然后调用getConnection方法才能连接上数据库。

    JDBC定义了一个叫java.sql.Driver的接口类负责实现对数据库的连接,所有的数据库驱动包都必须实现这个接口才能够完成数据库的连接操作。java.sql.DriverManager.getConnection(xx)其实就是间接的调用了java.sql.Driver类的connect方法实现数据库连接的。数据库连接成功后会返回一个叫做java.sql.Connection的数据库连接对象,一切对数据库的查询操作都将依赖于这个Connection对象。

    JDBC连接数据库的一般步骤:
    1. 注册驱动,Class.forName(“数据库驱动的类名”)。
    2. 获取连接,DriverManager.getConnection(xxx)。

    # 为什么需要Class.forName?
    很多人不理解为什么第一步必须是Class.forName(CLASS_NAME);// 注册JDBC驱动类,因为他们永远不会跟进驱动包去一探究竟。

    实际上这一步是利用了Java反射+类加载机制往DriverManager中注册了驱动包!

    Class.forName(“com.mysql.jdbc.Driver”)实际上会触发类加载,com.mysql.jdbc.Driver类将会被初始化,所以static静态语句块中的代码也将会被执行,所以看似毫无必要的Class.forName其实也是暗藏玄机的。如果反射某个类又不想初始化类方法有两种途径:
    1. 使用Class.forName(“xxxx”, false, loader)方法,将第二个参数传入false。
    2. ClassLoader.load(“xxxx”);

    # Class.forName可以省去吗?
    连接数据库就必须Class.forName(xxx)几乎已经成为了绝大部分人认为的既定事实而不可改变,但是某些人会发现删除Class.forName一样可以连接数据库这又作何解释?

    实际上这里又利用了Java的一大特性:Java SPI(Service Provider Interface),因为DriverManager在初始化的时候会调用java.util.ServiceLoader类提供的SPI机制,Java会自动扫描jar包中的META-INF/services目录下的文件,并且还会自动的Class.forName(文件中定义的类),这也就解释了为什么不需要Class.forName也能够成功连接数据库的原因了。
    `

  10. 一看你就懂,超详细java中的ClassLoader详解
    https://blog.csdn.net/briblue/article/details/54973413
    `
    Class文件的认识
    你还记得java环境变量吗?
    JAVA_HOME
    PATH
    CLASSPATH
    环境变量的设置与查看
    JAVA类加载流程
    加载顺序?
    ExtClassLoader源码
    AppClassLoader源码
    每个类加载器都有一个父加载器
    父加载器不是父类
    Bootstrap ClassLoader是由C++编写的。
    双亲委托
    重要方法
    loadClass()
    自定义ClassLoader
    自定义步骤
    defineClass()
    注意点:
    自定义ClassLoader示例之DiskClassLoader。
    回首
    关键字 路径
    自定义ClassLoader还能做什么?
    玩出花之Class解密类加载器
    1.定义加密解密协议
    2.编写加密工具类
    编写自定义classloader,DeClassLoader
    测试
    Context ClassLoader 线程上下文类加载器
    Context ClassLoader的运用时机
    总结
    下一步
    引用
    `

    Class ClassLoader
    https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html

  11. java.sql.SQLException: Unknown system variable ‘query_cache_size’ despite having latest JDBC
    https://stackoverflow.com/questions/64694663/java-sql-sqlexception-unknown-system-variable-query-cache-size-despite-having
    `
    The query_cache_size parameter was present in MySQL 5.x, but according to the manual it was removed in MySQL 8.0.3.

    (I presume you mean MySQL Connector/J 8.0.21).

    The error will be coming from the database, but it is simply saying that the parameter is no longer recognized.

    It won’t be caused by the MySQL Connector/J driver.

    It is most likely caused your application (e.g. executing a SET GLOBAL query_cache_size=… or similar) or a stray option in the JDBC url that your application is using when connecting to the database.
    ==
    网上说的原因是 mysql-connector-java 的版本太低,数据库驱动程序与数据库版本不对应,但是我把 mysql-connector-java 升级到当前最新版(8.0.28)也没有用,使用的mysql集群版本是8.0.18-9。试了升/降级 MySQL Connector/J 版本也都没有效果。
    短期内因为着急上线应用,先换了个5.7版本的mysql集群,后面再看这个问题咋弄。
    `

  12. JDBC 连接 MySQL 报错 Unknown system variable ‘query_cache_size‘
    https://blog.51cto.com/u_11812862/3048636

    java.sql.SQLException: Unknown system variable ‘query_cache_size’
    https://stackoverflow.com/questions/49984267/java-sql-sqlexception-unknown-system-variable-query-cache-size

    https://dev.mysql.com/doc/refman/5.7/en/query-cache.html
    `
    The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0.
    `

    https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html#optvars-removed
    `
    query_cache_size: Memory allocated to store results from old queries. Removed in MySQL 8.0.3.
    `

  13. java.sql.SQLException: Unknown system variable ‘query_cache_size’
    https://stackoverflow.com/questions/49984267/java-sql-sqlexception-unknown-system-variable-query-cache-size
    `
    For mysql 8:

    mysql-connector-java-8.0.17.jar (or above) + db.driver=com.mysql.cj.jdbc.Driver instead of com.mysql.jdbc.Driver

    总结一下就是:
    1. 升级 mysql-connector-java 版本
    2. 更新驱动为 com.mysql.cj.jdbc.Driver (以前一般用com.mysql.jdbc.Driver)
    ==
    在此之前最好先连上mysql看看server端的设置情况,因为在server端不支持的情况下,client端是没办法通过类似jdbc.url把 query_cache_size 的开关进行关闭的。
    > show global variables like ‘%query%’;
    > status
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注