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

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

就暂且记录这些吧~~

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

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

    工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 关于文件的解压和压缩 如果你的系统不支持tar -z命令 如果是古老的Unix系统,可能并不认识tar ...

  2. Java程序员的日常—— 《编程思想》关于类的使用常识

    Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于 ...

  3. Java程序员的日常—— Properties文件的读写

    在日常的Java程序开发中,Properties文件的读写是很常用的.经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整. 那么本片就来简单的介绍下,如何使用Prop ...

  4. Java程序员的日常—— 垃圾回收中引用类型的作用

    在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...

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

    最近再弄进程管理相关的工作,因此必要的就涉及到各种系统下关于进程的管理. 这里简单的介绍下: 如何在Java中执行命令 在windows下肯定是dos命令了,而在linux则为shell命令.执行的方 ...

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

    存储过程是保存可以接受或返回用户提供参数的SQL语句集合.在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装.可以在数据库中定义子程序,然后把子程序存储在数据库服务器, ...

  7. Java程序员的日常 —— 《编程思想》持有对象

    集合框架可以说是Java里面必备的知识点了,日常的使用中也会遇到各种情况需要使用到集合.下面就简单介绍下各种集合的使用场景: List List可以看做是数组,实现的方式有两种: ArrayList ...

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

    这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...

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

    package cn.xingoo.learn.commons; import org.apache.commons.io.FileUtils; import org.apache.commons.i ...

随机推荐

  1. DIOCP之EchoServer分析

    constructor TfrmMain.Create(AOwner: TComponent);begin inherited Create(AOwner); sfLogger.setAppender ...

  2. A 浪哥的烦恼 完全背包dp

    https://biancheng.love/contest-ng/index.html#/131/problems 首先,去到n点的最小时间是所有数加起来. 然后,如果我1 --- 2,然后再2-- ...

  3. LeetCode OJ 274. H-Index

    Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...

  4. Selenium2+python自动化15-select下拉框

    前言 最近由于工作原因,更新慢了一点,今天终于抽出一点时间给大家继续更新selenium系列,学习的脚本不能停止,希望小伙伴能多多支持. 本篇以百度设置下拉选项框为案例,详细介绍select下拉框相关 ...

  5. HTTP 初步知识总结

    1.HTPP报文 HTTP协议以报文的格式传递数据,报文有三部分组成:起始行(对报文进行描述),首部块(包含属性),主体(包含数据,可选)所有的HTTP报文都可以分为两类:请求报文(Requset M ...

  6. ObjC.class-cluster

    class cluster In a class cluster, only an abstract superclass is public. Allocating an instance actu ...

  7. sublime text3 编译less

    1,  下载 插件   链接:http://pan.baidu.com/s/1bNbFJK 密码:m3zt 2,解压后把lessc文件夹放到sublime text3 的\Data\Packages ...

  8. python学习之路-day2-pyth基础2

    一.        模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...

  9. Java实现批量下载《神秘的程序员》漫画

    上周看了西乔的博客“西乔的九卦”.<神秘的程序员们>系列漫画感觉很喜欢,很搞笑.这些漫画经常出现在CSDN“程序员”杂志末页的,以前也看过一些. 后来就想下载下来,但是一张一张的点击右键“ ...

  10. Html/Css(新手入门第一篇)

    一.理解web标准含义--为什么采用web标准*****将内容与样式分离1.web标准是一系列标准,就是一系列技术标准在使用时,是组合应用[1].结构化内容 html[2].表现化内容 css[3]. ...