我最近发现了这个成语,我想知道是否有我遗失的东西.我从来没有见过它.我在野外工作的几乎所有Java代码都倾向于将数据压入字符串或缓冲区,而不是像这个例子(例如使用HttpClient和XML API):
final LSOutput output; // XML stuff initialized elsewhere
final LSSerializer serializer;
final Document doc;
// ...
PostMethod post; // HttpClient post request
final PipedOutputStream source = new PipedOutputStream();
PipedInputStream sink = new PipedInputStream(source);
// ...
executor.execute(new Runnable() {
public void run() {
output.setByteStream(source);
serializer.write(doc, output);
try {
source.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}});
post.setRequestEntity(new InputStreamRequestEntity(sink));
int status = httpClient.executeMethod(post);
Run Code Online (Sandbox Code Playgroud)
该代码使用Unix管道样式技术来防止XML数据的多个副本保留在内存中.它使用HTTP Post输出流和DOM Load/Save API将XML Document序列化为HTTP请求的内容.至于我可以告诉它最大限度地减少用很少的额外代码使用的内存(只是几行了Runnable,PipedInputStream和PipedOutputStream).
那么,这个成语有什么问题?如果这个成语没有错,为什么我没有看到它?
编辑:澄清PipedInputStream …
我需要的:
假设我有两个命令,A并且B每个命令返回一个单行字符串(即一个没有换行符的字符串,除了最后可能为1).我需要一个命令(或管道命令序列)C,它连接命令的输出A并B在同一行上,并在它们之间插入1个空格字符.
它应该如何工作的示例:
例如,假设命令的输出A是引号之间的字符串:
"The quick"
Run Code Online (Sandbox Code Playgroud)
并且假设命令的输出B是引号之间的字符串:
"brown fox"
Run Code Online (Sandbox Code Playgroud)
然后我希望命令的输出是引号之间的C字符串:
"The quick brown fox"
Run Code Online (Sandbox Code Playgroud)
我最好的尝试解决方案
在试图弄清楚C自己,似乎管道命令的后续序列应该工作:
{ echo "The quick" ; echo "brown fox" ; } | xargs -I{} echo {} | sed 's/\n//'
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个命令的输出是
The quick
brown fox
Run Code Online (Sandbox Code Playgroud) 我想system在awk脚本中运行该命令并将其输出存储在变量中.我一直试图这样做,但命令的输出总是进入shell而我无法捕获它.关于如何做到这一点的任何想法?
例:
$ date | awk --field-separator=! {$1 = system("strip $1"); /*more processing*/}
Run Code Online (Sandbox Code Playgroud)
应该调用strip系统命令而不是将输出发送到shell,应该将输出分配回来$1进行更多处理.现在是Rignt,它将输出发送到shell并将命令的retcode分配给$1.
我在多个地方读到管道的默认缓冲区大小是4kB(例如,这里),我ulimit -a倾向于确认该语句:
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15923
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8 // 8 * 512B = 4kB
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, …Run Code Online (Sandbox Code Playgroud) 我想做这样的事情:
$ [mysql query that produces many lines] | php parse_STDIN.php
Run Code Online (Sandbox Code Playgroud)
在parse_STDIN.php文件中我希望能够从stdin逐行解析我的数据.
我有一个管道返回一个html字符串,但字符串输出转发可能是安全的默认值.我确定必须有一个选项允许html而不能在我搜索文档时找到它.
如何告诉管道允许实际的html渲染?
我想ps -ef逐行管道输出到python.
我使用的脚本是这个(first.py) -
#! /usr/bin/python
import sys
for line in sys.argv:
print line
Run Code Online (Sandbox Code Playgroud)
不幸的是,"行"被分成由空格分隔的单词.所以,例如,如果我这样做
echo "days go by and still" | xargs first.py
Run Code Online (Sandbox Code Playgroud)
我得到的输出是
./first.py
days
go
by
and
still
Run Code Online (Sandbox Code Playgroud)
如何编写输出的脚本
./first.py
days go by and still
Run Code Online (Sandbox Code Playgroud)
?
对不起,如果这是一个noobie问题,但我找不到一个好的答案.
要查找然后删除我可以使用的东西
find . -name ".txt" -exec rm "{}" \;
Run Code Online (Sandbox Code Playgroud)
但为什么我不能把结果管道化为rm
find . -name ".txt" | rm
Run Code Online (Sandbox Code Playgroud)
就像我会把它吹到grep一样
find . -name ".txt" | grep a
Run Code Online (Sandbox Code Playgroud)
我从某个地方读过rm不接受来自stdin的输入,因此我无法管道但是这意味着什么?当我输入rm a.txt时,它会从标准输入中读取,就像我可以直接读取一样吗?或者stdin和命令行之间有区别.救命!
通常,Web服务需要压缩几个大文件以供客户端下载.最明显的方法是创建一个临时zip文件,然后将echo其创建给用户或将其保存到磁盘并重定向(将来某个时间删除它).
但是,这样做有缺点:
像ZipStream-PHP这样的解决方案通过将数据按文件铲入Apache文件来改进这一点.但是,结果仍然是高内存使用率(文件完全加载到内存中),以及磁盘和CPU使用率的大幅飙升.
相反,请考虑以下bash片段:
ls -1 | zip -@ - | cat > file.zip
# Note -@ is not supported on MacOS
Run Code Online (Sandbox Code Playgroud)
这里,zip以流模式运行,导致内存占用量低.管道具有整数缓冲区 - 当缓冲区已满时,OS会暂停写入程序(管道左侧的程序).这样可确保zip其输出速度与输出速度一样快cat.
然后,最佳方式是执行相同的操作:cat使用Web服务器进程替换,将zip文件流式传输给用户,并将其动态创建.与仅流式传输文件相比,这将产生很少的开销,并且将具有无问题的,非尖峰的资源配置文件.
如何在LAMP堆栈上实现这一目标?
我想删除所有包含特定单词名称的文件,例如"car".到目前为止,我想出了这个:
find|grep car
Run Code Online (Sandbox Code Playgroud)
如何将输出传递给rm?