Java JTextPane RTF保存

我有以下代码试图将JTextPane的内容保存为RTF。 虽然在以下代码中创建了一个文件,但它是空的!

关于我做错什么的任何提示? (像往常一样不要忘记我是初学者!)

if (option == JFileChooser.APPROVE_OPTION) { //////////////////////////////////////////////////////////////////////// //System.out.println(chooser.getSelectedFile().getName()); //System.out.println(chooser.getSelectedFile().getAbsoluteFile()); /////////////////////////////////////////////////////////////////////////// StyledDocument doc = (StyledDocument)textPaneHistory.getDocument(); RTFEditorKit kit = new RTFEditorKit(); BufferedOutputStream out; try { out = new BufferedOutputStream(new FileOutputStream(chooser.getSelectedFile().getName())); kit.write(out, doc, doc.getStartPosition().getOffset(), doc.getLength()); } catch (FileNotFoundException e) { } catch (IOException e){ } catch (BadLocationException e){ } } 

编辑:HTMLEditorKit如果我使用HTMLEditorKit它的工作原理,这就是我真正想要的。 解决了!

  if (textPaneHistory.getText().length() > 0){ JFileChooser chooser = new JFileChooser(); chooser.setMultiSelectionEnabled(false); int option = chooser.showSaveDialog(ChatGUI.this); if (option == JFileChooser.APPROVE_OPTION) { StyledDocument doc = (StyledDocument)textPaneHistory.getDocument(); HTMLEditorKit kit = new HTMLEditorKit(); BufferedOutputStream out; try { out = new BufferedOutputStream(new FileOutputStream(chooser.getSelectedFile().getAbsoluteFile())); kit.write(out, doc, doc.getStartPosition().getOffset(), doc.getLength()); } catch (FileNotFoundException e) { } catch (IOException e){ } catch (BadLocationException e){ } } } 

这是解决方案。 如果使用HTMLEditorKit,它可以工作。

这是RTF的解决方案,而不是HTML。

由于RTF没有标准化,我需要一些额外的标签,如\ sb和\ sa,以强制我的Wordpad正确显示文件。

 protected void exportToRtf() throws IOException, BadLocationException { final StringWriter out = new StringWriter(); Document doc = textPane.getDocument(); RTFEditorKit kit = new RTFEditorKit(); kit.write(out, doc, doc.getStartPosition().getOffset(), doc.getLength()); out.close(); String rtfContent = out.toString(); { // replace "Monospaced" by a well-known monospace font rtfContent = rtfContent.replaceAll("Monospaced", "Courier New"); final StringBuffer rtfContentBuffer = new StringBuffer(rtfContent); final int endProlog = rtfContentBuffer.indexOf("\n\n"); // set a good Line Space and no Space Before or Space After each paragraph rtfContentBuffer.insert(endProlog, "\n\\sl240"); rtfContentBuffer.insert(endProlog, "\n\\sb0\\sa0"); rtfContent = rtfContentBuffer.toString(); } final File file = new File("c:\\temp\\test.rtf"); final FileOutputStream fos = new FileOutputStream(file); fos.write(rtfContent.toString().getBytes()); fos.close(); } 

这就是我遇到同样问题时的表现。

  public void actionPerformed(ActionEvent e) { text = textPane.getText(); JFileChooser saveFile = new JFileChooser(); int option = saveFile.showSaveDialog(null); saveFile.setDialogTitle("Save the file..."); if (option == JFileChooser.APPROVE_OPTION) { File file = saveFile.getSelectedFile(); if (!file.exists()) { try { BufferedWriter writer = new BufferedWriter( new FileWriter(file.getAbsolutePath() + ".rtf")); writer.write(text); writer.close(); } catch (IOException ex) { ex.printStackTrace(); System.out.println(ex.getMessage()); JOptionPane.showMessageDialog(null, "Failed to save the file"); } } else if (file.exists()) { int confirm = JOptionPane.showConfirmDialog(null, "File exists do you want to save anyway?"); if (confirm == 0) { try { BufferedWriter writer = new BufferedWriter( new FileWriter(file.getAbsolutePath() + ".rtf")); writer.write(text); writer.close(); } catch (IOException ex) { ex.printStackTrace(); System.out.println(ex.getMessage()); JOptionPane.showMessageDialog(null, "Failed to save the file"); } } else if (confirm == 1) { JOptionPane.showMessageDialog(null, "The file was not saved."); } } } if (option == JFileChooser.CANCEL_OPTION) { saveFile.setVisible(false); } }// End of method 

我在您的代码中看到的唯一问题是您没有关闭输出流(当内容实际写入磁盘时)。

尝试out.close()

它应该解决你的问题。