Yalnızca java programına argümanlar sağlamak ve stdin yerine koymak için java ve xargs (?) Kullanın.


0

Komut satırından argümanları alan ve daha sonra etkileşimli olması gereken küçük bir java programım var.

Büyük girişle test etmek istediğimde, bir dosyanın içeriğini programa giriş argümanları olarak kullanmak için JVM'ye yönlendirmek istiyorum ancak stdin'i dosya içeriğiyle değiştirmek istemiyorum.

Bu yüzden denedim

daha az dosya | xargs -0 java -cp ... benim paketim.ClassName

ancak bu dosya içeriğiyle stdin'in yerini alır. Sanırım BufferedReader.readLine () programını kullanan programın etkileşimli kısmı, bunun yerine dosyadan içeri alır.

Önce dosyanın içeriğini JVM'ye aktarıp sonra StdIn'e geri dönebilmemin bir yolu var mı?

Ubunthu'yu çalıştırıyorum

Kod örneği:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String cmd;
while(true) {
    try {
    System.out.print(">");
    cmd = br.readLine(); //becomes null if I start the program as above

Ps. Java programının dosyaları ile çalışması için daha iyi olurdu, ancak bunun mümkün olup olmadığını bilmek istiyorum Ds.


Bu bana mantıklı gelmiyor. Ister misiniz java -cp … --other-argument <contents-of-a-file> --another-argument mypackage.ClassName? Yani bu argüman için komut satırını ayrıştırabilirsiniz? Belki bize Java programınızdan minimal bir kod örneği vermelisiniz? Ne yapmak gerçekten ulaşmak gerekir - yani bu dosyada ne ve neden sadece program dosya yolunu verip bu dosyayı açalım mı?
slhck

@slhck Örneğin java -cp ... yerine myclass "Argument0 Arugment1" Yapmak istiyorum: java myclass <dosyanın içeriği>. Bundan sonra programın çalışmasını ve
java'da stdin'in

Komut satırında değerlendirilen bir dosyanın içeriğini şöyle yapabilirsiniz: java myclass "$(<some-file.txt)"- ama bu gerçekten kötü bir hack ve Java programını değiştirerek dosya adını argüman olarak almalısınız.
slhck

Yanıtlar:


0

İlk olarak, azarlama: Kabuk komut dosyası programlamanın bilinen kurallarından biri (ve hatta etkileşimli kabuk kullanımı) kullanılmaz

cat some_file | some_command

çok iyi bir nedeniniz olmadığı sürece. Oh, elbette, işe yarıyor, ama verimsiz ve kötü bir tarza sahip. Ve tabi ki

cat some_file

terminalde bir dosyayı görüntülemek için en basit yoldur; bu iyi. Ve

cat seçenekler dosyası | some_command

ve

cat dosya 1 dosya 2 | some_command

İyi misin. Fakat

cat some_file | some_command

( catkomut satırında sadece bir dosya adı ile ) hemen hemen her zaman dönüştürülebilir

some_command some_file<

Ve umarım öyle demeden geçer,

cat some_file | some_command

kötüdür,

less some_file | some_command

muhtemelen daha kötüdür. Neden söylemiyorsun

xargs -0 java -cp ... mypackage.ClassName < dosya

? Ama bu senin problemini çözmez.


buna inanıyorum

Aradığınız cevap:

xargs –a dosya  -0 java -cp ... mypackage.ClassName

Bu (veya buna eşdeğer --arg-file = dosya ) anlatıyor xargsaçmak için dosyayı , standart olmayan girdi ve ondan okumak ve ona normalde stdin'nin bakacaklarını yol işleyebilmesi ancak yalnız orijinal standart girdi bırakın ve bunu yapmak yürütülen program için kullanılabilir. Uyarı: xargsBunu destekleyen tüm sürümler değil .

Bu arada, dosyanın içeriğinin bir komut satırına sığmayacak kadar büyük olmasını mı bekliyorsunuz , bu nedenle programınızın dosya altkümeleri ile argüman olarak birden çok kez çalıştırılması gerekecek mi?


Giriş olarak büyük dosyaları sağlamak için kullanmak istiyorum. Temelde kötü bir uygulama yaptım ancak daha sonra bu tür işlemleri nasıl kullanabileceğini (veya kötüye kullanacağını) biraz merak ettim.
user1443778

Merak ediyorum, eğer dosyanız çok büyükse, o zaman @ slhck'ın önerisi "$(<some-file.txt)"muhtemelen işe yaramazdı .
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.