中易网

java字符串写入文件后再读出不一样?

答案:3  悬赏:30  
解决时间 2021-11-15 22:23
import java.io.*;
public class TestString {
public static void main(String[] args) throws Exception {

String str = "1";
String password = "x";

char s[] = str.toCharArray();
char p[] = password.toCharArray();
int n = s.length;
int m = p.length;

for (int k=0; k<n; ++k) {
int temp = s[k] + p[k%m];
s[k] = (char)temp;
}
System.out.println("1 : " + (int)s[0] + " " + s[0]); // 输出: 1 : 169 ?
str = new String(s);

File file = new File("Test.txt");
FileWriter fw = new FileWriter(file);
fw.write(str);
fw.flush();
fw.close();

FileReader fr = new FileReader(file);
String sss = "";
int b;
while ((b=fr.read()) != -1) {
System.out.println("2 : " + b + " " + (char)b); // 输出: 2 : 63 ?
sss = sss + (char)b;
}

System.out.println("str : " + str); // 输出: str : ?
System.out.println("sss : " + sss); // 输出: sss : ?
System.out.println(str.equals(sss)); // 输出: false
}
}
最佳答案
我在你的另外一个同样的问题里面已经回答你了,再次复制代码给你

import java.io.*;

// 看了下,该程序想实现用密码password对数据data进行加密,变量名字取得比较乱,所以修改了部分变量名字
public class TestString {
// 定义的shuju数据 和 password密码,可以放到前面
static String data = "6869";
static String password = "xzfd";

public static void main(String[] args) throws Exception {

char s[] = data.toCharArray();
char p[] = password.toCharArray();
int n = s.length;
int m = p.length;
StringBuilder ecodeDataTemp = new StringBuilder();// 建议重新定义一个变量用于存储加密后的字符
// 你的代码str = new String(s); 又把最开始的str变量给覆盖掉了..
for (int k = 0; k < n; k++) {
int temp = s[k] + p[k % m];// 加密的过程
s[k] = (char) temp;
// 把每一个加密后的字符都变成一个uncoide编码进行存储,比如\\ua9,
// 这样的好处,就算是该字符没有可以显示出来的字符,也可以存进去.比如很多的char的值可显示的字符,那么也不怕.
// 你的代码强行把字符存进去,那么如果该字符不存在等情况,可能就会显示出 ?
ecodeDataTemp.append("\\u" + Integer.toHexString(temp));
}

String ecodeData = new String(ecodeDataTemp);
//System.out.println("输出加密的数据到文件:" + ecodeData);

File file = new File("Tesat.txt");
FileWriter fw = new FileWriter(file);
fw.write(ecodeData);
fw.flush();
fw.close();

FileReader fr = new FileReader(file);
String readData = "";
int b;
while ((b = fr.read()) != -1) {
readData = readData + (char) b;
}
fr.close();
//System.out.println("从文件里读取到的数据:"+readData);


StringBuilder decodeDataTemp  = new StringBuilder();
String[] hex = readData.split("\\\\u");// 切割字符成单独的unicode字符
for (int i = 1; i < hex.length; i++) {
int temp = Integer.parseInt(hex[i], 16);
decodeDataTemp.append(((char) temp));
}
char[] es = decodeDataTemp.toString().toCharArray();
for (int k = 0; k < es.length; k++) {
int temp = es[k] - p[k % m];
es[k] = (char) temp;
}
String decodeData = new String(es);
System.out.println("加密前的数据data : " + data);
System.out.println("加密后的数据data : " + ecodeData);
System.out.println("如果强制解密data : "+decodeDataTemp);
System.out.println("解密后的数据data : " + decodeData); 
}
}数据输出如下

加密前的数据data : 6869
加密后的数据data : \uae\ub2\u9c\u9d
如果强制解密data : ????
解密后的数据data : 6869
全部回答
类型转换的问题。
这个不是类型转换的问题,而是文件编码转换的问题。对于中文Windows系统,Java默认的文件编码是GB2313。 为什么这么说呢,我们先看下面这一段代码 System.out.println("1 : " + (int)s[0] + "  " +  s[0]);  // 输出:  1  :  169   ?输出的是169,这不是一个有效的GB2313字符。所以写到文件里之前,它会自动转化为?。 所以从文件再读出来的字符应该是实际的?号符号。 再来看最后的输出部分:      System.out.println("str : " + str);  // 输出: str : ?      System.out.println("sss : " + sss); // 输出: sss : ?      System.out.println(str.equals(sss)); // 输出: false看起来输出的str和sss是一样的。其实str里的字符是169,而sss是63。169不是一个有效字符,所以输出?。你可以Debug的方法看看两者的不同。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
什么是纹绣美容?
二层汇聚交换机的优势有哪些?
内裤有几种材质的?
奎屯市公安局交通警察大队车辆管理所地址在哪
无锡怎么查住房公积金
“绿色食品”与“绿色装修”中“绿色”的意思
广义来讲什么人需要看产前诊断科?
永康市红阳不锈钢门的质量好不好谁知道?
凌旭特产商场怎么去啊,有事要去办理
据说摆地摊是年轻人创业的第一步,那第二步呢
电子电铃多少钱能买到?
蒙德里安是什么派的画家
长江证券交易密码一天可以输错几次
如何解决别墅地下室防水防潮问题
奎屯市道路运输管理局地址在哪,我要去那里办
推荐资讯
仁同一視的意思是什么?仁同一視的释义是什么
石家庄哪里批发矿泉水?
我的身体瘦的很快
贵州省黔南州2013年事业单位招聘什么时候开始
三次函数的x轴,y轴截距怎么算
长阳半岛未来发展方向是什么?
不想干活,怎么办?
龙井说唱有什么歌好听,介绍几首。
内蒙古集宁到赤峰省级大通道有雪吗
曼珠沙华开花时间哪位朋友清楚?
上政化村委会地址在什么地方,想过去办事
手忙脚乱是什么意思啊?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?