嘿,请不要介意我是否在问一些微不足道的问题,但是,请有人帮我这个......
答案 0 :(得分:31)
分为两部分:
pread
/ pwrite
与read
/ write
之间的差异:
它们都处于同一级别,即系统调用。有两点不同:
read
/ pread
/ write
/ pwrite
和fread
/ fwrite
之间的差异:
“f”变体是前者的标准运行时包装器(使用基本变体)。它们支持进程内缓冲。这可以显着提高简单代码的性能,但它会利用系统调用级别的其他功能,这是不切实际的。
如果您可以很好地使用随机偏移量读取(避免搜索并允许通过一个文件句柄进行并发访问),则只使用“p”变体,这通常是某种数据库文件的情况(以记录为导向)已知偏移量,很少在其他应用中使用。
答案 1 :(得分:15)
当您进行大量随机读/写操作时,它非常有用。 SQLite3甚至还有一个选项,用seek()
替换read()
+ seek()
和write()
+ pread()/pwrite()
。
优势:seek()
+ read()
和seek()
+ write()
两者都是系统调用对,而pread()
和pwrite()
是单一的系统调用。这通常是一个普遍的事实,即较少的系统调用程序问题就越有效。
答案 2 :(得分:5)
调用 String pattern;
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m;
Pattern number = Pattern.compile("\\d+");
Matcher num;
m = p.matcher(s);
num = number.matcher(s);
if(m.find()){
System.out.println(m.group(1));
}
if(num.find()){
System.out.println(num.group(0));
}
/ pread
后,当前文件位置无法更改。
另外,因为您不需要致电pwrite
来更改当前文件位置lseek
/ pread
,以避免涉及多个线程时的潜在竞争条件。