本文目录导读:

对于 JEditorPane 和 HTMLEditorKit 的字节处理,主要涉及以下几个关键方面:
基本设置与字节编码
import javax.swing.*;
import javax.swing.text.html.*;
import java.io.*;
public class HTMLByteEditor {
public static void main(String[] args) {
JEditorPane editor = new JEditorPane();
editor.setEditorKit(new HTMLEditorKit());
editor.setContentType("text/html; charset=UTF-8");
// 设置HTML内容
String html = "<html><body><h1>测试</h1></body></html>";
editor.setText(html);
}
}
字节流读取HTML内容
// 从字节流读取
public void loadFromBytes(JEditorPane editor, byte[] htmlBytes) throws Exception {
// 直接方式
String html = new String(htmlBytes, "UTF-8");
editor.setText(html);
// 通过流的方式
try (ByteArrayInputStream bais = new ByteArrayInputStream(htmlBytes)) {
HTMLEditorKit kit = (HTMLEditorKit) editor.getEditorKit();
Document doc = kit.createDefaultDocument();
kit.read(bais, doc, 0);
editor.setDocument(doc);
}
}
读取本地HTML文件
public void loadFromFile(JEditorPane editor, String filePath) {
try {
// 读取文件字节
File file = new File(filePath);
byte[] fileBytes = Files.readAllBytes(file.toPath());
// 检测BOM(字节顺序标记)
String encoding = detectEncoding(fileBytes);
String html = new String(fileBytes, encoding);
editor.setText(html);
} catch (Exception e) {
e.printStackTrace();
}
}
private String detectEncoding(byte[] bytes) {
if (bytes.length >= 3 && bytes[0] == (byte)0xEF && bytes[1] == (byte)0xBB && bytes[2] == (byte)0xBF) {
return "UTF-8";
} else if (bytes.length >= 2 && bytes[0] == (byte)0xFE && bytes[1] == (byte)0xFF) {
return "UTF-16BE";
} else if (bytes.length >= 2 && bytes[0] == (byte)0xFF && bytes[1] == (byte)0xFE) {
return "UTF-16LE";
}
return "UTF-8"; // 默认
}
字节分析和处理
public class HTMLByteProcessor {
// 分析HTML字节
public static void analyzeHTMLBytes(byte[] htmlBytes) {
System.out.println("字节总长度: " + htmlBytes.length);
System.out.println("前20个字节: ");
for (int i = 0; i < Math.min(20, htmlBytes.length); i++) {
System.out.printf("%02X ", htmlBytes[i] & 0xFF);
}
System.out.println();
}
// 查找特定的字节模式
public static List<Integer> findPattern(byte[] data, byte[] pattern) {
List<Integer> positions = new ArrayList<>();
for (int i = 0; i <= data.length - pattern.length; i++) {
boolean found = true;
for (int j = 0; j < pattern.length; j++) {
if (data[i + j] != pattern[j]) {
found = false;
break;
}
}
if (found) {
positions.add(i);
}
}
return positions;
}
// 处理特殊字符的字节
public static String handleSpecialBytes(byte[] htmlBytes) {
StringBuilder sb = new StringBuilder();
for (byte b : htmlBytes) {
if (b < 0) { // 非ASCII字符
sb.append(String.format("&#%d;", b & 0xFF));
} else {
sb.append((char) b);
}
}
return sb.toString();
}
}
实际应用示例
public class HTMLEditorWithBytes extends JFrame {
private JEditorPane editor;
public HTMLEditorWithBytes() {
setTitle("HTML字节编辑器");
setSize(800, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
editor = new JEditorPane();
editor.setEditorKit(new HTMLEditorKit());
editor.setContentType("text/html");
JScrollPane scrollPane = new JScrollPane(editor);
add(scrollPane, BorderLayout.CENTER);
JButton loadButton = new JButton("加载HTML文件");
loadButton.addActionListener(e -> loadHTMLFile());
JPanel buttonPanel = new JPanel();
buttonPanel.add(loadButton);
add(buttonPanel, BorderLayout.NORTH);
}
private void loadHTMLFile() {
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
try {
File file = fileChooser.getSelectedFile();
byte[] fileBytes = Files.readAllBytes(file.toPath());
// 字节处理
analyzeAndDisplayHTML(fileBytes);
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, "加载失败: " + ex.getMessage());
}
}
}
private void analyzeAndDisplayHTML(byte[] htmlBytes) throws Exception {
// 分析字节
HTMLByteProcessor.analyzeHTMLBytes(htmlBytes);
// 查找所有HTML标签位置
byte[] bodyTag = "<body".getBytes();
List<Integer> positions = HTMLByteProcessor.findPattern(htmlBytes, bodyTag);
System.out.println("找到 <body> 标签位置: " + positions);
// 显示内容
String html = new String(htmlBytes, "UTF-8");
editor.setText(html);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new HTMLEditorWithBytes().setVisible(true);
});
}
}
性能优化建议
// 使用缓冲读取大文件
public String readLargeHTMLFile(File file) throws IOException {
StringBuilder content = new StringBuilder();
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
InputStreamReader reader = new InputStreamReader(bis, "UTF-8")) {
char[] buffer = new char[8192];
int charsRead;
while ((charsRead = reader.read(buffer)) != -1) {
content.append(buffer, 0, charsRead);
}
}
return content.toString();
}
// 分批处理字节
public void processHTMLBytesInBatches(byte[] htmlBytes, int batchSize) {
for (int i = 0; i < htmlBytes.length; i += batchSize) {
int end = Math.min(i + batchSize, htmlBytes.length);
byte[] batch = Arrays.copyOfRange(htmlBytes, i, end);
// 处理这一批字节
processBatch(batch, i);
}
}
private void processBatch(byte[] batch, int startPosition) {
// 实际处理逻辑
String batchStr = new String(batch, StandardCharsets.UTF_8);
// 更新UI(需要SwingUtilities.invokeLater)
}
常见问题处理
// 处理乱码问题
public String fixEncodingIssues(byte[] htmlBytes) {
// 尝试多种编码
String[] encodings = {"UTF-8", "GBK", "GB2312", "ISO-8859-1", "UTF-16"};
for (String encoding : encodings) {
try {
String decoded = new String(htmlBytes, encoding);
if (isValidHTML(decoded)) {
return decoded;
}
} catch (Exception e) {
continue;
}
}
return new String(htmlBytes, StandardCharsets.UTF_8);
}
private boolean isValidHTML(String html) {
// 简单验证
return html.contains("<html") || html.contains("<body") || html.contains("<p");
}
这些示例涵盖了 JEditorPane 与 HTMLEditorKit 在处理字节时的常见场景,包括编码处理、文件操作、字节分析等,根据具体需求可以选择合适的方法。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播