Правильный способ поместить строку в список в java | groovy - PullRequest
0 голосов
/ 03 октября 2011

У меня есть код, который выполняет команду в окне Linux (ls - latr /home/ars | awk '{if(NR>1)print}'), которая дает мне список каталогов вместе с его информацией.Как поместить его в какой-либо массив или список, чтобы в зависимости от каждой строки я мог получить имя файла, разрешения и т. Д. из (списка или массива) !!

Вот мой код, который печатаетвывод в нижней части моего вопроса здесь cmd=ls - latr /home/ars | awk '{if(NR>1)print}'

вызов функции

HashMap<String,String> params = IntermediateResults.get("userparams")
    Map env=AppContext.get(AppCtxProperties.environmentVariables)
    def fClass = new GroovyClassLoader().parseClass( new File( 'plugins/infa9/Infa9CommandExecUtil.groovy' ) )
    String cmd="ls -latr "+rrs.get("linkpath")+" | awk '{if(NR>1)print}'"
    String res=fClass.newInstance().fetchInformation( params, env, cmd )

моя функция называется

public String fetchInformation( Map<String,String> params, Map env, String cmd ) 
{
try
{
    Process proc = Runtime.getRuntime().exec(cmd);
    InputStream stdin = proc.getInputStream();
    InputStreamReader isr = new InputStreamReader(stdin);
    BufferedReader br = new BufferedReader(isr);
    String line = null;
    while ((line = br.readLine()) != null)
    {
        result.append(line);
        println "$line" // This output is given at the end
    }
    int exitVal = proc.waitFor();

} 
catch (IOException io) 
{
    io.printStackTrace();
}
catch (InterruptedException ie) 
{
    ie.printStackTrace();
}
//println("\n\n"+result)
return  result
 }

мой вывод

/data/u01/app/oracle/10.2.0/db_1:
total 260
-rwxr-xr-x  1 oracle dba     0 Jun  7  2005 root.sh.old
drwxr-xr-x  4 oracle dba  4096 Jan 17  2007 xdk
drwxr-xr-x  4 oracle dba  4096 Jan 17  2007 uix
drwxr-xr-x  3 oracle dba  4096 Jan 17  2007 tg4tera
drwxr-xr-x  3 oracle dba  4096 Jan 17  2007 tg4sybs
drwxr-xr-x  3 oracle dba  4096 Jan 17  2007 tg4ingr
drwxr-xr-x  3 oracle dba  4096 Jan 17  2007 tg4ifmx

Так как я могу поместить вышеприведенный вывод в некоторый Список, чтобы в каждой строке я мог получить разрешения, жесткую ссылку, владельца, группу, размер файла, месяц, дату, время, год и, наконец, имя файла ?

Обновление

Это то, что я пытаюсь сделать, есть ли лучший способ, используя карты?

 List<List<String>> frows = new ArrayList<List<String>>()
    while ((line = br.readLine()) != null)
    {
        List<String> fileList= new ArrayList<String>()
        result.append(line);
        String[] strs = line.split(" ")
        for(item in strs)
        {
            //print "$item "
            fileList.add(item)

        }

        frows.add(fileList)
    }

    for (List<String> l : frows) 
    {
      for (String s : l) {
        print "$s"
      }
      println ""
    }

Ответы [ 3 ]

4 голосов
/ 03 октября 2011

Вы не должны использовать системно-зависимую команду ls и анализировать вывод, подверженный ошибкам. Рассмотрим имя файла "foo \ n drwxr-xr-x 4 oracle dba 4096 17 января 2007 uix ", например.

Используйте вместо этого java.io.File, прочитайте каталог, получите объекты File с именами, атрибутами времени.

Вы используете такой список:

List <File> result = new List<File> ();

    // and in the loop:
    result.add (file);
2 голосов
/ 03 октября 2011

Создайте класс скажем FileDetail с разрешениями свойств, жесткой ссылкой, владельцем, группой, размером файла, месяцем, датой, временем, годом и именем файла.Внутри вашего метода

List<FileDetail> fileDetails = new ArrayList<FileDetail>();
while ((line = br.readLine()) != null)
    {            
        FileDetail file = new FileDetail();
        println "$line" // This output is given at the end
        // parse - use space delimiter and String.split() API
        String[] strs = line.split(" ");
        // set values to "file"
        // add to list
        fileDetails .add(file);
    }
 return fileDetails;

Используя карту,

    List<Map<String, String>> files = new ArrayList<Map<String, String>>()
    while ((line = br.readLine()) != null) {
            Map<String, String> file = new Map<String, String>()       
            String[] strs = line.split(" ")        
            // Find the order of fields, but it is system dependent, may not work in futrue           
            file.add("PERMISSIONS", strs[0]); // and so on for next and you may need to trim map value 
            files.add(file);
            println "$line"
    } 
return files;
1 голос
/ 03 октября 2011

Альтернативой может быть использование JNA для доступа к нативному вызову stat для вашей платформы ...

Это работает для меня в OS X. Я сохранил его как stattest.groovy, и при выполненииgroovy stattest.groovy, распечатывает детали о себе:

@Grab( 'net.java.dev.jna:jna:3.3.0')
@Grab( 'org.jruby.ext.posix:jna-posix:1.0.3' )
import org.jruby.ext.posix.*

File f = new File( 'stattest.groovy' )
POSIX posix = POSIXFactory.getPOSIX( [ isVerbose:{ false } ] as POSIXHandler , true)
FileStat s = posix.stat( f.absolutePath )

s.properties.each { name, val ->
  println "$name: $val"
}

[ 'atime', 'blocks', 'blockSize', 'ctime', 'dev', 'gid', 'ino', 'mode', 'mtime', 'nlink', 'rdev', 'st_size', 'uid' ].each {
  println "$it() -> ${s."$it"()}"
}

распечатывает:

13:23:46 [tyates@mac] JNA $ groovy stattest.groovy 
symlink: false
file: true
setuid: false
byteBuffer: java.nio.HeapByteBuffer[pos=0 lim=120 cap=120]
executableReal: false
structSize: 120
namedPipe: false
empty: false
blockDev: false
executable: false
fifo: false
class: class org.jruby.ext.posix.MacOSHeapFileStat
setgid: false
sticky: false
charDev: false
owned: true
directory: false
ROwned: true
readableReal: true
writableReal: true
readable: true
writable: true
groupOwned: false
socket: false
atime() -> 1317644640
blocks() -> 8
blockSize() -> 4096
ctime() -> 1317644636
dev() -> 234881026
gid() -> 1255
ino() -> 62213399
mode() -> 33204
mtime() -> 1317644636
nlink() -> 1
rdev() -> 0
st_size() -> 527
uid() -> 1114
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...