rt,我直接贴上代码了,求没事的大神帮忙完善让窗口支持拖放文件,还有那个JLIST控件怎么让键盘按下DELETE键然后删除对应的选项
import java.awt.*;
import java.io.*;
import java.util.Vector;
import javax.swing.*;
/**
*
* @author 夏天的暴风雨
*/
public class TranslateFileEncode {
final String ASC = "gb2312";
final String UTF8 = "UTF-8";
final String UTF16L = "UTF-16LE";
final String UTF16B = "UTF-16BE";
private Vector fileList; //需要转换的文件列表
private String sourceEncode = ASC; //源文件Encode
private String dstEncode = UTF8; //目标文件Encode
private boolean hasBOM = false; //源文件是否有BOM标记
private boolean writeBOM = false; //是否向新文件的文件头写入BOM
/**
* @param args the command line arguments
*/
public String getFileEncode(File file) {
if (file.length() < 2) {
return ASC;
}
//开始查找
try {
InputStream fis = new FileInputStream(file);
if (!fis.markSupported()) {
fis = new BufferedInputStream(fis);
}
fis.mark(3);
byte[] byteBOM = new byte[3];
fis.read(byteBOM, 0, 3);
if (byteBOM[0] == (byte) 0xFF && byteBOM[1] == (byte) 0xFE) {
hasBOM = true;
return UTF16L;
}
if (byteBOM[0] == (byte) 0xFE && byteBOM[1] == (byte) 0xFF) {
hasBOM = true;
return UTF16B;
}
if (byteBOM[0] == (byte) 0xEF && byteBOM[1] == (byte) 0xBB && byteBOM[2] == (byte) 0xBF) {
hasBOM = true;
return UTF8;
}
fis.reset();
int read;
while ((read = fis.read()) != -1) {
if (read >= 0xF0) {
break;
}
if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
{
break;
}
if (0xC0 <= read && read <= 0xDF) {
read = fis.read();
if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF) (0x80 - 0xBF),也可能在GB编码内
{
continue;
} else {
break;
}
} else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
read = fis.read();
if (0x80 <= read && read <= 0xBF) {
read = fis.read();
if (0x80 <= read && read <= 0xBF) {
return UTF8;
} else {
break;
}
} else {
break;
}
}
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
//没有找到匹配的,默认返回本地字符集
return ASC;
}
public void TranslateFileEncode(File sourceFile) {
try {
//检查文件对象是否有效
if (sourceFile == null) {
return;
}
//将源文件改名备份,并建立目标文件
String fileName = sourceFile.getAbsolutePath();
sourceFile.renameTo(new File(fileName + "_bak"));
sourceFile = new File(fileName + "_bak");
File dstFile = new File(fileName);
dstFile.createNewFile();
//根据源文件编码建立输入流
sourceEncode = getFileEncode(sourceFile);
FileInputStream fis = new FileInputStream(sourceFile);
BufferedReader br = null;
switch (sourceEncode) {
case ASC:
br = new BufferedReader(
new InputStreamReader(fis, ASC));
break;
case UTF16L:
if (hasBOM) //如果源文件有BOM
{
fis.skip(2); //跳过BOM标记
}
br = new BufferedReader(
new InputStreamReader(fis, UTF16L));
break;
case UTF16B:
if (hasBOM) {
fis.skip(2);
}
br = new BufferedReader(
new InputStreamReader(fis, UTF16B));
break;
case UTF8:
if (hasBOM) {
fis.skip(3);
}
br = new BufferedReader(
new InputStreamReader(fis, UTF8));
break;
}
//根据目标文件编码建立输出流
FileOutputStream fos = new FileOutputStream(dstFile);
BufferedWriter bw = null;
switch (dstEncode) {
case ASC:
bw = new BufferedWriter(
new OutputStreamWriter(fos, ASC));
break;
case UTF16L:
if (writeBOM) {
fos.write(0xFF);
fos.write(0xFE);
}
bw = new BufferedWriter(
new OutputStreamWriter(fos, UTF16L));
break;
case UTF16B:
if (writeBOM) {
fos.write(0xFE);
fos.write(0xFF);
}
bw = new BufferedWriter(
new OutputStreamWriter(fos, UTF16B));
break;
case UTF8:
if (writeBOM) {
fos.write(0xEF);
fos.write(0xBB);
fos.write(0xBF);
}
bw = new BufferedWriter(
new OutputStreamWriter(fos, UTF8));
break;
}
//开始转换
String row = "";
while ((row = br.readLine()) != null) {
bw.write(row);
bw.newLine();
}
bw.close();
fos.close();
br.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void createFrame(JFrame frame) {
frame.setTitle("转换文件编码");
frame.setSize(480, 650);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Dimension displaySize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.width > displaySize.width) {
frameSize.width = displaySize.width;
}
if (frameSize.height > displaySize.height) {
frameSize.height = displaySize.height;
}
int x = (displaySize.width - frameSize.width) / 2;
int y = (displaySize.height - frameSize.height) / 2;
frame.setLocation(x, y);
}
public void addComponent(JFrame frame) {
fileList = new Vector();
JList jl = new JList(fileList);
JScrollPane scrollPane = new JScrollPane(jl);
frame.add(scrollPane, BorderLayout.CENTER);
//按钮
JPanel panel = new JPanel();
frame.add(panel, "North");
//添加文件
JButton addFile = new JButton("添加文件");
addFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(true);
fileChooser.showDialog(fileChooser, "选择文件");
File[] selectedFiles = fileChooser.getSelectedFiles();
for (int i = 0; i < selectedFiles.length; i++) {
fileList.add(selectedFiles[i]);
jl.updateUI();
}
}
});
panel.add(addFile);
//目标编码
JLabel label = new JLabel("请选择目标编码:");
panel.add(label);
String[] dstEndoeList = {UTF8, ASC, UTF16L, UTF16B};
JComboBox cb = new JComboBox(dstEndoeList);
cb.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) //该时间会触发两次,一次为取消旧的,一次为选择新的
{
dstEncode = e.getItem().toString(); //我们用选择新的事件的Item
}
}
});
panel.add(cb);
JCheckBox checkBox = new JCheckBox("写入BOM");
checkBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
writeBOM = true;
} else if (e.getStateChange() == ItemEvent.DESELECTED) {
writeBOM = false;
}
}
});
panel.add(checkBox);
//开始转换
JButton begin = new JButton("开始转换");
begin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < fileList.size(); i++) {
TranslateFileEncode((File) fileList.get(i));
}
JOptionPane.showMessageDialog(begin, "转换完成", "提示", JOptionPane.PLAIN_MESSAGE);
fileList.clear();
jl.updateUI();
}
});
panel.add(begin);
}
public static void main(String[] args) {
// TODO code application logic here
TranslateFileEncode instance = new TranslateFileEncode();
JFrame mainFrame = new JFrame();
EventQueue.invokeLater(new Runnable() {
public void run() {
instance.createFrame(mainFrame);
instance.addComponent(mainFrame);
mainFrame.setVisible(true);
}
});
}
}