尝试在将文本文件分成部分的对象类中创建函数(Java)

时间:2018-01-03 12:35:44

标签: java file text directory

我试图将文本文件分成150个部分,所以我在对象类本身中创建了一个函数。 这是完整的对象类:

public TehilimEpisode(int EpisodeID, String[] ab)
{
    this.EpisodeID=EpisodeID;
    this.Perek=ab;
}
public static void setperek(TehilimEpisode[] pirkoni) throws IOException
{
    BufferedReader inputReader = new BufferedReader(new FileReader("C:\\\\*.txt"));
    String nextLine; String[] ab;
        while ((nextLine = inputReader.readLine()) != null)
        {   
        for(int i=1; i<=150;i++)
        {
            ab = nextLine.split("$");
            pirkoni[i] = new TehilimEpisode(i, ab);
        }
    }
    for(int i=1; i<=150; i++)
        pirkoni.toString();
}
@Override
public String toString() {
    return String.format(EpisodeID + " & " + Arrays.toString(Perek));
}
@Override
protected Object clone() throws CloneNotSupportedException {
    // TODO Auto-generated method stub
    return super.clone();
}
@Override
public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    return super.equals(obj);
}
@Override
protected void finalize() throws Throwable {
    // TODO Auto-generated method stub
    super.finalize();
}
@Override
public int hashCode() {
    // TODO Auto-generated method stub
    return super.hashCode();
}
}

功能名称为 setperek 。当我试图从主类运行该函数时,它正在编写此错误:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Unknown Source)
    at TehilimEpisode.setperek(TehilimEpisode.java:25)
    at main.main(main.java:48)

3 个答案:

答案 0 :(得分:1)

你必须用单个字符串读取整个txt然后用“$”拆分它。这是我使用分隔符\\z的例子,它用单个字符串读取整个文件,然后我分割字符串“$”。在下面的示例中,我们以单行阅读整本书,然后将其分为“$”剧集,如您在剧集结尾处添加的那样。

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class FileReadingWithScanner {

  public static void main(String[] args) throws IOException {
    File file = new File("D:\\book.txt");
    String book = "";
    Scanner sc = new Scanner(file);
    /* Using this delimiter you will be able to read whole file in single line. */
    sc.useDelimiter("\\Z");
    book = sc.next();
    String[] episodeArr = book.split("$");
    //Do whatever you want.
  }
}

<强>更新

String.split()接受正则表达式作为参数,$是Java正则表达式API中的元字符。因此,你需要逃避它: 使用此book.split("\\$");

答案 1 :(得分:0)

将你的for循环改为下面,这里我将scanner.nextLine()方法改为nextLine String。

while ((nextLine = inputReader.readLine()) != null)
    {   
    for(int i=1; i<=150;i++)
    {
        ab = nextLine.split("$");
        pirkoni[i] = new TehilimEpisode(i, ab);
    }

}

您的代码中不需要扫描类,您已经有BufferedReader来读取文件。两者都是多余的。

toString()方法覆盖

在您的课程中添加类似以下方法的内容。

 @Override
    public String toString() {
        return String.format(EpisodeID + " & " +  Arrays.toString(Perek));
    }

答案 2 :(得分:0)

问题是由ab = scanner.nextLine().split("$"); pirkoni[i] = new TehilimEpisode(i, ab);造成的。想象一下,没有下一行。它将尝试使用ab = null创建TehilimEpisode对象。要解决此问题,您应该检查下一行是否有for(int i=1; i<=150 && scanner.hasNextLine() ;i++)。选择作为答案,如果它工作! :d