我试图在学校做一个关于Java文本输入/输出的小练习,在尝试读取带有名称前缀(荷兰语)和姓氏的CSV文件时,我在开始时得到了一个问号。
这是一个小练习,我需要将我的代码添加到一个已经存在的项目中,其中包含3个小文件,以练习文本I/O的使用,请参阅项目代码:https://github.com/Remzi1993/klantenBestand
public void vulNamenLijst() {
// TODO: Lees het bestand "resources/NamenlijstGroot.csv" en zet elke regel (<tussenvoegsel>,<achternaam>)
// in de ArrayList namenLijst.
file = new File("resources/NamenlijstGroot.csv");
try (
Scanner scanner = new Scanner(file);
) {
while (scanner.hasNext()) {
String line = scanner.nextLine();
String[] values = line.split(",");
String namePrefix = values[0];
String surname = values[1];
namenLijst.add(namePrefix + " " + surname);
}
} catch (FileNotFoundException e) {
System.err.println("Data file doesn't exist!");
} catch (Exception e) {
System.err.println("Something went wrong");
e.printStackTrace();
}
}
很抱歉在代码中同时使用荷兰语和英语。我试着用英语编写自己的代码,但这个代码练习已经存在,我只需要添加一些带有//TODO的代码来练习文本I/O。
为了使用“标准”组件减轻BOM,可以使用Apache的BOMInputStream。请注意,BOM有多种风格(请参阅此处了解更多详细信息),这应该能够可靠地处理它们。
如果你有一个相当大的项目,你可能会发现你的项目中已经通过commons io有了BOMInputStream
扫描仪将接收输入流(见此处)
我找到了一个简单的解决方案:
final String UTF8_BOM = "\uFEFF";
if (line.startsWith(UTF8_BOM)) {
line = line.substring(1);
}
一个简单可行的例子:
File file = new File("resources/NamenlijstGroot.csv");
try (
Scanner scanner = new Scanner(file, StandardCharsets.UTF_8);
) {
while (scanner.hasNext()) {
String line = scanner.nextLine().strip();
final String UTF8_BOM = "\uFEFF";
if (line.startsWith(UTF8_BOM)) {
line = line.substring(1);
}
String[] values = line.split(",");
String namePrefix = values[0];
String surname = values[1];
namenLijst.add(namePrefix + " " + surname);
}
} catch (FileNotFoundException e) {
System.err.println("Data file doesn't exist!");
} catch (Exception e) {
System.err.println("Something went wrong");
e.printStackTrace();
}
@funky是正确的。您的文件以UTF8-BOM开头。
xxd的输出:
00000000: efbb bf64 652c 4a6f 6e67 0a2c 4a61 6e73 ...de,Jong.,Jans
00000010: 656e 0a64 652c 5672 6965 730a 7661 6e20 en.de,Vries.van
前三个字节是:ef bb bf
我正在尝试实现一个使用可观察的发出更改的类。当对此可观察对象完成订阅时,我想发送一个启动/初始化事件。然后我想发送通常的事件。 例如假设我有两个不同的订户A和B。A和B在不同的时间开始订阅。如果是MyClass。getChanges()发出事件1、2、3、4和5。 如果A在事件1、2之间启动it订阅,则应接收以下事件:InitialEvent、2、3、4、5。 如果B在事件4和5之间启动it订阅,
我想从话题的一开始就开始消费。我已经将属性“AUTO\u OFFSET\u RESET\u CONFIG”设置为最早,但不知何故它仍然没有从一开始就读取。 如果我错过了什么,有什么想法吗?我每次都在创造一个新的消费群体。
我想从我的android应用程序中读取来自Google Sheets的表格。我想通过Google Sheets API来做到这一点。我将工作表声明为公共,创建了API密钥并尝试发送服务调用: 我有401密码。答复: 请求缺少必需的身份验证凭据。需要OAuth 2访问令牌、登录cookie或其他有效的身份验证凭据。看见https://developers.google.com/identity/si
这里是我的源代码:
我想用Java读取一个巨大的文件。它包括75,000,000条线路。问题是,即使我使用的是最大和限制,但我得到的是:`java.lang.OutOfMemoryError(GC开销限制已超过),它显示这一行导致错误: 我做了一些测试,看到我能很好地阅读15,000,000行。因此我开始使用这种代码: 这里,它很好地写出了第一个15,000,000行,但是在第二个试验中,这再次给出了相同的错误,尽管
我正在尝试使用OpenCSV从一个CSV文件中读取。然后我想从输入csv中复制所有数据并将其输出到另一个csv文件,同时添加一个包含信息的新列。 我正在尝试的另一种方法是这样的(改变while循环,所有其他代码保持不变): 这确实正确地打印了所有的行,但是它只是复制。我想添加额外的“JSON”列及其数据。