Java:文件中未经处理的行数

Java:文件中未经处理的行数,java,Java,在处理文件之前,我需要知道文件的行数,因为在读取文件之前,我需要知道文件的行数,或者在最坏的情况下,escenario将文件读取两次。。。。。所以我做了这个代码,但它不起作用。。所以也许这是不可能的 InputStream inputStream2 = getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(getInputStream())); String line; int n

在处理文件之前,我需要知道文件的行数,因为在读取文件之前,我需要知道文件的行数,或者在最坏的情况下,escenario将文件读取两次。。。。。所以我做了这个代码,但它不起作用。。所以也许这是不可能的

InputStream inputStream2 = getInputStream();

BufferedReader reader = new BufferedReader(new InputStreamReader(getInputStream()));

String line;
int numLines = 0;
while ((line = reader.readLine()) != null) {
        numLines++;
}

TextFileDataCollection dataCollection = new TextFileDataCollection (numLines, 50);

BufferedReader reader2 = new BufferedReader(new InputStreamReader(inputStream2));

while ((line = reader2.readLine()) != null) {
        StringTokenizer st = new StringTokenizer(reader2.readLine(), ",");
        while (st.hasMoreElements()) {
            System.out.println(st.nextElement());
        }
}

java代码也有一个类似的问题,尽管它有点旧:

编辑:

这里有一个与inputstreams相关的参考:

除非您提前知道行数,否则不循环是不可能的。您必须完整地阅读该文件才能知道其中有多少行,InputStream和CsvMapper都没有一种方法可以提前阅读并抽象出它们对您来说都是面向流的接口

ObjectReader可以操作的接口都不支持查询底层文件大小(如果是文件或到目前为止读取的字节数)

一种可能的选择是创建您自己的自定义InputStream,它还提供获取到目前为止读取的总大小和字节数的方法,例如,如果它正在从文件读取,它可以公开基础file.length,还可以跟踪读取的字节数。这可能并不完全准确,特别是如果Jackson的缓冲区遥遥领先的话,但它至少可以给你带来一些东西

在处理文件之前,我需要知道文件的行数

但是您的代码中没有任何文件;相反,您只提供一个InputStream。这会产生不同,因为事实上,如果不检查输入以计数,就无法知道输入中的行数

如果您有一个文件名、文件对象或类似的机制,通过该机制可以多次访问数据,那么这将是很简单的,但流不能保证与任何持久性文件相关联——例如,它可能会传输从另一个进程通过管道传输的数据或通过网络连接进行通信的数据。因此,通用InputStream提供的每个字节只能读取一次

InputStream确实提供了一个API,用于标记一个位置,然后返回到重置位置,但流实现不需要支持它,而且很多实现都不需要。那些确实支持该标记的人通常会在标记失效之前对超过标记的距离施加限制。读者也支持这种功能,但也有类似的限制


总的来说,如果您对数据的唯一访问是通过InputStream,那么您最好的选择是在不依赖预先了解内容的情况下对其进行处理。但是,如果您希望能够读取数据两次,例如,首先计算行数,那么您需要自行安排将数据存储在某个位置,以确保您能够这样做。例如,您可以将其复制到一个临时文件中,或者如果您准备依赖的输入不太大,那么您可以将内容存储在内存中,作为字节、字节[]、字符或字符串的列表。

这是绝对可能的,并且有很多示例对其进行了详细说明。可能是重复的井不,@Harry,不处理文件就不可能知道文件中的行数。您需要检查文件的内容以计算行数,这是一种处理形式。您使用相同的InputStream两次-在第一个循环之后,它位于文件的末尾,因此第二个循环将不会读取任何内容。您需要为第二个循环打开一个新的InputStream。在第一次循环之后,你需要关闭旧的。如果你不想两次迭代这个文件,你可以考虑重新设计TrimFieldAtCatCoupse,这样它就不需要知道数据集的大小。有人指出这个问题是关于输入流而不是文件。不幸的是,这意味着这个特定的解决方案可能无法奏效。
public static int countLines(String filename) throws IOException {
    InputStream is = new BufferedInputStream(new FileInputStream(filename));
    try {
        byte[] c = new byte[1024];
        int count = 0;
        int readChars = 0;
        boolean empty = true;
        while ((readChars = is.read(c)) != -1) {
            empty = false;
            for (int i = 0; i < readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
        }
        return (count == 0 && !empty) ? 1 : count;
    } finally {
        is.close();
    }
}