1.结论
Java中String内置的public String(byte[] bytes)和public byte[] getBytes()对于不合法的utf-8字节流在解析时会增删字节。
2.为什么会出现这样的bug?
(1)首先准备这样的一段文本aaa.txt
China WangLei WangTao 3,USA jordan alex 1,Australia kobe james 2,UK Dale Tracy 4
(2)Team.java
package com.test.demo;
public class Team
{
public int teamRanking;//球队排名
public Team()
{
}
public Team(int teamRanking)
{
this.teamRanking = teamRanking;
}
public int getTeamRanking()
{
return teamRanking;
}
public void setTeamRanking(int teamRanking)
{
this.teamRanking = teamRanking;
}
}
(3)TeamMain.java
package com.test.demo;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
public class TestMain
{
public int inDataTeamArraylist(String fileName) throws IOException
{
FileInputStream fisRead = new FileInputStream(fileName);
byte[] byteRead = new byte[1000];
fisRead.read(byteRead);
fisRead.close();
String stringRead = new String(byteRead);
String[] stringArray = stringRead.split(",");//这里获取到的是4个String字符串
for (int i = 0; i < stringArray.length; i++)
{
System.out.println(Integer.parseInt(stringArray[i].split(" ")[3]));
}
return 0;
}
public static void main(String[] args) throws IOException
{
String file = "D://idea//storehouse//Item//untitledTest//src//com//test//demo//aaa.txt";
TestMain testMain = new TestMain();
System.out.println(testMain.inDataTeamArraylist(file));
}
}
(4)运行结果,报错的原因就是,byte[]与String互转不一致引起的bug
(5)改正后的TestMain.java
package com.test.demo;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
public class TestMain
{
public String inDataTeamArraylist(String fileName) throws IOException
{
FileInputStream fisRead = new FileInputStream(fileName);
StringBuilder stringBuilder = new StringBuilder(100);
int ch;
while ((ch = fisRead.read()) != -1)
{
stringBuilder.append((char)ch);
}
fisRead.close();
String[] stringArray = stringBuilder.toString().split(",");//这里获取到的是4个String字符串
for (int i = 0; i < stringArray.length; i++)
{
System.out.println(Integer.parseInt(stringArray[i].split(" ")[3]));
}
return "成功了呀!!!";
}
public static void main(String[] args) throws IOException
{
String file = "D://idea//storehouse//Item//untitledTest//src//com//test//demo//aaa.txt";
TestMain testMain = new TestMain();
System.out.println(testMain.inDataTeamArraylist(file));
}
}
(6)修改后的运行结果
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/287816.html