• 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下是 ,而linux下是 。因此在做读文件的时候,如果记录一些偏移值,就会出现一定的错误。

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

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

    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:fileMonitorloglogserror.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:fileMonitorloglogserror.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属性。

    就暂且记录这些吧~~

  • 相关阅读:
    Android LBS系列06 位置策略(二)模拟位置数据的方法
    Android LBS系列03 Geocoder类与地址显示
    Java 容器集合框架概览
    Android 按钮类控件大集锦:Button ToggleButton CheckBox RadioButton
    Java中的包与导入
    《Head First设计模式》 读书笔记01 策略模式
    Android Fragment和Activity
    Java中的final
    《Head First设计模式》 读书笔记07 封装调用:命令模式
    Google Maps Android API V2的使用及问题解决
  • 原文地址:https://www.cnblogs.com/xing901022/p/5364798.html
Copyright © 2020-2023  润新知