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
}
}
java字符串写入文件后再读出不一样?
答案:3 悬赏:30
解决时间 2021-11-15 22:23
- 提问者网友:逝爱
- 2021-11-14 23:02
最佳答案
- 二级知识专家网友:统治我的世界
- 2021-11-14 23:28
我在你的另外一个同样的问题里面已经回答你了,再次复制代码给你
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
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
全部回答
- 1楼网友:湫止没有不同
- 2021-11-15 01:11
类型转换的问题。
- 2楼网友:ー何必说爱
- 2021-11-15 00:22
这个不是类型转换的问题,而是文件编码转换的问题。对于中文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的方法看看两者的不同。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯