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程序员的日常——经验贴(纯干货)二,如需转载请自行联系原博主。
相关文章
|
8月前
|
人工智能 Kubernetes Java
回归开源,两位 Java 和 Go 程序员分享的开源贡献指引
Higress是一个基于Istio和Envoy的云原生API网关,支持AI功能扩展。它通过Go/Rust/JS编写的Wasm插件提供可扩展架构,并包含Node和Java的console模块。Higress起源于阿里巴巴,解决了Tengine配置重载及gRPC/Dubbo负载均衡问题,现已成为阿里云API网关的基础。本文介绍Higress的基本架构、功能(如AI网关、API管理、Ingress流量网关等)、部署方式以及如何参与开源贡献。此外,还提供了有效的开源贡献指南和社区交流信息。
771 33
|
8月前
|
Java 程序员 应用服务中间件
【高薪程序员必看】万字长文拆解Java并发编程!(2 2-2)
📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!💡 独家亮点抢先看:✅ 图解JVM内存模型(JMM)三大特性,看完再也不怕指令重排序✅ 手撕ReentrantLock源码,AQS队列同步器实现原理大揭秘✅ 全网最细线程状态转换图(附6种状态转换触发条件表)
140 0
|
8月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
255 0
|
8月前
|
网络协议 Java 大数据
【高薪程序员必看】万字长文拆解Java并发编程!(1)
📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!💡 独家亮点抢先看:✅ 图解JVM内存模型(JMM)三大特性,看完再也不怕指令重排序✅ 手撕ReentrantLock源码,AQS队列同步器实现原理大揭秘✅ 全网最细线程状态转换图(附6种状态转换触发条件表)
137 0
|
8月前
|
安全 Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(2 2-1)
🔥【高薪程序员必看】万字长文拆解Java并发编程!面试官看了直呼内行,90%人不知道的线程安全骚操作!💻🚀《16个高频面试灵魂拷问+底层源码暴击》🔥👉戳这里看如何用1个月经验吊打3年程序员!📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!
132 0
|
8月前
|
缓存 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析
活锁:多个线程相互影响对方退出同步代码块的条件而导致线程一直运行的情况。例如,线程1的退出条件是count=5,而线程2和线程3在其代码块中不断地是count进行自增自减的操作,导致线程1永远运行。内存一致性问题:由于JIT即时编译器对缓存的优化和指令重排等造成的内存可见性和有序性问题,可以通过synchronized,volatile,并发集合类等机制来解决。这里的线程安全是指,多个线程调用它们同一个实例的方法时,是线程安全的,但仅仅能保证当前调用的方法是线程安全的,不同方法之间是线程不安全的。
149 0
|
8月前
|
Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(3-2):并发共享问题的解决与分析
wait方法和notify方法都是Object类的方法:让当前获取锁的线程进入waiting状态,并进入waitlist队列:让当前获取锁的线程进入waiting状态,并进入waitlist队列,等待n秒后自动唤醒:在waitlist队列中挑一个线程唤醒:唤醒所有在waitlist队列中的线程它们都是之间协作的手段,只有拥有对象锁的线程才能调用这些方法,否则会出现IllegalMonitorStateException异常park方法和unpark方法是LockSupport类中的方法。
159 0
|
8月前
|
存储 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(4-1):悲观锁底层原理与性能优化实战
目录4. JVM字节码文件4.1. 字节码文件-组成4.1.1. 组成-基础信息4.1.1.1. 基础信息-魔数4.1.1.2. 基础信息-主副版本号4.1.2. 组成-常量池4.1.3. 组成-方法4.1.3.1. 方法-工作流程4.1.4. 组成-字段4.1.5. 组成-属性4.2. 字节码文件-查看工具4.2.1. javap4.2.2. jclasslib4.2.3. 阿里Arthas
143 0
|
8月前
|
安全 Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(6-2):从CAS无锁机制到Atomic原子类实战指南
🌟 ​🌟今天给大家带来的是 ​💻⚡在这篇文章中,我们将一起探索:🔹 ​的底层原理,它是如何通过 ​实现无锁并发的?🔹 ​的终极对决,为什么高并发场景下CAS性能更优?🔹 ​的陷阱与解决方案——和实战演示!🔹 ​​(LongAdder等)的使用场景与性能对比🔹 危险的 ​黑魔法:为什么阿里禁止使用却又是并发库的基石?无论你是:✅ ​​(BATJ高频考点)✅ ​​(如何设计百万级计数器)✅ ​​(从Java代码到CPU指令的全链路分析)这篇文章都会让你收获满满!✨。
119 0
|
8月前
|
安全 Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(6-1):从CAS无锁机制到Atomic原子类实战指南
🌟 ​🌟今天给大家带来的是 ​💻⚡在这篇文章中,我们将一起探索:🔹 ​的底层原理,它是如何通过 ​实现无锁并发的?🔹 ​的终极对决,为什么高并发场景下CAS性能更优?🔹 ​的陷阱与解决方案——和实战演示!🔹 ​​(LongAdder等)的使用场景与性能对比🔹 危险的 ​黑魔法:为什么阿里禁止使用却又是并发库的基石?无论你是:✅ ​​(BATJ高频考点)✅ ​​(如何设计百万级计数器)✅ ​​(从Java代码到CPU指令的全链路分析)这篇文章都会让你收获满满!✨。
120 0