使用Socket的读入数据后直接输出数据乱码
使用FileInputStream读取数据
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(".\\src\\static\\test.txt"));
//每次缓存3个字节,因为测试需要,通常写1024,这个看个人需求
byte[] buffer = new byte[3];
int len;
while ((len=fis.read(buffer))!=-1){
String temp = new String(buffer, 0, len);
System.out.print(temp);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
下面是test.txt文件
这是a测试1数据
输出结果
这是a����1������
乱码了,因为编码格式不同,java读入汉字所占字节也不同,当编码为UTF-8时汉字占3个字节,当缓存区为3时byte[] buffer = new byte[3];
,每次读入3个字节,也就是1个汉字,第一和第二个汉字都能正常读取,到第三个字符是字母(占一个字节),此时程序依旧读取3个字节,读入第三字符和第四个字符所占字节的前两位,"a"能正确读取,但是"测"只读取了前2个字节,所以就乱码了,后面的所有的中文都以此类推都乱码了,所以直接输出缓存区的数据是不可取的,此时我们就需要将每次缓存的数据拼接起来,最后再输出,而不是每次直接输出缓存的数据
修改代码
FileInputStream fis = null;
ByteArrayOutputStream baos = null;
try {
fis = new FileInputStream(new File(".\\src\\static\\test.txt"));
byte[] buffer = new byte[3];
int len;
baos = new ByteArrayOutputStream();
while ((len=fis.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (baos!=null){
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用ByteArrayOutputStream每次将buffer数据写到ByteArrayOutputStream的内存缓冲区中,最后toString打印查看结果
这是a测试1数据