解決DataOutputStream亂碼的問題
DataOutputStream亂碼的問題
這個(gè)坑我就先踩為敬了,重要的話說三遍!
千萬不要用DataOutputStream的 writeBytes 方法
千萬不要用DataOutputStream的 writeBytes 方法
千萬不要用DataOutputStream的 writeBytes 方法
我們使用 DataOutputStream 的時(shí)候,比如想寫入String ,你就會(huì)看到三個(gè)方法
public final void writeBytes(String s) public final void writeChars(String s) public final void writeUTF(String str)
OK,那你試著去寫入相同的內(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());
是的,你沒看錯(cuò),writeBytes方法寫入的內(nè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類型被強(qiáng)轉(zhuǎn)為 byte類型了,失精度了呀,怪不得回不來了,所以使用的時(shí)候千萬別貪方便,老老實(shí)實(shí)換成 dos.write("你好".getBytes()); 都好的呀
DataOutputStream寫入txt文件數(shù)據(jù)亂碼
這是正常的,如果要讀,要用DataInputStream讀出,如果僅要保成文本文件直接要FileOutputStream或PrintWriter
OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(file), "utf-8"); oStreamWriter.append(str); oStreamWriter.close();
主要是編碼方式不一樣
要用字符流 而非字節(jié)流
BufferedReader類從字符輸入流中讀取文本并緩沖字符,以便有效地讀取字符,數(shù)組和行
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA打開項(xiàng)目所有東西都在報(bào)紅報(bào)錯(cuò)的解決方案
這篇文章主要給大家介紹了關(guān)于IDEA打開項(xiàng)目所有東西都在報(bào)紅報(bào)錯(cuò)的三個(gè)解決方案,文中通過圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用idea具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06
使用CORS實(shí)現(xiàn)JavaWeb跨域請(qǐng)求問題的方法
這篇文章主要介紹了使用Cors實(shí)現(xiàn)JavaWeb跨域請(qǐng)求問題的方法,非常不錯(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中用于處理文件上傳的類,MultipartFile用于處理上傳的文件,File用于處理本地磁盤上的文件,需要的朋友可以參考下2023-09-09
Java的方法和this關(guān)鍵字如何理解與應(yīng)用
Java語言中的“方法”(Method)在其他語言當(dā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)常用到的,文中通過示例代碼介紹的非常詳細(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通過切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過程
這篇文章主要介紹了Spring boot通過切面,實(shí)現(xiàn)超靈活的注解式數(shù)據(jù)校驗(yàn)過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringSecurity+jwt+redis基于數(shù)據(jù)庫登錄認(rèn)證的實(shí)現(xiàn)
本文主要介紹了SpringSecurity+jwt+redis基于數(shù)據(jù)庫登錄認(rèn)證的實(shí)現(xiàn),其中也涉及到自定義的過濾器和處理器,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09

