java.io 写入之后,打开txt 数字乱码成acsii码

package Demo4;

import java.io.*;
class Teacher{
String name;
int age;
public Teacher(){}
public Teacher(String name,int age){
this.name=name;
this.age=age;
}
public void WriteData(){
DataOutputStream dos=null;
try{
dos=new DataOutputStream(new FileOutputStream("d:\\demo\\data.txt",true));
}
catch(FileNotFoundException e){
System.out.println("文件没有找到!");
}
try{
if(dos!=null){
dos.writeUTF(name);
dos.writeInt(age);
}
}catch(IOException e){
System.out.println("写数据错误!");
}finally{
if(dos!=null)
try{
dos.close();
}catch(IOException e){
System.out.println("文件操作错误");
}
}

}
public void readData(){
DataInputStream dis=null;
try{
dis = new DataInputStream(new FileInputStream("d:\\demo\\data.txt"));
}catch(FileNotFoundException e){
System.out.println("文件没有找到!");
}
try{
while(true){
name=dis.readUTF();
age=dis.readInt();
showData();
}
}
catch(EOFException e){}
catch(IOException e){
System.out.println("文件操作错误");
}
finally{
if(dis!=null)
try{
dis.close();
}catch(IOException e){
System.out.println("文件操作错误!");
}
}
}
public void showData(){
System.out.println(name+","+age);
}
}
public class Demo4 {
public static void main(String []args){
Teacher t = new Teacher("李老师",35);
t.WriteData();
t=new Teacher("张老师",40);
t.WriteData();
t.readData();
}
}

这是正常的,writeInt写数据底层使用的是位操作你可以把它当做字节读写方式,而acsii是字符读写的方式。所以你看data.txt会有乱码。就比如35 acsii看作是字符‘3’和字符‘5’,而使用writeInt就是各种移位操作最后是一个32位二进制int.望采纳追问

拿我要是要他显示35呢 而不是#

追答

你要是用writeInt写的话用文本打开怎么都是乱码,但是没关系啊,使用对应的readInt可以正确的读出来就行,不必纠结底层的数据格式。你要是真的想看到35的话,那就只能把age也设计成String和name一样使用writeUTF。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-09-29
我有
相似回答