Java程序员的日常——经验贴(纯干货)二

继昨天的经验贴,今天的工作又收获不少。

windows下编辑器会给文件添加BOM

在windows的编辑器中,为了区分编码,通常会添加一个BOM标记。比如,记事本、nodepade++、sublimeText都会出现这个问题。如果使用filereader去读,就会发现第一行出现了乱码:

123
查看其bytes可以发现为:
[-17] [-69] [-65] [49] [50] [51] 

此时,可以使用编辑器比如nodepad++,点击encoding,设置为encode with utf-8 without bom,这样就没有问题了。

测试程序可以参考:

File file = new File("C:/Users/xinghl/Desktop/test.txt");
        BufferedRandomAccessFile bf =null;
        try {
            bf = new BufferedRandomAccessFile(file, "r");
            String line;
            while ((line = bf.readLine()) != null) {
                System.out.println(line);
                byte[] bytes = line.getBytes("ISO-8859-1");
                for(byte b : bytes){
                    System.out.print("["+b+"] ");
                }
                break;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            if(bf != null){
                try {
                    bf.close();
                } catch (Exception e2) {
                }
            }
        }

Socket中的Timeout

Socket可以保证TCP进行长时间的连接,并且可以进行IO的复用,避免每次发送数据都需要建立连接。那么就会涉及到两种超时:

  • 连接超时,即Socket连接服务器的时间,默认是0,即无超时
  • 读写超时,由于Socket是IO阻塞的,因此会有一定的读写延时,默认也是0,即无超时

我们可以手动的来定义这两个超时:

=>先说说连接超时
Socket socket = new Socket();
SocketAddress endpoint =  new InetSocketAddress(ip, port);
socket.connect(endpoint, 30000);
=>这样就能保证连接如果超过30秒还没有建立,就会抛出超时异常

=>读写超时,就简单多了
socket.setSOTimeout(10000);
=>这样就能保证如果socket的读写超过10秒钟还没有成功,就会抛出异常

windows下与linux下的换行符

windows下和linux下的换行符是不一样的。windows下是\r\n,而linux下是\n。因此在做读文件的时候,如果记录一些偏移值,就会出现一定的错误。

因此可以在代码中进行系统的判断:

Properties prop = System.getProperties();
String os = prop.getProperty("os.name");
if(os.toLowerCase().indexOf("windows")!=-1){
    delimiter = "\r\n";
}else{
    delimiter = "\n";
}

logback实现日志轮转

首先如果想要使用Logback,必不可少的3个包:

  • logback-classic-xxx.jar
  • logback-core-xxx.jar
  • slf4j-api-xxx.jar

然后就可以使用了

public class MyLogger {
    static Logger logger = LoggerFactory.getLogger(MyLogger.class);
    public static void main(String[] args){
        logger.info((count++) + " : info info info 你好");
    }
}

在Logback中有一个概念十分重要,就是appender。Appender定义了日志的处理方式,比如是在控制台打印,还是记录到文件,或者采用高级的轮转模式等等。在src目录下创建logback.xml配置Logback的使用。

如果你只是输出到控制台,那么可以这样配置

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <Encoding>UTF-8</Encoding>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

如果只是定向的输出到某个文件,则可以这样配置:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>D:\fileMonitor\log\logs\error.log</file>
    <encoder>
        <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
        </pattern>
    </encoder>
</appender>

另一种常用的模式,就是按照日期轮转。比如,今天的日志是Log.04-07.log,昨天的日志则是Log.04-06.log。那么可以按照下面的配置方式执行:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--<file>D:\fileMonitor\log\logs\error.log</file>-->
    <Encoding>UTF-8</Encoding>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>D:\log.%d{MM-dd}.log
        </FileNamePattern>
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </layout>
</appender>

最新的日志总是记录到file指定的文件中,如果没有file属性,则会按照fileNamePattern定义的模式创建。一般来说,都不会使用这个file属性。

就暂且记录这些吧~~

本文转自博客园xingoo的博客,原文链接:Java程序员的日常——经验贴(纯干货)二,如需转载请自行联系原博主。

时间: 2024-10-18 07:44:38

Java程序员的日常——经验贴(纯干货)二的相关文章

Java程序员的日常——经验贴(纯干货)

工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 关于文件的解压和压缩 如果你的系统不支持tar -z命令 如果是古老的Unix系统,可能并不认识tar -z命令,因此如果你想要压缩或者解压tar.gz的文件,就需要使用gzip或者gunzip以及tar命令了. 关于tar.gz可以这么理解,tar结尾的压缩包,其实只负责把文件打包,并没有进行压缩:而gz结尾的包,则是进行压缩操作. 因此,tar.gz的文件可以理解为,先进行打包,再进行压缩. 那么

Java程序员的日常—— POI与JDBC、Mockmvc与单元测试

周日没怎么休息好,周一一天都迷迷糊糊的,不过还算是干了不少的活. 总结一下,大致有以下几点内容: 1 使用poi以及mysql jdbc实现了一个复杂excel的导入 2 基于工程原有的代码,书写spring mvc的业务代码以及测试用例 使用POI以及jdbc POI是用于处理excel文件很常用的工具,如果你的excel是比较老的版本,记xls结尾的,那么只使用poi就行了.如果是xlsx结尾的,还需要引入xssf的jar包. 参考maven的pom.xml配置: <!-- https://

Java程序员的日常—— Spring Boot单元测试

关于Spring boot 之前没有用Spring的时候是用的MockMvc,做接口层的测试,原理上就是加载applicationContext.xml文件,然后模拟启动各种mybatis\连接池等等. 后来web工程改造成了Spring boot,首先发生变化的就是配置文件,原来的xml改成了proerties或者yml.另外,原来的http接口改成了dubbo,接口层的测试就更困难了. 所以单元测试改成了直接对service层的测试,即按照原来的模式,模拟启动applicationConte

Java程序员的日常——存储过程知识普及

存储过程是保存可以接受或返回用户提供参数的SQL语句集合.在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装.可以在数据库中定义子程序,然后把子程序存储在数据库服务器,之后通过名称调用. 特点 1 提高性能 存储过程是预先编译过,进行优化后,存储在SQL的内存中,使用的时候不需要重新编译,提高工作效率. 2 减少网络流量 存储过程的代码直接存储在数据库中,用户通过名称进行调用,减小网络流量,加快执行速度.如:百万以上的数据查询,存储过程分页要比其他方式的分页快得多

Java程序员的日常—— FileUtils工具类的使用

package cn.xingoo.learn.commons; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.io.filefilter.FileFileFilter; import org.apache.commons.io.filefilter.FileFilterUtils; imp

Java程序员的日常—— Arrays工具类的使用

这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排序算法,这个还是非常有用的. 所有的方法都是在下面的类中进行测试的: public class ArraysTest { String[] array = new String[]{"a","c","2","1","b&

Java程序员的日常 —— 多进程开发

最近再弄进程管理相关的工作,因此必要的就涉及到各种系统下关于进程的管理. 这里简单的介绍下: 如何在Java中执行命令 在windows下肯定是dos命令了,而在linux则为shell命令.执行的方式差不多相同: 方法1:Runtime windows版本: Process process = Runtime.getRuntime().exec("ipconfig /all"); Linux版本: Process process = Runtime.getRuntime().exec

Java程序员的日常——SpringMVC+Mybatis开发流程、推荐系统

今天大部分时间都在写业务代码,然后算是从无到有的配置了下spring与mybatis的集成. SpringMVC+Mybatis Web开发流程 配置数据源 在applicationContext.xml中引入数据源的配置: <context:component-scan base-package="com.test" ></context:component-scan> <context:property-placeholder location=&qu

Java程序员的日常—— 基于类的策略模式、List&lt;?&gt;与List、泛型编译警告、同比和环比

早晨起得太早,昨晚睡得太晚,一天都迷迷糊糊的.中午虽然睡了半个小时,可是依然没有缓过来.整个下午都在混沌中....不过今天下载了一款手游--<剑侠情缘>,感觉不错,喜欢这种类型的游戏. 今天主要的工作还是做业务需求,不过下午状态不好,看了下<Effective java>,正好重构了下代码. effective java 通过函数来作为策略 通过函数作为策略有两个要注意的地方: 使用接口作为策略传入 如果长期调用,应该设置为静态内部类,避免频繁创建过多的匿名对象 下面举个简单的例子