Java PrintReader返回不可读的字符

Java PrintReader返回不可读的字符,java,swing,netbeans,arabic,readfile,Java,Swing,Netbeans,Arabic,Readfile,我构建了一个程序,当我在netbeans中运行它时,它可以读取xml文件,并且字符可以从图像中读取 但当我从dist文件夹运行它时,它会工作,但当我试图打开包含阿拉伯语的文件夹时,它会显示图像中的字符 这是一些开场白 int option = chooser.showOpenDialog(this); if(option == JFileChooser.APPROVE_OPTION){ if(chooser.getSelectedFile()!=null){

我构建了一个程序,当我在netbeans中运行它时,它可以读取xml文件,并且字符可以从图像中读取

但当我从dist文件夹运行它时,它会工作,但当我试图打开包含阿拉伯语的文件夹时,它会显示图像中的字符

这是一些开场白

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) {

                }
            }
        }
    }

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。

只是一个方便的类,它结合了InputStreamReader和FileInputStream。javadoc也这么说。尽管使用新的Path API很好,但没有必要。正如javadoc所说:此类的构造函数假定默认字符编码和默认字节缓冲区大小是合适的。要自己指定这些值,请在FileInputStream上构造InputStreamReader。这意味着新的InputStreamReaderNewFileInputStreamChooser.getSelectedFile,UTF-8也可以工作。@Andreas我想说的是FileReader不能指定编码;用于本地文件。方便类文件也很值得了解。InputStreamReader的优势在于其清晰的基本特性,它是binary~Stream和文本阅读器/编写器之间的桥梁。谢谢