Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:暂停线程并获取文件中的位置_Java_Multithreading_File_Bufferedreader - Fatal编程技术网

Java:暂停线程并获取文件中的位置

Java:暂停线程并获取文件中的位置,java,multithreading,file,bufferedreader,Java,Multithreading,File,Bufferedreader,我正在用Java编写一个带有多线程的应用程序,我想暂停并继续。 线程正在逐行读取文件,同时查找与模式匹配的行。它必须在我暂停线程的地方继续。要读取该文件,我将BufferedReader与InputStreamReader和FileInputStream结合使用 fip = new FileInputStream(new File(*file*)); fileBuffer = new BufferedReader(new InputStreamReader(fip)); 我使用此FileInp

我正在用Java编写一个带有多线程的应用程序,我想暂停并继续。
线程正在逐行读取文件,同时查找与模式匹配的行。它必须在我暂停线程的地方继续。要读取该文件,我将BufferedReader与InputStreamReader和FileInputStream结合使用

fip = new FileInputStream(new File(*file*));
fileBuffer = new BufferedReader(new InputStreamReader(fip));
我使用此FileInputStream是因为我需要文件中位置的文件指针。
在处理这些行时,它会将匹配的行写入MySQL数据库。为了在线程之间使用MySQL连接,我使用ConnectionPool来确保只有一个线程在使用一个连接

问题是当我暂停线程并恢复它们时,一些匹配的行就消失了。我还尝试从偏移量中减去buffersize,但它仍然存在相同的问题

解决这个问题的好方法是什么?我做错了什么

更多详情:

环路

    // Regex engine
    RunAutomaton ra = new RunAutomaton(this.conf.getAuto(), true);
    lw = new LogWriter();

        while((line=fileBuffer.readLine()) != null) {
            if(line.length()>0) {
                if(ra.run(line)) {
                        // Write to LogWriter
                        lw.write(line, this.file.getName());
                        lw.execute();
                    }
                }
            }
            // Loop when paused.
            while(pause) { }
        }
计算文件中的位置

// Get the position in the file
public long getFilePosition() throws IOException {
    long position = fip.getChannel().position() - bufferSize + fileBuffer.getNextChar();
    return position;
}
将其放入数据库

            // Get the connector
            ConnectionPoolManager cpl = ConnectionPoolManager.getManager();
            Connector con = null;
            while(con == null)
                con = cpl.getConnectionFromPool();
            // Insert the query
            con.executeUpdate(this.sql.toString());
            cpl.returnConnectionToPool(con);

这是一个我相信你在寻找的例子。您没有显示太多的实现,因此很难调试可能导致您出现差距的原因。请注意,
FileInputStream
的位置将是8192的倍数,因为
BufferedReader
正在使用该大小的缓冲区。如果您想使用多个线程来读取同一个文件,您可能会发现这很有用


这是一个我相信你在寻找的例子。您没有显示太多的实现,因此很难调试可能导致您出现差距的原因。请注意,
FileInputStream
的位置将是8192的倍数,因为
BufferedReader
正在使用该大小的缓冲区。如果您想使用多个线程来读取同一个文件,您可能会发现这很有用


我认为问题的根源在于不应该减去
bufferSize
。相反,您应该减去缓冲区中未读字符的数量。我认为没有办法做到这一点

我能想到的最简单的解决方案是创建FilterReader的自定义子类,该子类跟踪读取的字符数。然后按如下方式堆叠流:

FileReader 
< BufferedReader 
< custom filter reader
< BufferedReader(sz == 1)
文件阅读器
最后一个
BufferedReader
在那里,这样您就可以使用readLine。。。但是您需要将缓冲区大小设置为1,以便过滤器中的字符计数与应用程序达到的位置相匹配


或者,您可以在自定义筛选器读取器中实现自己的
readLine()
方法。

我认为问题的根源在于不应该减去
bufferSize
。相反,您应该减去缓冲区中未读字符的数量。我认为没有办法做到这一点

我能想到的最简单的解决方案是创建FilterReader的自定义子类,该子类跟踪读取的字符数。然后按如下方式堆叠流:

FileReader 
< BufferedReader 
< custom filter reader
< BufferedReader(sz == 1)
文件阅读器
最后一个
BufferedReader
在那里,这样您就可以使用readLine。。。但是您需要将缓冲区大小设置为1,以便过滤器中的字符计数与应用程序达到的位置相匹配


或者,您可以在自定义筛选器读取器中实现自己的
readLine()
方法。

经过几天的搜索,我发现确实减去缓冲区大小并在缓冲区中添加位置不是正确的方法。这个职位从来都不对,我总是漏掉几行。
在寻找新的工作方式时,我没有计算字符数,因为它太多了,无法计算,这将大大降低我的性能。但我发现了别的东西。软件工程师MarkS.Kolich创建了一个使用ApacheIO库跳转到给定行的程序。它还可以提供它读取的最后一行,所以这才是我真正需要的。

他的主页上有一些例子供感兴趣的人参考。

经过几天的搜索,我发现确实减去缓冲区大小并在缓冲区中添加位置不是正确的方法。这个职位从来都不对,我总是漏掉几行。
在寻找新的工作方式时,我没有计算字符数,因为它太多了,无法计算,这将大大降低我的性能。但我发现了别的东西。软件工程师MarkS.Kolich创建了一个使用ApacheIO库跳转到给定行的程序。它还可以提供它读取的最后一行,所以这才是我真正需要的。

他的主页上有一些例子供感兴趣的人参考。

我认为它是8192的倍数,所以我制作了一个BufferedReader的扩展版本,可以读取变量nextChar,所以我从文件指针中减去8192,并将nextChar的值添加到其中。这个例子就是我目前所拥有的,它对我来说不起作用。我认为它是8192的倍数,所以这就是为什么我制作了一个BufferedReader的扩展版本,在这里我可以读取变量nextChar,所以我从文件指针中减去8192,然后将nextChar的值添加到它。这个例子就是我目前所拥有的,它对我来说不起作用。就像我在以前的文章中所说的。我减去bufferSize,然后添加在缓冲区中读取的字符。这样,您只减去缓冲区中未读字符的数量。在标准BufferedReader中没有办法得到这个值,但我扩展了标准BufferedReader,以获得已经读取的字符数。@Yoni-也许问题是字符数与字节数的对比。我认为你不应该深入到文件频道去尝试找出这个位置。数一数