当前位置: 首页 > 知识库问答 >
问题:

在java中读取特定格式的文件时遇到麻烦

金晨
2023-03-14

我正在从一个文件中读取文本,但在试图将列表1列表2读入两个不同的字符串时遇到了困难。*指示第一个列表的结束位置。我试过使用数组,但数组只存储最后一个*符号。

List 1
Name: Greg
Hobby 1: Swimming
Hobby 2: Football
*
List 2
Name: Bob
Hobby 1: Skydiving
*

以下是我目前尝试的方法

String s = "";
try{
Scanner scanner = new Scanner(new File("file.txt"));
while(scanner.hasnextLine()){
s = scanner.nextLine();
}
}catch(Exception e){
e.printStackTrace}
String [] array = s.split("*");
String x = array[0];
String y = array[1];

共有1个答案

沃宇
2023-03-14

您的代码有多个问题,比如@henry说字符串只包含文件的最后一行,而且您误解了split(),因为它将RegularExpression作为参数。

我建议您使用下面的示例,因为它可以工作,并且比您的方法快得多。

启动示例:

// create a buffered reader that reads from the file
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));

// create a new array to save the lists
ArrayList<String> lists = new ArrayList<>();

String list = ""; // initialize new empty list
String line; // initialize line variable

// read all lines until one becomes null (the end of the file)
while ((line = reader.readLine()) != null) {
    // checks if the line only contains one *
    if (line.matches("\\s*\\*\\s*")) {
        // add the list to the array of lists
        lists.add(list);
    } else {
        // add the current line to the list
        list += line + "\r\n"; // add the line to the list plus a new line
    }
}

看第一行:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));

这一行创建了一个BufferedReader,它与Scanner几乎相同,但速度快得多,方法也不如Scanner多。对于这种用法,BufferedReader已经足够了。

然后它将InputStreamReader作为构造函数中的参数。这只是为了将下面的FileInputStream转换为阅读器

为什么要这么做?这是因为inputstreamreaderInputStream返回原始值,Reader将其转换为人类可读字符。请参阅InputStreamReader之间的区别。

看下一行:

ArrayList<String> lists = new ArrayList<>();

创建具有add()get(index)等方法的变量数组。查看数组和列表的区别。

最后一个:

list += line + "\r\n";

此行将添加到当前列表中,并向其中添加新行。

“\r\n”是特殊字符。\r结束当前行,\n创建新行。

 类似资料:
  • 我正在浏览https://ca.finance.yahoo.com/quote/aapl并想要得到股票价格的变化,绿色/红色文本。我已经能够刮除股票价格,但不能改变价值,因为他们位于相同的“div”类,但不同的“span”类。 我想要的文本:“-3.89(-1.36%)”-数字会有所不同 来自网站得HTML: 我用什么得到的价格:(282.80)-价格可能不同 我已经尝试了许多改变类名、span名

  • 问题内容: 有什么方法可以从文本文件中读取特定行?在API或Apache Commons中。就像是 : 我同意实现起来很简单,但是特别是当文件很大时,效率不是很高。 问题答案: 可以,但是仍然存在效率问题。 或者,您可以使用: 由于有缓冲,这将稍微更有效。 看一下并尝试跳过整行(使用正则表达式)。我无法确定它是否会更有效- 对其进行基准测试。 PS 代表 效率, 我的意思是 记忆效率

  • 所以我正在写一个代码来获取scanf一个文本文件并返回一个格式化的文本消息日志。我一直在想,当文件扫描行“332982000 20555552002 205551001 7 Webb先生,我能问你一个问题吗?”时,如何在某一点扫描文件中的字符串,并打印E.X点以外的所有字符串我将前4个数字扫描为整数,并将其余写入的文本扫描到从“Mr.Webb”开始的字符数组中。 我尝试使用一个for循环与fsca

  • 如果这一行文本没有以方括号开头,我想把这一行连接到上面的一行。我可以读它在正常使用这个代码。我试着用String.StartsWith但是我搞不懂。 我正在寻找对此方法的更改,以使它以我想要的格式读取它,或者可能是一个将作用于我的并对此问题排序的方法。谢谢

  • 我有这个代码below.What我想做的是读取一个文本文件,每行都有字符串分隔tabs.For示例(名称\t国家\t ID\t内容),其中\t是tab.Then我想只打印每行的第二列。我试图将整行拆分为标记,但它只适用于文件的第一行,然后它抛出ArrayIndexOutOfBoundsException。此外,当我尝试只打印第一列(标记[0])但不打印标记[1]时,它也很完美,我need.So我需