从Java运行AWK创建文件并使用BufferedReader读取

从Java运行AWK创建文件并使用BufferedReader读取,java,awk,runtime,exec,bufferedreader,Java,Awk,Runtime,Exec,Bufferedreader,我试图从另一个将被排序的纯文本文件创建一个CSV文件,然后我试图用BufferedReader读取它。问题是它是同时运行还是先执行AWK部分,然后读取 AWK文件创建部分: String uniqueSubscribersCommand = "cat " + originalFile + " | awk '$1~/^[0-9]*$/ {print $0}' | sort -k 1 | awk '{print $1}' | uniq >> " +

我试图从另一个将被排序的纯文本文件创建一个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
            }
在创建部分之后的阅读部分:

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秒的间隔


谢谢你的建议

试试下面的方法-只是一个粗略的想法如何做到这一点。 实际上,我并没有特别注意关闭未关闭的溪流之类的东西。但一定要做到这一点。也许你可以使用一个随机访问文件的缓冲区来更有效地读取数据,我也没有注意到这一点。对不起

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

        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();             
}

希望这能有所帮助。

那么,你想创建一种类似于“频繁更新文件”的东西,同时使用Java进行读取吗?为什么不在Java中做你需要做的事情呢?@JtheRocker kinda。。文件很大,我想节省时间。。因此,它不应该等待整个文件的创建,而是开始以较小的延迟逐行读取文件。@sudo_O该文件非常庞大,使用AWK似乎更快、更简单,而且对内存的依赖性更小。。我可以用Java在两个线程中实现这一点,但我就是这样做的:D而且创建速度必须更快,或者与读取速度相同,这就是为什么使用更快的文件创建方法如此重要。那么,您使用Java的目的是什么?