DataOutputStream乱码的问题
这个坑我就先踩为敬了,重要的话说三遍!
千万不要用DataOutputStream的 writeBytes 方法
千万不要用DataOutputStream的 writeBytes 方法
千万不要用DataOutputStream的 writeBytes 方法
我们使用 DataOutputStream 的时候,比如想写入String ,你就会看到三个方法
1
2
3
|
public final void writeBytes(String s) public final void writeChars(String s) public final void writeUTF(String str) |
OK,那你试着去写入相同的内容后,再去读取一下试试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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()); |
是的,你没看错,writeBytes方法写入的内容读出来,为啥乱码了?
点进去看看实现
1
2
3
4
5
6
7
|
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类型被强转为 byte类型了,失精度了呀,怪不得回不来了,所以使用的时候千万别贪方便,老老实实换成 dos.write("你好".getBytes()); 都好的呀
DataOutputStream写入txt文件数据乱码
这是正常的,如果要读,要用DataInputStream读出,如果仅要保成文本文件直接要FileOutputStream或PrintWriter
1
2
3
|
OutputStreamWriter oStreamWriter = new OutputStreamWriter( new FileOutputStream(file), "utf-8" ); oStreamWriter.append(str); oStreamWriter.close(); |
主要是编码方式不一样
要用字符流 而非字节流
BufferedReader类从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_29914229/article/details/115471851