- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近引起我注意的是,Java 文本组件使用换行符(LF、\n
、0x0A)在内部表示和解释换行符。这让我感到非常惊讶,并提出了我的假设,即在问号下使用 System.getProperty('line.separator')
everywhere 是一个很好的做法。
似乎无论何时处理文本组件,在使用上述属性时都应该非常小心,因为如果使用 JTextComponent.setText(String)
,您最终可能会得到一个组件包含不可见的换行符(例如 CR)。这可能看起来并不那么重要,除非文本组件的内容可以保存到文件中。如果您使用所有文本组件提供的方法将文本保存并打开到一个文件中,那么您隐藏的换行符会在重新打开文件时突然出现在该组件中。原因似乎是 JTextComponent.read(...)
方法进行了规范化。
那么为什么 JTextComponent.setText(String)
不规范化行尾呢?或者任何其他允许在文本组件中修改文本的方法?在处理文本组件时使用 System.getProperty('line.separator')
是一种好的做法吗?这是一个好的做法吗?
一些代码可以正确看待这个问题:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class TextAreaTest extends JFrame {
private JTextArea jtaInput;
private JScrollPane jscpInput;
private JButton jbSaveAndReopen;
public TextAreaTest() {
super();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Text Area Test");
GridBagLayout layout = new GridBagLayout();
setLayout(layout);
jtaInput = new JTextArea();
jtaInput.setText("Some text followed by a windows newline\r\n"
+ "and some more text.");
jscpInput = new JScrollPane(jtaInput);
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0; constraints.gridy = 0;
constraints.gridwidth = 2;
constraints.weightx = 1.0; constraints.weighty = 1.0;
constraints.fill = GridBagConstraints.BOTH;
add(jscpInput, constraints);
jbSaveAndReopen = new JButton(new SaveAndReopenAction());
constraints = new GridBagConstraints();
constraints.gridx = 1; constraints.gridy = 1;
constraints.anchor = GridBagConstraints.EAST;
constraints.insets = new Insets(5, 0, 2, 2);
add(jbSaveAndReopen, constraints);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TextAreaTest tat = new TextAreaTest();
tat.setVisible(true);
}
});
}
private class SaveAndReopenAction extends AbstractAction {
private File file = new File("text-area-test.txt");
public SaveAndReopenAction() {
super("Save and Re-open");
}
private void saveToFile()
throws UnsupportedEncodingException, FileNotFoundException,
IOException {
Writer writer = null;
try {
writer = new OutputStreamWriter(
new FileOutputStream(file), "UTF-8");
TextAreaTest.this.jtaInput.write(writer);
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException ex) {
}
}
}
}
private void openFile()
throws UnsupportedEncodingException, IOException {
Reader reader = null;
try {
reader = new InputStreamReader(
new FileInputStream(file), "UTF-8");
TextAreaTest.this.jtaInput.read(reader, file);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException ex) {
}
}
}
}
public void actionPerformed(ActionEvent e) {
Throwable exc = null;
try {
saveToFile();
openFile();
} catch (UnsupportedEncodingException ex) {
exc = ex;
} catch (FileNotFoundException ex) {
exc = ex;
} catch (IOException ex) {
exc = ex;
}
if (exc != null) {
JOptionPane.showConfirmDialog(
TextAreaTest.this, exc.getMessage(), "An error occured",
JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
}
}
}
}
添加新文本行后该程序在我的 Windows 计算机上保存的内容的示例(为什么是单个 CR?o_O):
Edit01
我在 Netbeans IDE 中运行/调试了它,它在 Windows 7 上使用 JDK1.7u15 64 位 (C:\Program Files\Java\jdk1.7.0_15)。
最佳答案
首先,真正的答案是设计师认为设计应该如何运作。你真的需要问他们才能得到真正的原因。
话虽如此:
So why doesn't JTextComponent.setText(String) normalize line endings?
我认为最有可能的原因是:
这将是意想不到的行为。大多数程序员会期望1 文本字段上的“get”返回与“set”相同的字符串值……或用户输入的字符串值。
如果文本字段确实规范化,那么程序员将很难在需要的地方保留原始文本的行结尾。
设计者可能在某些时候想要改变他们的想法(参见报告的read
和write
方法的行为) 但出于兼容性原因无法做到这一点。
无论如何,如果您需要规范化,没有什么可以阻止您的代码对 setter 检索到的值执行此操作。
Or any other method that allows text to be modified within a text component for that matter?
据报道(见评论)read
和/或 write
进行规范化。
Is using System.getProperty('line.separator') a good practice when dealing with text components? Is it a good practice at all?
这取决于上下文。如果您知道您正在读写要在“这个”平台上处理的文件,这可能是个好主意。如果文件打算在不同的平台(使用不同的行分隔符)上读取,那么规范化以匹配当前机器的约定可能不是一个好主意。
1 - 事实上,read
和 write
等其他方法可能 的行为不同并不影响这一点。他们不是“getter”和“setter”。我说的是人们期望“getters”和“setters”如何表现……而不是其他任何东西。此外,人们不应该期望一切以同样的方式行事,除非指定他们这样做。但显然,这里的部分问题是规范......javadocs......对这些问题保持沉默。
另一种可能性是@predi 报告的规范化行为实际上发生在Reader
/Writer
对象中......
关于java - 为什么 JTextComponent.setText(String) 不规范化行结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17882554/
我正在寻找一个库函数来规范化 Python 中的 URL,即删除路径中的“./”或“../”部分,或添加默认端口或转义特殊字符等。结果应该是指向同一网页的两个 URL 唯一的字符串。例如 http:/
我有 2 个版本的 XSD 文件,我想看看它们之间做了哪些更改。不幸的是,发布者选择完全重写 XSD,更改元素、属性、命名空间前缀等的顺序。是否有工具(命令行或 GUI)可以将它们转换为我可以使用的规
我一直在想,同时使用 normalize.css 和某种 CSS 重置会不会有什么大问题?我一直在四处挖掘,我遇到的所有文章都只是以非此即彼的方式谈论它们,而没有谈及将两者结合起来。 诚然,我在规范化
这对我来说是一个新话题,我已经阅读了几篇文章,但我仍然不清楚,甚至不确定以下问题是否与这篇文章的标题有关。 我的系统向用户发送数据。用户可以选择通过以下方式发送数据: XML 电子邮件 发布 根据用户
我正在从设计不佳的旧数据库升级到新数据库。在旧数据库中有带有字段 Id 和 Commodities 的 tableA。 Id 是主键,包含一个 int,Commodities 包含一个逗号分隔的列表。
假设我有包含此字符串的 Apache Solr 索引文档: Klüft skräms inför 我希望能够使用此关键字通过搜索找到它(注意“u”-“ü”): kluft 有没有办法做到这一点 ? 最
假设您正在处理常规的联系人数据库(您知道...姓名,电话号码,地址,电子邮件等...)。如果您在本地对此感到疑惑,那么一般来说这不是什么大问题,但是当我们查看国际场景时,它就是。 查看电话号码系统,您
尝试在不使用 python 中的任何包的情况下计算 L1 范数 假设我有向量:l = [2.34, 3.32, 6.32, 2.5, 3,3, 5.32] 我想找到这个向量的L1,没有任何包: 我已经
我们拥有 10 年的存档体育数据,分布在不同的数据库中。 尝试将所有数据合并到一个数据库中。由于我们将处理 10 倍的记录数量,因此我现在正在尝试重新设计架构以避免潜在的性能影响。 一项更改是将团队名
我正在使用以下设计为我的网站创建表格 设计1 设计2 由于并非所有注册用户都会尝试挑战,因此设计 1 适合。插入第三个表时,表 2 分数会相应更新。但是 user_id 字段变得多余。 设计 2 中为
我有一个带有字段 json 的表模板。由于 json 对于许多 template 来说可能是相同的 (1:n),我创建了另一个表 template_json 并添加了字段 template_json_
我有一个具有正交投影的 C++/OpenGl/Glut 应用程序。 窗口的宽度为 500 x 500 像素。目前,当鼠标点击发生时,该点将在 (0,0) 和 (500, 500) 之间。 我想获取该点
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我的印象是 JavaScript 解释器假设它正在解释的源代码已经被规范化。什么,规范化到底是做什么的?它不能是文本编辑器,否则源的明文表示会改变。是否有一些执行规范化的“预处理器”? 最佳答案 EC
我被分配了一项任务,但我不确定如何完成它: 我必须构建一个支持多种设备的消息系统,并且它应该尽可能高效。用户最多可以有 10 台设备,当用户收到消息时,所有设备都需要接收消息。 我有两个想法: Tab
我正在尝试将规范化合并到我的数据库设计中,互联网上提供的一些解释让我有点困惑 - 我不确定我是否在朝着正确的方向前进? 到目前为止我有: 用户: id username password 用户配置文件
规范化数据时,是否可以接受在同一张表中重复使用外键? 例如一家 express 公司有一个订单表和一个客户表,订单表会记录从哪个客户那里取件(Customer_ID),并且还会有一列用于说明要交付给哪
用 Java 制作规范形式的 XML 文件的最简单方法是什么?你有一些完成的代码吗?我在网上找到了几个链接,比如 this , this , 和 this ,但我无法让它工作:/ 谢谢, 伊凡 编辑:
在 Python 中是否有标准方法来规范化 unicode 字符串,以便它只理解可用于表示它的最简单的 unicode 实体? 我的意思是,可以将 ['LATIN SMALL LETTER A', '
我知道这个问题已经讨论了很多——但实际上我还没有找到这个问题的最终答案。 我想从我的 VBA(Excel)脚本中的日期“删除”(或更确切地说是标准化)时间。例如。: 20.12.2017 15:16
我是一名优秀的程序员,十分优秀!