JAVA读取和写入文件时如果不指定字符集,那么都是采用操作系统默认的字符集.当我们在Windows平台上创建一个文件包含有中文,然后在Linux 平台下用JAVA读出来,那么很有可能会出现乱码.这是因为:在Windows中文版平台下,系统的默认字符集为GB18030,而且Linux的则为 UTF-8.如果我们不使用其它工具,一般来说,一个文件是用什么字符集写的,那么应该用同样的字符集才能不出错地读出来,当然字符集兼容的情况例外(跟乱码无关,不讨论).扯了这么多,无非就是想说读取文件和书写文件时都可以指定字符集可以解决乱码.
读文件:
InputStreamReader isr = new InputStreamReader(new FileInputStream( filePath), charsetName);
写文件:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream( filePath),charsetName);
但是,很多情况下,文件可能是由其它工具导出的,我们并不知道文件的字符集是什么.尤其出现在WEB导入导出中,经常是客户端是Windows,服务器是 Linux,solaris,AIX或其它.这时由客户端生成的文件导入到服务器上,如果需要对其内容进行分析的话,就很可能会陷入乱码困境.有没有办法能够根据文件的内容来判断该文件的字符集呢?似乎没有能够完全准确判断的.网上说能够根据文件的头几个字节来判断,如以"0xEF0xBB 0xBF"开头文本文件的为"UTF-8″格式等,但这种判断只局限于文件有BOM(Byte
Order Mark,根据字符集玩的一个小聪明)情况下,如果文件没有BOM,那么得到以"UTF-8"编码的文件的前三个字节就不一定是"EF,BB,BF",故该方法不能用来判断一个文件字符集.有一种比较可取的方法就是Mozilla出了一个开源的包--"chardet",在sourceforge.net 上可以下到,不过目前这个网站好像被封了,只能Google或百度了.通过该包能够得出一个文件可能字符集.也不一定全准(Windows的记事本也能得判断文件的字符集,而且也不能全准,最著名的就是不能判断"联通"两个字,用记事本写这两个字,保存,再打开就是乱码,除非你指定字符集),有兴趣可以研究一下.总的说来,chardet应该是一个比较好的解决方案了.
例子:
package swings; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.filechooser.FileNameExtensionFilter; public class Jfilechooserdemo extends JFrame{ JButton jButton; JTextArea jTextArea; Jfilechooserdemo(String string) { super(string); jButton=new JButton("打开文件对话框"); jTextArea=new JTextArea(); jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub JFileChooser jFileChooser=new JFileChooser(); FileNameExtensionFilter filter=new FileNameExtensionFilter(".txt", "txt"); jFileChooser.setFileFilter(filter); jFileChooser.setAcceptAllFileFilterUsed(false); int state=jFileChooser.showOpenDialog(null); File file=jFileChooser.getSelectedFile(); if(file!=null&&state==jFileChooser.APPROVE_OPTION) { try { InputStreamReader inputStream = new InputStreamReader(new FileInputStream( file), "utf-8"); char[]b=new char[1024]; int n=-1; while ((n=inputStream.read(b,0,b.length))!=-1) { String str=new String(b,0,n); jTextArea.append(str); } } catch (IOException e2) { // TODO: handle exception } } } }); add(jButton,BorderLayout.NORTH); add(new JScrollPane(jTextArea)); setSize(200, 300); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }