gpt4 book ai didi

java - 在 Linux 上编写要由 Windows 应用程序导入的文本文件,换行问题

转载 作者:行者123 更新时间:2023-12-01 19:15:20 25 4
gpt4 key购买 nike

我在 stackoverflow 和网上阅读了很多内容,我还在我的代码中尝试了十几种变体,但尚未找到解决方案。该方法必须根据给定的这些文件规范写出一个文本文件,以便基于 Windows 的系统上的另一个应用程序可以导入该文件。已发现对此进行的测试是,如果换行符在记事本中看起来正确,则导入成功。

将文件写入服务器后,再次读取它并传递到字节数组中,该数组稍后附加到电子邮件等中。(不确定这是否相关)

我从通常用来写出文件的更高级别的类开始,当我阅读有关该主题的更多内容时,尝试使用 FileOutputStream,以便我可以显式指定 CRLF 字节。 (在记事本中仍然无法正确对齐,这是我正在使用的测试)

byte[] CRLF = { 0x0D, 0x0D, 0x0A };//"If you write \r\n on Windows, you'll actually get 0x0D 0x0D 0x0A in the file"
Map<String, ByteBuffer> fileMap = new HashMap<String, ByteBuffer>();
//eg: BA20110627-2.TXT
Timestamp nowTimestamp = UtilDateTime.nowTimestamp();
DateFormat df = new SimpleDateFormat("yyyyMMdd");
String date = df.format(nowTimestamp);
int count = 1;
for(Map<String, List<String>> fileLineListsAndTotAmountMap : fileLineListsAndTotAmountMaps){
String fileName = "BA"+date+"-"+count+".TXT";
FileOutputStream out = new FileOutputStream(fileStorePath+fileName);
String header = ""+new Header(date).toString();
byte[] headerAsBytes = header.getBytes();
out.write(headerAsBytes);
out.write(CRLF);
//each map only has one entry
Map.Entry<String, List<String>> entry = (Entry<String, List<String>>) fileLineListsAndTotAmountMap.entrySet().toArray()[0];
for(String s: entry.getValue()){
if (!s.equals("")) {
String line = s;
byte[] lineAsBytes = line.getBytes();
out.write(lineAsBytes);
out.write(CRLF);

}
}
//totNumOfDebitRecords, totAmountForDebitRecords
String footer = ""+new Footer(new Integer(fileLineListsAndTotAmountMap.size()).toString(), entry.getKey());
byte[] footerAsBytes = footer.getBytes();
out.write(footerAsBytes);
out.write(CRLF);
out.flush();
out.close();
fileMap.put(fileName, ByteBuffer.wrap(getBytesFromFile(new File(fileStorePath+fileName))));
}

我能想到的唯一一件事就是使用 java.nio.charset.CharsetEncoder 并尝试将其编码为 ASCII,尽管我真的看不出这有什么帮助。

任何人都可以进一步阐明此类问题吗?

最佳答案

我还没有阅读你的其余代码,但这已经不准确了:

//"If you write \r\n on Windows, you'll actually get 0x0D 0x0D 0x0A in the file"
byte[] CRLF = { 0x0D, 0x0D, 0x0A };

CRLF 只是 0x0d、0x0a...

其他问题:

  • 您在使用 String.getBytes() 时未指定编码:几乎总是一个坏主意
  • 您没有在流中使用 finally block
  • 您正在使用 ""+x 将值转换为字符串 - 只需调用 toString (在 header 的情况下,您已经得到了一个字符串); ""+x 可以工作,但它是丑陋的代码 - 它谈论串联,这不是您想要实现的。
  • 您应该使用 Writer(例如 OutputStreamWriter)来写入文本数据 - 这就是它的用途。那么你不需要担心字节,你可以只用字符串来工作。我强烈建议使用 OutputStreamWriter 而不是 FileWriter,以便您可以指定编码。

一旦你解决了所有这些问题,你的代码将能够更好地解决换行符的具体问题...尽管我强烈建议如果你仍然遇到问题,你可以用一个简短但完整的程序,打印几行文本。页眉、页脚等与“编写行分隔符”的业务无关。

你可能会发现 Guava 中与 IO 相关的类也让这一切变得更容易......

关于java - 在 Linux 上编写要由 Windows 应用程序导入的文本文件,换行问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6901352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com