Java 使用UTF-8字符读取和写入属性文件

Java 使用UTF-8字符读取和写入属性文件,java,utf-8,Java,Utf 8,我有一个属性文件,它包含UTF-8字符(请看我贴在下面的示例文件) 我必须编辑此属性文件的内容。编辑过程已成功执行。但编辑完属性文件后,输出显示如下 #UTF-8 #Fri Dec 09 15:17:55 IST 2011 root.label.nickelodeon=Nickelodeon root.label.2.2=\u0642\u0633\u064A\u0645\u0627\u062A root.label.sudoku=\u0633\u0648\u062F\u0648\u0643\u0

我有一个属性文件,它包含UTF-8字符(请看我贴在下面的示例文件)

我必须编辑此属性文件的内容。编辑过程已成功执行。但编辑完属性文件后,输出显示如下

#UTF-8
#Fri Dec 09 15:17:55 IST 2011
root.label.nickelodeon=Nickelodeon
root.label.2.2=\u0642\u0633\u064A\u0645\u0627\u062A
root.label.sudoku=\u0633\u0648\u062F\u0648\u0643\u0648
\uFEFF\#-------------------------------------------------------------------------------=
root.label.401.2=T\u00EAte \u00E0 modeler
root.msg.apps=\u0627\u0644\u062A\u0637\u0628\u064A\u0642\u0627\u062A
root.label.35.2=MSNBC
root.label.43.2=PBS Kids
root.msg.fault.project.perz=Print Apps\: \u0644\u0645 \u064A\u062A\u0645 \u062A\u062B\u0628\u064A\u062A \u0623\u064A Apps \u0639\u0644\u0649 \u0627\u0644\u0637\u0627\u0628\u0639\u0629 \u0644\u062F\u064A\u0643. \u064A\u0645\u0643\u0646\u0643 \u062A\u062B\u0628\u064A\u062AApps \u0639\u0644\u0649 \u0627\u0644\u0637\u0627\u0628\u0639\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0645\u0648\u0642\u0639 Apps \u0639\u0644\u0649 \u0648\u064A\u0628 \u0641\u064A \u0639\u0646\u0648\u0627\u0646 URL \u0627\u0644\u062A\u0627\u0644\u064A \: www.hpeprintcenter.com
root.label.getmore=\u0627\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0627\u0644\u0645\u0632\u064A\u062F
root.label.tabbloid=Tabbloid
root.label.128.2=\u0627\u0644\u0623\u0639\u0645\u0627\u0644 \u0627\u0644\u064A\u062F\u0648\u064A\u0629 \u0641\u064A HP
root.label.47.2=\u0645\u0648\u062C\u0632 Yahoo\!
root.label.86.3=MARMITON-1
root.label.hpcards=\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0641\u064A HP
root.label.weather=\u062D\u0627\u0644\u0629 \u0627\u0644\u0637\u0642\u0633
root.msg.fault.project.unexpected=\u062A\u0637\u0628\u064A\u0642\u0627\u062A \u0627\u0644\u0637\u0628\u0627\u0639\u0629\: \u063A\u064A\u0631 \u0645\u062A\u0648\u0641\u0631\u0629 \u0645\u0624\u0642\u062A\u064B\u0627. \u0627\u0644\u0631\u062C\u0627\u0621 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0644\u0627\u062D\u0642\u064B\u0627.
root.label.dreamworks=DreamWorks
resource.meta.lang=ar
root.label.quickforms=\u0627\u0633\u062A\u0645\u0627\u0631\u0627\u062A \u0633\u0631\u064A\u0639\u0629
root.label.recipes=\u0648\u0635\u0641\u0627\u062A \u0627\u0644\u0637\u0639\u0627\u0645
root.msg.getmore=\u0627\u0644\u0631\u062C\u0627\u0621 \u0632\u064A\u0627\u0631\u0629 \u0627\u0644\u0645\u0648\u0642\u0639 www.hpeprintcenter.com \u0644\u0645\u0639\u0631\u0641\u0629 \u0627\u0644\u0645\u0632\u064A\u062F \u062D\u0648\u0644 \u0627\u0644\u062A\u0637\u0628\u064A\u0642\u0627\u062A \u0648\u0625\u062F\u0627\u0631\u0629 \u0627\u0644\u062A\u0637\u0628\u064A\u0642\u0627\u062A \u0639\u0644\u0649 \u0647\u0630\u0647 \u0627\u0644\u0637\u0627\u0628\u0639\u0629. \u064A\u062E\u062A\u0644\u0641 \u062A\u0648\u0641\u0631 \u0627\u0644\u062A\u0637\u0628\u064A\u0642 \u062D\u0633\u0628 \u0627\u0644\u0628\u0644\u062F \u0648\u0627\u0644\u0644\u063A\u0629.
root.label.usatoday=USA Today
下面是我使用的代码,用于从特定位置读取Property文件并将内容写入其中

 private static void saveFile(String filePath, String propertyStr, String appName) throws IOException {     
        BufferedReader fis = new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"UTF-8"));  
        Properties p = new Properties();
        p.load(fis);    
        fis.close();
        p.setProperty(propertyStr, appName);
        p.store(new FileOutputStream(filePath), "UTF-8");
    }

您使用了错误的
store()
方法-第二个参数不是要使用的编码(它将使用ISO-8859-1传统属性文件编码,因此使用Unicode转义),而是注释

正确的方法将
Writer
作为参数。这应该起作用:

p.store(new OutputStreamWriter(
    new FileOutputStream(filePath), "UTF-8"), 
    comment);

此外,生成的属性文件的内容与第一个属性文件的顺序不同one@chinchu当前位置恐怕你对此无能为力。java.util.Properties不是为保留注释和文件结构而设计的。这是一门很古老的课。大多数人使用它只是读取文件,而不是写入文件。好的,但是当我试图在现有属性文件中附加字符串时。标题没有发生任何变化comments@chinchu:您当然可以使用其他IO类处理文件,那么Properties类的缺点当然不会影响您。如果您只需要附加单个属性,那么可以使用properties.store()和基于附加模式FileOutpuStream的Writer。然后甚至可以通过comment参数添加注释。
p.store(new OutputStreamWriter(
    new FileOutputStream(filePath), "UTF-8"), 
    comment);