我有一个类通过读取上传的文件将新配置附加到现有配置。问题是它在Windows上运行正常,但在Linux上却不是这样 - 我使用Servlet接收文件。新配置必须从一行开始,并且不得在任何地方有空行。以下是代码。
public class ConfigGen {
public static void process(File configFile, File uploadedFile)
throws IOException {
synchronized (configFile) {
if (shouldAppend(configFile, uploadedFile)) {
StringBuilder builder = readFile(uploadedFile);
StringBuilder orig = readFile(configFile);
FileWriter writer = new FileWriter(configFile, true);
// If the content ends with a new line character then remove the
// new line from content to be appended
if (orig.toString().endsWith(
System.getProperty("line.separator"))) {
writer.append(builder.substring(1));
} else {
writer.append(builder);
}
writer.flush();
writer.close();
}
}
}
/**
* @param configFile
* @param uploadedFile
* @return true if config change is required, false otherwise
* @throws IOException
*/
private static final boolean shouldAppend(File configFile, File uploadedFile)
throws IOException {
synchronized (configFile) {
String originalConfig = readFile(configFile).toString().trim();
String newAddition = readFile(uploadedFile).toString().trim();
String newSecGroup = newAddition.substring(0,
newAddition.indexOf(":"));
return !originalConfig.contains(newSecGroup);
}
}
private static final StringBuilder readFile(File file) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(file));
String str = "";
StringBuilder builder = new StringBuilder();
while ((str = br.readLine()) != null) {
builder.append(System.getProperty("line.separator") + str);
}
br.close();
return builder;
}
}
多次添加新配置的文件将使用vim或类似的编辑器手动编辑。我得到的行为是 - 在Linux机器上。 如果文件是使用vim编辑的,则新文本会在添加新行之后附加,之后将从下一行显示任何后续更新 - 直到使用vim进行编辑。
例如:假设我在文件中有以下内容 - 最初使用vim编写。
sg-e696a08c:
classes:
tomcat6:
myappmodule:
endpoint: "10.0.2.11"
port: "1443"
新文件发布时带有以下内容
sg-fde2a89d:
classes:
tomcat7:
servmod:
db: "xyz.com"
port: "1336"
配置文件的预期内容为。
sg-e696a08c:
classes:
tomcat6:
myappmodule:
endpoint: "10.0.2.11"
port: "1443"
sg-fde2a89d:
classes:
tomcat7:
servmod:
db: "xyz.com"
port: "1336"
但我得到了
sg-e696a08c:
classes:
tomcat6:
myappmodule:
endpoint: "10.0.2.11"
port: "1443"
sg-fde2a89d:
classes:
tomcat7:
servmod:
db: "xyz.com"
port: "1336"
请注意,有一个空行。发布的任何后续文件都不会导致任何空的新行,直到使用vim编辑文件。我不知道为什么我会遇到这种行为。窗户的结果很好。由于此行为,生成的配置将变为无效。在Windows上,我使用Notepad ++编辑文件。
vim
是否会在文件末尾添加一些我可能缺少的特殊字符或其他内容?我该怎么做才能解决这个问题,以及为什么会出现这种情况?
答案 0 :(得分:3)
你在readFile()中不必要地添加换行符:
//builder.append(System.getProperty("line.separator") + str);
builder.append(str).append(System.getProperty("line.separator"));
并且评论的代码(来自流程)似乎是超级的。
//if (orig.toString().endsWith(
// System.getProperty("line.separator"))) {
// writer.append(builder.substring(1));
//} else {
// writer.append(builder);
//}
// just use this:
writer.append(builder);
除此之外,值得一提的是,用Vim编写的文件以fileformat=unix
的换行符结束,如果是fileformat=dos
,则以回车+换行符结束。但是,在这种情况下,这应该是无关紧要的,因为您使用trim()
。