标签: pipe

为什么没有更多的Java代码使用PipedInputStream/PipedOutputStream?

我最近发现了这个成语,我想知道是否有我遗失的东西.我从来没有见过它.我在野外工作的几乎所有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,PipedInputStreamPipedOutputStream).

那么,这个成语有什么问题?如果这个成语没有错,为什么我没有看到它?

编辑:澄清PipedInputStream …

java concurrency design-patterns pipe

49
推荐指数
3
解决办法
4万
查看次数

在bash中连接两个没有换行符的命令的输出

我需要的:

假设我有两个命令,A并且B每个命令返回一个单行字符串(即一个没有换行符的字符串,除了最后可能为1).我需要一个命令(或管道命令序列)C,它连接命令的输出AB在同一行上,并在它们之间插入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)

bash sed pipe concatenation

48
推荐指数
4
解决办法
6万
查看次数

将系统命令的输出分配给变量

我想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.

awk pipe

47
推荐指数
5
解决办法
8万
查看次数

管道缓冲区大小是4k还是64k?

我在多个地方读到管道的默认缓冲区大小是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)

c linux size buffer pipe

47
推荐指数
2
解决办法
5万
查看次数

从STDIN逐行阅读

我想做这样的事情:

$ [mysql query that produces many lines] | php parse_STDIN.php
Run Code Online (Sandbox Code Playgroud)

parse_STDIN.php文件中我希望能够从stdin逐行解析我的数据.

php stdin pipe

47
推荐指数
2
解决办法
6万
查看次数

如何允许html返回angular2管道?

我有一个管道返回一个html字符串,但字符串输出转发可能是安全的默认值.我确定必须有一个选项允许html而不能在我搜索文档时找到它.

如何告诉管道允许实际的html渲染?

pipe angular

46
推荐指数
3
解决办法
4万
查看次数

如何从linux程序逐行输入到python的输入?

我想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)

python pipe

45
推荐指数
2
解决办法
7万
查看次数

Linux为什么我不能管道找到rm的结果?

对不起,如果这是一个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和命令行之间有区别.救命!

linux bash rm pipe find

45
推荐指数
4
解决办法
3万
查看次数

LAMP:如何为用户动态创建.Zip大型文件,无需磁盘/ CPU抖动

通常,Web服务需要压缩几个大文件以供客户端下载.最明显的方法是创建一个临时zip文件,然后将echo其创建给用户或将其保存到磁盘并重定向(将来某个时间删除它).

但是,这样做有缺点:

  • 密集的CPU和磁盘颠簸的初始阶段,导致......
  • 准备好存档时,用户会有相当大的初始延迟
  • 每个请求的内存占用非常高
  • 使用大量临时磁盘空间
  • 如果用户取消下载中途,初始阶段(CPU,内存,磁盘)中使用的所有资源都将被浪费

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堆栈上实现这一目标?

php bash lamp zip pipe

43
推荐指数
1
解决办法
3万
查看次数

使用find和grep删除文件列表

我想删除所有包含特定单词名称的文件,例如"car".到目前为止,我想出了这个:

find|grep car
Run Code Online (Sandbox Code Playgroud)

如何将输出传递给rm?

grep rm pipe find

43
推荐指数
5
解决办法
6万
查看次数

标签 统计

pipe ×10

bash ×3

find ×2

linux ×2

php ×2

rm ×2

angular ×1

awk ×1

buffer ×1

c ×1

concatenation ×1

concurrency ×1

design-patterns ×1

grep ×1

java ×1

lamp ×1

python ×1

sed ×1

size ×1

stdin ×1

zip ×1