解決DataOutputStream亂碼的問(wèn)題
DataOutputStream亂碼的問(wèn)題
這個(gè)坑我就先踩為敬了,重要的話說(shuō)三遍!
千萬(wàn)不要用DataOutputStream的 writeBytes 方法
千萬(wàn)不要用DataOutputStream的 writeBytes 方法
千萬(wàn)不要用DataOutputStream的 writeBytes 方法
我們使用 DataOutputStream 的時(shí)候,比如想寫(xiě)入String ,你就會(huì)看到三個(gè)方法
public final void writeBytes(String s) public final void writeChars(String s) public final void writeUTF(String str)
OK,那你試著去寫(xiě)入相同的內(nèi)容后,再去讀取一下試試
File file = new File("d:"+File.separator+"test.txt");
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
dos.writeBytes("你好");
dos.writeChars("你好");
dos.writeUTF("你好");
dos.flush();
dos.close();
DataInputStream dis = new DataInputStream(new FileInputStream(file));
byte[] b = new byte[2];
dis.read(b);
// `}
System.out.println(new String(b, 0, 2));
char[] c = new char[2];
for (int i = 0; i < 2; i++) {
c[i] = dis.readChar();
}
//你好
System.out.println(new String(c, 0, 2));
//你好
System.out.println(dis.readUTF());
是的,你沒(méi)看錯(cuò),writeBytes方法寫(xiě)入的內(nèi)容讀出來(lái),為啥亂碼了?
點(diǎn)進(jìn)去看看實(shí)現(xiàn)
public final void writeBytes(String s) throws IOException {
int len = s.length();
for (int i = 0 ; i < len ; i++) {
out.write((byte)s.charAt(i));
}
incCount(len);
}
大哥,這char類(lèi)型被強(qiáng)轉(zhuǎn)為 byte類(lèi)型了,失精度了呀,怪不得回不來(lái)了,所以使用的時(shí)候千萬(wàn)別貪方便,老老實(shí)實(shí)換成 dos.write("你好".getBytes()); 都好的呀
DataOutputStream寫(xiě)入txt文件數(shù)據(jù)亂碼
這是正常的,如果要讀,要用DataInputStream讀出,如果僅要保成文本文件直接要FileOutputStream或PrintWriter
OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "utf-8"); oStreamWriter.append(str); oStreamWriter.close();
主要是編碼方式不一樣
要用字符流 而非字節(jié)流
BufferedReader類(lèi)從字符輸入流中讀取文本并緩沖字符,以便有效地讀取字符,數(shù)組和行
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA打開(kāi)項(xiàng)目所有東西都在報(bào)紅報(bào)錯(cuò)的解決方案
這篇文章主要給大家介紹了關(guān)于IDEA打開(kāi)項(xiàng)目所有東西都在報(bào)紅報(bào)錯(cuò)的三個(gè)解決方案,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用idea具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06
使用CORS實(shí)現(xiàn)JavaWeb跨域請(qǐng)求問(wèn)題的方法
這篇文章主要介紹了使用Cors實(shí)現(xiàn)JavaWeb跨域請(qǐng)求問(wèn)題的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
java中MultipartFile和File最簡(jiǎn)單的互相轉(zhuǎn)換示例
這篇文章主要給大家介紹了關(guān)于java中MultipartFile和File最簡(jiǎn)單的互相轉(zhuǎn)換的相關(guān)資料,MultipartFile和File都是Java中用于處理文件上傳的類(lèi),MultipartFile用于處理上傳的文件,File用于處理本地磁盤(pán)上的文件,需要的朋友可以參考下2023-09-09
Java的方法和this關(guān)鍵字如何理解與應(yīng)用
Java語(yǔ)言中的“方法”(Method)在其他語(yǔ)言當(dāng)中也可能被稱(chēng)為“函數(shù)”(Function)。對(duì)于一些復(fù)雜的代碼邏輯,如果希望重復(fù)使用這些代碼,并且做到“隨時(shí)任意使用”,那么就可以將這些代碼放在一個(gè)大括號(hào){}當(dāng)中,并且起一個(gè)名字。使用代碼的時(shí)候,直接找到名字調(diào)用即可2021-10-10
Java詳細(xì)講解堆排序與時(shí)間復(fù)雜度的概念
本文主要介紹了java實(shí)現(xiàn)堆排序以及時(shí)間復(fù)雜度,堆排序這種排序算法是我們經(jīng)常用到的,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
openFeign服務(wù)之間調(diào)用保持請(qǐng)求頭信息處理方式
這篇文章主要介紹了openFeign服務(wù)之間調(diào)用保持請(qǐng)求頭信息處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Spring boot通過(guò)切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過(guò)程
這篇文章主要介紹了Spring boot通過(guò)切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringSecurity+jwt+redis基于數(shù)據(jù)庫(kù)登錄認(rèn)證的實(shí)現(xiàn)
本文主要介紹了SpringSecurity+jwt+redis基于數(shù)據(jù)庫(kù)登錄認(rèn)證的實(shí)現(xiàn),其中也涉及到自定義的過(guò)濾器和處理器,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09

