1 public static void getXmlSource(String link) throws IOException { 2 // 用链接字符串new出URL对象 3 URL url = new URL(link); 4 5 // 输入输出流 6 InputStream in = (InputStream) url.getContent(); 7 BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); 8 FileOutputStream out = new FileOutputStream("xml_resource.xml"); 9 OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8"); 10 11 // 读一行写一行 12 String line = null; 13 while ((line = reader.readLine()) != null) { 14 writer.write(line);; 15 } 16 17 // 释放资源 18 writer.close(); 19 out.close(); 20 reader.close(); 21 in.close(); 22 23 // 打印成功信息 24 System.out.println("OK"); 25 }
作用是把指定URL连接到的XML文件下载下来。
一开始是全部乱码,我感觉大概是因为资源是UTF-8的,然后输出的不是,于是百度了一下,想把输出的内容先按UTF-8解码再输出,百度到的方法是用字符串的getBytes()方法把字符串转成字节数组,然后重新new一个字符串,用重载的构造方法加上编码类型作为参数,但是出现了很奇怪的情况,输出的文件里大部分显示正常了,但是有一部分内容是乱码,而且乱码的部分也不是生僻字也不是特殊符号的,这样想找办法都无从找起,于是只好另想办法。
后来发现构造输入流InputStreamReader的时候是可以加上编码作为参数的,一下子觉得找到办法了,于是果断按UTF-8来输入,然后原样输出,不行。
用上面的办法编码成GBK输出,不行。
编成UTF-8,不行。
症状是输出txt显示完全正常,但是输出成xml的话打开会报错,直接编辑会发现里面还是乱码。
最后就放弃了,上S1问了一下,没想到马上就有答案了……
输出文件不要用FileWriter,这样的话你输出的编码跟本机的OS和语言有关,用OutputStreamWriter输出,指定UTF-8编码
java的读写都要指定字符集, 不然默认都是操作系统的字符集来着..
在java里所有string都是用utf8存的, 只有转为byte串的时候才会转为相应的编码. 所以读取时候指定的字符集只决定了java用什么编码把byte[]转为string, 不影响你读取后存在内存里的string是什么字符集
结果问题出在细节上……
于是马上改了改代码,一下就成功了。
输入输出流都是可以指定字符集的,总之跟编码打交道的时候就不要偷懒用FileWriter了……