2017-07-16 38 views
0

我建了一个程序,读取XML文件的,当我在NetBeans中运行它,它的工作原理和人物都是可读的外观图像opening in netbeansPrintReader返回乱码

,但是当我从DIST文件夹中运行它,它的作品,但是当我尝试打开文件夹包含阿拉伯语显示它像人物形象 opening from dist folder

这是一些开放代码的

int option = chooser.showOpenDialog(this); 
    if(option == JFileChooser.APPROVE_OPTION){ 
     if(chooser.getSelectedFile()!=null){ 
      try { 
       reader = new FileReader(chooser.getSelectedFile()); 
       BufferedReader buff = new BufferedReader(reader); 
       text.read(buff, null); 
       opened = chooser.getSelectedFile(); 
       this.setTitle(chooser.getSelectedFile().getAbsolutePath()); 
      } catch (IOException ex) { 
       JOptionPane.showMessageDialog(null, "الملف غير موجود", "خطأ", JOptionPane.ERROR_MESSAGE); 
      }finally{ 
       if(reader!=null)try { 
        reader.close(); 
       } catch (IOException ex) { 

       } 
      } 
     } 
    } 

回答

1

的FileReader是一个古老的实用工具类日在使用默认的平台编码。这将因计算机而异,并且不可移植。

Path path = chooser.getSelectedFile().toPath(); 
text.read(Files.newBufferedReader(path, StandardCharsets.UTF_8)); 
//text.read(Files.newBufferedReader(path, Charset.forName("Windows-1256")); 

假设阿拉伯语文本存储为UTF-8或Windows-1256。

+0

感谢他的工作 –

+0

['FileReader'](http://docs.oracle.com/javase/8/docs/api/java/io/FileReader.html)只是一个方便的类,结合了'InputStreamReader'和'FileInputStream'。 javadoc也这么说。尽管使用新的Path API是很好的,但没有必要。正如javadoc所说:*此类的构造函数假定默认的字符编码和默认的字节缓冲区大小是适当的。要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。*这意味着'new InputStreamReader(new FileInputStream(chooser.getSelectedFile()),“UTF-8”)也可以工作。 – Andreas

+0

@Andreas我想说的是FileReader无法指定编码;是为本地文件。便利类文件也很好理解。您的InputStreamReader的优势在于其清晰的基本性质,即二进制流与文本读写器之间的桥梁。谢谢 –