实习期间Java知识点整理(getBytes()、换行符、System.out.println和Logger、

本文详细介绍了Java中String的getBytes()方法的使用,包括如何在不同编码间转换,以及编码与解码过程中的注意事项。同时,对比了System.out.print与Log在日志记录上的优缺点,强调了Log在异步、解耦和策略上的优势。

getBytes()

在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这表示在不同的操作系统下,返回的东西不一样!
1、 str.getBytes(); 如果括号中不写charset,则采用的是Sytem.getProperty("file.encoding"),即当前文件的编码方式,

2、 str.getBytes("charset");//指定charset,即将底层存储的Unicode码解析为charset编码格式的字节数组方式

3、String str=new String(str.getBytes("utf-8"),"gbk")); //
将已经解析出来的字节数据转化为gbk编码格式的字符串,在内存中即为gbk格式的字节数组转为Unicode去交互传递 。

package carl.com;

import java.io.UnsupportedEncodingException;

public class GetBytesDemo {
	
	public static void main(String[] args) throws UnsupportedEncodingException {
		**/**
		 * getBytes(String charsetName): 使用指定的字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
		 * getBytes(): 使用平台的默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
		 * 
		 * new string(byte[],charset):使用指定的字符集将byte序列解码成字符串
		 */**
		
		//定义一个中文字符串;
		String s1 = "我爱我家";
		System.out.println(s1);//输出  我爱我家
		
		String s2 = new String(s1.getBytes("UTF-8"),"UTF-8");//先编码,再解码,都是用的UTF-8,所以输出正确
		System.out.println(s2);//输出  我爱我家
		
		String s3 = new String(s1.getBytes("GBK"),"GBK");
		System.out.println(s3);//输出  我爱我家
		
		String s4 = new String(s1.getBytes("GBK"),"UTF-8");
		System.out.println(s4);//输出  ??????
		
		String s5 = new String(s1.getBytes("UTF-8"),"GBK");
		System.out.println(s5);//输出  鎴戠埍鎴戝
		
		String s6 = new String(s1.getBytes(),"GBK");
		System.out.println(s6);//输出  我爱我家
		
		
	}
}

原文:https://blog.youkuaiyun.com/Carl_changxin/article/details/86597585
https://blog.youkuaiyun.com/changlei_shennan/article/details/68059904

换行符

java中实现换行有以下3种方法:

1.使用java中的转义符"\r\n":

String str="aaa";  

str+="\r\n";  

这样在str后面就有换行了.
注意:\r,\n的顺序是不能够对换的,否则不能实现换行的效果.
\r: return 到当前行的最左边。
\n: newline 向下移动一行,并不移动左右。

System.out.println() 和 Logger

在这里插入图片描述
在这里插入图片描述
第一行数据是使用system输出的,第二行数据是通过logger输出的,从上面可以看到,system输出的日志仅仅是输出对象本身,而通过logger输出的日志,不光会输出对象本身,还会输出代码运行的时间,是哪一个class文件输出的日志,在哪一行输出的,很方便。

想要使用logger输出日志,首先需要引入包:log4j-1.2.16.jar

然后在class文件中配置:就可以使用logger来输出日志了。

private static Logger logger = Logger.getLogger(OrderDetailsQueryContactHandler.class);

原文链接:https://blog.youkuaiyun.com/gongjds/article/details/79458384

System.out.print与Log比较

System.out.print的优点:直观、方便。

Log的优点:异步、解耦、灵活、策略多。

提到System.out.print,除了感觉到方便之外,还会想到其他的优点吗?似乎也就这个优点,syso快捷键瞬间就是一条打印语句,很顺手的一件事,除了这个感觉外,似乎也没有其他特别的感受了。

System.out.print和java运行程序运行在同一线程,也就是说,业务程序会等待System.out的动作,导致资源被占用,log4j、logback等日志工具进行调试信息的打印,这类工具是异步线程的,不会使程序处于等待状态。

System.out.print是在控制台输出,只能输出到控制台,功能上线后,总不能一直盯着控制台吧,而且日志文件需要保留,以供日后分析,是需要一套管理规范的,即便使用tomcat服务器,System.out会输出到catalina.out文件,catalina.out文件也不会一直存在,需要定期清空,如果不清空,大文件的读写也是挺影响性能的。说到这里,System.out.print写入的文件只有一个,对于一个文件的读写,这个io肯定会排队写,且System.out.print在当前线程,肯定对性能会有稍微的影响。

程序中充斥着大量的System.out.print打印代码是相当不规范的。
https://www.cnblogs.com/xiaobaizhiqian/p/7956690.html

不可以直接使用 `System.out.println(bytes)` 来打印 `byte[]` 数组,**因为 Java 的 `println(byte[])` 方法并不会输出你期望的数组内容**,而是输出该数组对象的**内存地址**或哈希码(即 `getClass().getName() + "@" + Integer.toHexString(hashCode())`)。 --- ### ❗ 举例说明: ```java byte[] bytes = "Hello".getBytes(); System.out.println(bytes); ``` #### 输出结果可能是: ``` [B@4eec7777 ``` 这串 `[B@4eec7777` 的含义是: - `[B` 表示这是一个 `byte[]` 类型; - `@4eec7777` 是该对象的哈希码(内存地址的近似表示)。 显然,这不是你想要的“打印数组内容”。 --- ### ✅ 正确打印方式(推荐方法): 你可以使用以下方式打印 `byte[]` 的内容: --- ### ✅ 方法一:使用 `Arrays.toString(bytes)` ```java import java.util.Arrays; byte[] bytes = "Hello".getBytes(); System.out.println(Arrays.toString(bytes)); ``` #### 输出示例: ``` [72, 101, 108, 108, 111] ``` 这是每个字符的 ASCII 值,适合调试。 --- ### ✅ 方法二:打印为十六进制(Hex) ```java public static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02X ", b)); } return sb.toString().trim(); } System.out.println("Hex: " + bytesToHex(bytes)); ``` #### 输出示例: ``` Hex: 48 65 6C 6C 6F ``` --- ### ✅ 方法三:打印为字符串(ASCII) ```java System.out.println("ASCII: " + new String(bytes)); ``` #### 输出示例: ``` ASCII: Hello ``` > ⚠️ 注意:仅适用于文本数据(如 UTF-8 编码),如果是二进制数据,可能会输出乱码。 --- ### ✅ 方法四:打印为 Base64 ```java import java.util.Base64; System.out.println("Base64: " + Base64.getEncoder().encodeToString(bytes)); ``` #### 输出示例: ``` Base64: SGVsbG8= ``` --- ### ✅ 总结: | 打印方式 | 是否推荐 | 说明 | |----------|-----------|------| | `System.out.println(bytes)` | ❌ | 输出对象地址,不是内容 | | `Arrays.toString(bytes)` | ✅ | 输出十进制字节值,适合调试 | | 十六进制(Hex) | ✅ | 常用于协议调试、日志记录 | | ASCII 字符串 | ✅ | 适用于文本数据 | | Base64 | ✅ | 适用于二进制数据传输、日志记录 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值