前一段时间做一个法国的项目,其中有一个数据同步的问题,客户给我们他们从自己数据库导出的xml格式的数据,我在这边写了一个定时程序,定期检测文件是否更新,并同步xml格式的数据到我们这边的数据库中。当时自己一时疏忽,利用jdom解析文件,但是后面碰到了一个问题,客户的文件过大,将近百兆,同步时会报内存溢出问题。所以采取了一个折中的办法,我把文件进行分解,以两千条数据为一个文件单位,这样问题就初步解决了。
但是后面报出了另外一个问题,客户那面的数据中有法文字符,我分解文件的时候有些字符,如“DE CONSOLES ÉTAGÈRES”会在分解后的文件中出现乱码问题。我原来的思路是利用FileReader构件字符流,然后用BufferedReader装饰FileReader,利用BufferedReader的readline()方法逐行读取,同样的方法利用BufferedWriter,FileReader写入分割文件。
后来我查阅了网上的资料,问题出现在编码集的问题和流与字符的纠葛。
解决方法是利用InputStreamReader和OutputStreamWriter,并设定编码集合,如下:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(xmlFile), Charset.forName("utf-8")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(xmlPath + "temp1.xml"), Charset.forName("utf-8")));
这样问题就解决了,其实FileReader就是从InputStreamReader继承的,采用的编码格式是系统默认的。
*************************************************************************
- 编码方式的变迁:Ascii码(一个字节,而且高位不用,能表示128个字符)---》非Ascii码(是欧洲各国都有自己的标准,不能显示东方国家)---》UICODE(只是符号集,规定了符号的二进制代码,但是没有规定怎么存)---》UTF-8(是UICODE的实现之一,是一种变长的编码方式)