从Java运行AWK创建文件并使用BufferedReader读取
我试图从另一个将被排序的纯文本文件创建一个CSV文件,然后我试图用BufferedReader读取它。问题是它是同时运行还是先执行AWK部分,然后读取 AWK文件创建部分:从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 >> " +
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的目的是什么?