我在拆分marc21格式文件的记录时遇到问题。我从一个文件中读取,并尝试将记录分成单独的行,然后写入到另一个文件中。这是我目前所拥有的:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
BufferedWriter bw = null;
try{
fr = new FileReader("data.txt");
br = new BufferedReader(fr);
fw = new FileWriter("SplitRecords.txt");
bw = new BufferedWriter(fw);
String data;
String recordLength = "";
int intLength = 0;
int lengthStart = 0;
int lengthEnd = 5;
while((data = br.readLine()) != null){
while(data != null){
recordLength = data.substring(lengthStart, lengthEnd);
System.out.println(recordLength);
intLength = Integer.parseInt(recordLength);
bw.write(data, lengthStart, intLength);
bw.write("\n");
bw.flush();
lengthStart = intLength;
lengthEnd = lengthStart + 5;
br.mark(intLength);
br.reset();
}
}
}
finally{
if(fr != null){
fr.close();
}
if(br != null){
br.close();
}
if(fw != null){
fw.close();
}
if(bw != null){
bw.close();
}
}
}
}这是我得到的输出和错误:
00934
00699
1cRT
Exception in thread "main" java.lang.NumberFormatException: For input string: "1cRT"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Main.main(Main.java:26) 它将第一条记录和第二条记录写入文件,但是第三个循环没有正确读取长度。有人知道为什么会发生这种情况吗?
发布于 2016-05-21 22:47:37
如System.out.println输出所示,字符串"1cRT"被读入recordLength,它不能解析为整数(或任何正常的数字值)。由于这个原因,Integer.parseInt抛出了一个异常。
您应该仔细检查您的输入数据是否与您期望的格式匹配。
unicode EDIT:查看粘贴输出的源代码,可以看到在"1cRT"中,有一个字符被计算为字符串。我不熟悉你所期望的数据格式,但一种有效的可能性是,你作为recordLength处理的输入块(即偏移量0到5)不应该被视为字符串的字符长度,而是以字节为单位的长度,因为String.substring会逐个字节地剪切字符串。
EDIT 2:假设正确。根据Marc21 specification,记录长度的编码是一个五个字符的ASCII数字字符串。因此,纠正该问题的一种方法是替换
recordLength = data.substring(lengthStart, lengthEnd);使用(未测试)
recordLength = new String(Arrays.copyOfRange(data.getBytes(), lengthStart, lengthEnd), "US-ASCII");或者,您可能更喜欢参考this StackOverflow answer中有关FileReaders编码的内容,并调整文件的读取和写入。
https://stackoverflow.com/questions/37364253
复制相似问题