Java 为什么';setText(字符串)是否规范化行结尾?

Java 为什么';setText(字符串)是否规范化行结尾?,java,swing,jtextcomponent,Java,Swing,Jtextcomponent,最近我注意到Java文本组件使用换行符(LF,\n,0x0A)在内部表示和解释换行符。这让我感到非常惊讶,并将我的假设置于一个问号之下,即在任何地方使用System.getProperty('line.separator')都是一个很好的实践 无论何时处理文本组件,在使用上述属性时都应该非常小心,因为如果使用JTextComponent.setText(String),最终可能会得到一个包含不可见换行符(例如CRs)的组件。这似乎并不重要,除非文本组件的内容可以保存到文件中。如果使用所有文本组件

最近我注意到Java文本组件使用换行符(LF,
\n
,0x0A)在内部表示和解释换行符。这让我感到非常惊讶,并将我的假设置于一个问号之下,即在任何地方使用
System.getProperty('line.separator')
都是一个很好的实践

无论何时处理文本组件,在使用上述属性时都应该非常小心,因为如果使用
JTextComponent.setText(String)
,最终可能会得到一个包含不可见换行符(例如CRs)的组件。这似乎并不重要,除非文本组件的内容可以保存到文件中。如果使用所有文本组件提供的方法将文本保存并打开到文件中,则在重新打开文件时,隐藏的换行符会在组件中突然出现。原因似乎是
JTextComponent.read(…)
方法进行了规范化

那么为什么
JTextComponent.setText(String)
不规范行尾呢?或者任何其他允许在文本组件中修改文本的方法?在处理文本组件时,使用
System.getProperty('line.separator')
是一种好的做法吗?这是一个好的做法吗

一些代码可以将此问题放在正确的角度:

导入java.awt.gridbag约束;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入java.awt.event.ActionEvent;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.OutputStreamWriter;
导入java.io.Reader;
导入java.io.UnsupportedEncodingException;
导入java.io.Writer;
导入javax.swing.AbstractAction;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.SwingUtilities;
公共类TextAreaTest扩展了JFrame{
专用JTextArea jtaInput;
私有JScrollPane jscpInput;
私有JButton jbSaveAndReopen;
公共文本区域测试(){
超级();
setDefaultCloseOperation(关闭时退出);
setTitle(“文本区域测试”);
GridBagLayout=新的GridBagLayout();
设置布局(布局);
jtaInput=新的JTextArea();
jtaInput.setText(“某些文本后跟windows换行符\r\n”
+“还有一些文字。”);
jscpInput=新的JScrollPane(jtaInput);
GridBagConstraints=新的GridBagConstraints();
constraints.gridx=0;constraints.gridy=0;
约束。网格宽度=2;
constraints.weightx=1.0;constraints.weighty=1.0;
constraints.fill=gridbagsconstraints.BOTH;
添加(jscpInput、约束);
jbSaveAndReopen=newjbutton(newsaveandreopenaction());
约束=新的GridBagConstraints();
constraints.gridx=1;constraints.gridy=1;
constraints.anchor=gridbagsconstraints.EAST;
constraints.insets=新的insets(5,0,2,2);
添加(jbSaveAndReopen,约束);
包装();
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
textraeatest tat=新的textraeatest();
tat.setVisible(true);
}
});
}
私有类saveandOpenAction扩展了AbstractAction{
私有文件=新文件(“text area test.txt”);
公共存储和开放操作(){
超级(“保存并重新打开”);
}
私有void saveToFile()
引发UnsupportedEncodingException、FileNotFoundException、,
IOException{
Writer=null;
试一试{
writer=新的OutputStreamWriter(
新文件输出流(文件),“UTF-8”);
TextAreaTest.this.jtaInput.write(writer);
}最后{
if(writer!=null){
试一试{
writer.close();
}捕获(IOEX异常){
}
}
}
}
私有void openFile()
抛出不支持的DencodingException,IOException{
Reader=null;
试一试{
reader=新的InputStreamReader(
新文件输入流(文件),“UTF-8”);
TextAreaTest.this.jtaInput.read(读卡器,文件);
}最后{
if(读卡器!=null){
试一试{
reader.close();
}捕获(IOEX异常){
}
}
}
}
已执行的公共无效操作(操作事件e){
可丢弃exc=null;
试一试{
saveToFile();
openFile();
}捕获(不支持DencodingException ex){
exc=ex;
}捕获(FileNotFoundException ex){
exc=ex;
}捕获(IOEX异常){
exc=ex;
}
如果(exc!=null){
JOptionPane.showConfirmDialog(
TextAreaTest.this,exc.getMessage(),“发生错误”,
JOptionPane.DEFAULT_选项,JOptionPane.ERROR_消息);
}
}        
}
}
添加一行新文本后,此程序在我的windows计算机上保存的内容示例(为什么是单个CR?o_o):

Edit01

我在Netbeans IDE中运行/调试了它,该IDE在Windows7上使用JDK1.7u15 64位(C:\Program Files\Java\JDK1.7.015)