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属性。

就暂且记录这些吧~~

posted @ 2016-04-07 18:23  xingoo  阅读(1382)  评论(0编辑  收藏  举报