0

我正在尝试从另一个将被排序的纯文本文件创建一个 CSV 文件,然后我尝试使用 BufferedReader 读取它。问题是它是同时运行还是先执行 AWK 部分然后读取..

AWK 文件创建部分:

String uniqueSubscribersCommand = "cat " + originalFile +
                " | awk '$1~/^[0-9]*$/ {print $0}' | sort -k 1 | awk '{print $1}' | uniq >> " +
                uniqueFile;
try
{
    Runtime.getRuntime().exec( new String[]{"/bin/sh", "-c", uniqueSubscribersCommand} );
}
catch ( IOException e )
{
     logger.error( "Error during unique subscriber determination" );
}

阅读部分,就在创作部分之后:

FileInputStream uniqueFis = new FileInputStream( uniqueFile );
BufferedReader brUnique = new BufferedReader( new InputStreamReader( uniqueFis ) );
while ( ( subscriberId = brUnique.readLine() ) != null )
            {
                // do stuff
            }

我特别想知道如果我在运行 AWK 命令后立即让线程进入睡眠状态,那么 Java 是否可以在创建文件时读取文件,因此它会在创建和读取之间产生 10 秒的间隙。

谢谢你的建议!

4

1 回答 1

1

试试下面的 - 只是一个粗略的想法如何做到这一点。我实际上并没有特别注意关闭未关闭的流等。但请确保您这样做。并且可能您可以使用随机访问文件中的缓冲区更有效地读取,我也没有处理过。对此感到抱歉。

注意:以下示例只是一个SSCCP类型的示例,用于测试读取可以从外部更改的文件并在控制台中获取更新。如果它有效,或者您认为值得,您可能可以根据您提到的用例改进它,一个线程写入文件,另一个线程读取。

        import java.io.IOException;
        import java.io.RandomAccessFile;
        import java.nio.channels.FileChannel;

        public class ReadFromFile {

            /**
             * @param args
             * @throws IOException
             */
            public static void main(String[] args) throws IOException {

                Runnable runnable = new Runnable() {

                    //it's your choice how will you close the channel
                    FileChannel in = null;

                    @Override
                    public void run() {
                        long lastChannelPos = 0L;
                        try {
                            /*
                             *I assume you will run it forever
                             *if you don't want to run it forever
                             *put a condition over here in the while loop.
                            */
                            while (true) {
                                RandomAccessFile raf = new RandomAccessFile(
                                        "your_file_loc", "r");
                                raf.seek(lastChannelPos);
                                int c = 0;
                                StringBuffer sb = new StringBuffer();
                                while ((c = raf.read()) != -1) {
                                    sb.append((char) c);
                                }
                                in = raf.getChannel();
                                lastChannelPos = in.position();

                                if (!sb.toString().trim().isEmpty()) {
                                    //you can print or use the output as you wish
                                    //for simplicity I'm printing it 
                                    System.out.print(sb.toString().trim());
                                }
                                Thread.sleep(1000);
                                raf.close();
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                };

                Thread th = new Thread(runnable);
                th.start();             
}

希望这可以帮助。

于 2013-07-19T13:23:19.260 回答