BufferedWrite中的newLine()换行出现的问题及解决办法

今天在做项目的时候,从网上下载了一个ascii2native的java实现,但是本人是需要将一个国际化文件转化成中文字符的文件。所以本人写了以小段测试代码将properties格式的文件输出为含有中文字符的txt文件,刚开始本人的代码是这样写的:package com.nsp.native2asc; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.Properties; /** * Native2Ascii的实用类 * @author Administrator * */ public class Native2AsciiUtils { /** * prefix of ascii string of native character */ private static String PREFIX = "//u"; /** * Native to ascii string. It's same as execut native2ascii.exe. * * @param str * native string * @return ascii string */ public static String native2Ascii(String str) { char[] chars = str.toCharArray(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < chars.length; i++) { sb.append(char2Ascii(chars[i])); } return sb.toString(); } /** * Native character to ascii string. * * @param c * native character * @return ascii string */ private static String char2Ascii(char c) { if (c > 255) { StringBuilder sb = new StringBuilder(); sb.append(PREFIX); int code = (c >> 8); String tmp = Integer.toHexString(code); if (tmp.length() == 1) { sb.append("0"); } sb.append(tmp); code = (c & 0xFF); tmp = Integer.toHexString(code); if (tmp.length() == 1) { sb.append("0"); } sb.append(tmp); return sb.toString(); } else { return Character.toString(c); } } /** * Ascii to native string. It's same as execut native2ascii.exe -reverse. * * @param str * ascii string * @return native string */ public static String ascii2Native(String str) { StringBuilder sb = new StringBuilder(); int begin = 0; int index = str.indexOf(PREFIX); while (index != -1) { sb.append(str.substring(begin, index)); sb.append(ascii2Char(str.substring(index, index + 6))); begin = index + 6; index = str.indexOf(PREFIX, begin); } sb.append(str.substring(begin)); return sb.toString(); } /** * Ascii to native character. * * @param str * ascii string * @return native character */ private static char ascii2Char(String str) { if (str.length() != 6) { throw new IllegalArgumentException( "Ascii string of a native character must be 6 character."); } if (!PREFIX.equals(str.substring(0, 2))) { throw new IllegalArgumentException( "Ascii string of a native character must start with /"//u/"."); } String tmp = str.substring(2, 4); int code = Integer.parseInt(tmp, 16) << 8; tmp = str.substring(4, 6); code += Integer.parseInt(tmp, 16); return (char) code; } public static void readToConvert() throws IOException{ Properties properties=new Properties(); BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:/test.txt"),"utf-8")); FileInputStream fileInputStream=new FileInputStream("d:/ucstar_i18n_zh_CN.properties"); properties.load(fileInputStream); fileInputStream.close(); for(Iterator iter=properties.keySet().iterator();iter.hasNext();){ String key=(String)iter.next(); String value=properties.getProperty(key); String valueConverted=ascii2Native(value); // String terminateStr=key+"="+valueConverted+System.getProperty("line.separator"); String terminateStr=key+"="+valueConverted; bufferedWriter.write(terminateStr); //用newLine()换行,会出现前面properties文件中行前有空格的一个键值对不会输出到txt文件 //bufferedWriter.newLine(); } bufferedWriter.close(); } public static void main(String[] args) throws IOException { // String str=ascii2Native("/u5355/u51fb/u53ef/u7ba1/u7406/u670d/u52a1/u5668/u8bbe/u7f6e"); // System.out.println(str); readToConvert()

 

后来发现在properties文件中一行前面有空格的键值对在txt文件中找不到了,经检测发现原来是newLine()方法在作怪,修改后代码如下:

package com.nsp.native2asc; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.Properties; /** * Native2Ascii的实用类 * @author Administrator * */ public class Native2AsciiUtils { /** * prefix of ascii string of native character */ private static String PREFIX = "//u"; /** * Native to ascii string. It's same as execut native2ascii.exe. * * @param str * native string * @return ascii string */ public static String native2Ascii(String str) { char[] chars = str.toCharArray(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < chars.length; i++) { sb.append(char2Ascii(chars[i])); } return sb.toString(); } /** * Native character to ascii string. * * @param c * native character * @return ascii string */ private static String char2Ascii(char c) { if (c > 255) { StringBuilder sb = new StringBuilder(); sb.append(PREFIX); int code = (c >> 8); String tmp = Integer.toHexString(code); if (tmp.length() == 1) { sb.append("0"); } sb.append(tmp); code = (c & 0xFF); tmp = Integer.toHexString(code); if (tmp.length() == 1) { sb.append("0"); } sb.append(tmp); return sb.toString(); } else { return Character.toString(c); } } /** * Ascii to native string. It's same as execut native2ascii.exe -reverse. * * @param str * ascii string * @return native string */ public static String ascii2Native(String str) { StringBuilder sb = new StringBuilder(); int begin = 0; int index = str.indexOf(PREFIX); while (index != -1) { sb.append(str.substring(begin, index)); sb.append(ascii2Char(str.substring(index, index + 6))); begin = index + 6; index = str.indexOf(PREFIX, begin); } sb.append(str.substring(begin)); return sb.toString(); } /** * Ascii to native character. * * @param str * ascii string * @return native character */ private static char ascii2Char(String str) { if (str.length() != 6) { throw new IllegalArgumentException( "Ascii string of a native character must be 6 character."); } if (!PREFIX.equals(str.substring(0, 2))) { throw new IllegalArgumentException( "Ascii string of a native character must start with /"//u/"."); } String tmp = str.substring(2, 4); int code = Integer.parseInt(tmp, 16) << 8; tmp = str.substring(4, 6); code += Integer.parseInt(tmp, 16); return (char) code; } public static void readToConvert() throws IOException{ Properties properties=new Properties(); BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:/test.txt"),"utf-8")); FileInputStream fileInputStream=new FileInputStream("d:/ucstar_i18n_zh_CN.properties"); properties.load(fileInputStream); fileInputStream.close(); for(Iterator iter=properties.keySet().iterator();iter.hasNext();){ String key=(String)iter.next(); String value=properties.getProperty(key); String valueConverted=ascii2Native(value); String terminateStr=key+"="+valueConverted+System.getProperty("line.separator"); // String terminateStr=key+"="+valueConverted; bufferedWriter.write(terminateStr); //用newLine()换行,会出现前面properties文件中行前有空格的一个键值对不会输出到txt文件 // bufferedWriter.newLine(); } bufferedWriter.close(); } public static void main(String[] args) throws IOException { // String str=ascii2Native("/u5355/u51fb/u53ef/u7ba1/u7406/u670d/u52a1/u5668/u8bbe/u7f6e"); // System.out.println(str); readToConvert(); } }

你可能感兴趣的:(BufferedWrite中的newLine()换行出现的问题及解决办法)