我有一个1000行的文本文件,格式如下:
19 x 75 Bullnose Architrave/Skirting £1.02
我正在编写一个逐行读取文件的方法 - 这个工作正常。
然后我想用“£”分隔每个字符串作为分隔符&把它写出来
以下格式的ArrayList<String>
:
19 x 75 Bullnose Architrave/Skirting, Metre, 1.02
这就是我接近它的方式(productList
是ArrayList
,在try块之外声明/实例化了:
try{
br = new BufferedReader(new FileReader(aFile));
String inputLine = br.readLine();
String delim = "£";
while (inputLine != null){
String[]halved = inputLine.split(delim, 2);
String lineOut = halved[0] + ", Metre, " + halved[1];//Array out of bounds
productList.add(lineOut);
inputLine = br.readLine();
}
}
String没有拆分,我不断收到ArrayIndexOutOfBoundsException
。我对正则表达式不太熟悉。我也尝试使用旧的StringTokenizer
,但得到的结果相同。
£
是否存在问题,或者是其他问题?我确实想知道这是否与第二个令牌没有被读作String
?
任何想法都会有所帮助。
答案 0 :(得分:6)
以下是一些可能的原因:
文件的编码与您用来读取它的编码不匹配,文件中的“磅”字符会被“损坏”成其他内容。
该文件和您的源代码使用不同的磅字符。例如,Unicode有两个看起来像“英镑符号”的代码点 - 英镑字符(00A3)和里拉字符(2084)......然后是罗马semuncia字符(10192)。
< / LI>您正在尝试编译UTF-8编码的源文件,而不告诉编译器它是UTF-8编码的。
从您的评论来看,这是编码不匹配问题;即,Java使用的“默认”编码与文件的实际编码不匹配。有两种方法可以解决这个问题:
更改文件的编码以匹配Java的默认编码。你似乎已经尝试过但失败了。 (这不是我这样做的方式......)
更改程序以使用特定(非默认)编码打开文件;例如变化
new FileReader(aFile)
到
new FileReader(aFile, encoding)
其中encoding
是文件实际字符编码的名称。 Java所理解的编码名称列于here,但我的猜测是它是“ISO-8859-1”(又名Latin-1)。
答案 1 :(得分:0)
这可能是编码不匹配的情况。要检查这一点,
delim.length
并确保其为1
。inputLine.length
并确保其值正确(42
)。如果其中一个不是预期值,那么你必须确保在任何地方使用UTF-8。
你说delim.length
是1,所以这很好。另一方面,如果inputLine.length
为34,则非常错误。对于"19 x 75 Bullnose Architrave/Skirting £1.02"
,如果一切都符合预期,那么你应该得到42。如果您的文件是UTF-8编码但读作ISO-8859-1或类似文件,您将得到43。
现在我有点不知所措。要调试它,你可以单独打印字符串的每个字符,并检查它们有什么问题。
for (int i = 0; i < inputLine.length; i++)
System.err.println("debug: " + i + ": " + inputLine.charAt(i) + " (" + inputLine.codePointAt(i) + ")");
答案 2 :(得分:-1)
非常感谢您的所有回复。
指定读取和放大器内的编码。保存原始文本文件,因为UTF -8已经有效。
然而,经验告诉我,使用“£”或其他可能在不同编码中具有多种表示形式的字符来划分文本是一种糟糕的策略。
我决定采用不同的方法:
1)找到输入字符串中的最后一个空格&amp;将其替换为“xxx”或类似物。
2)使用分隔符“xxx”拆分它。哪个应该拆分字符串&amp;撕掉“£”。
3)继续......