GVKun编程网logo

使用Java中的JSch exec从ArrayList执行命令列表(java arraylist clear)

6

在本文中,我们将详细介绍使用Java中的JSchexec从ArrayList执行命令列表的各个方面,并为您提供关于javaarraylistclear的相关解答,同时,我们也将为您带来关于ArrayL

在本文中,我们将详细介绍使用Java中的JSch exec从ArrayList执行命令列表的各个方面,并为您提供关于java arraylist clear的相关解答,同时,我们也将为您带来关于ArrayList.toArray()中的Java泛型、ArrayList.toArray()中的Java泛型 - Java generics in ArrayList.toArray()、ArrayList中的java – toArray(T [])方法、Flex中ArrayCollection 与java中的ArrayList互转的有用知识。

本文目录一览:

使用Java中的JSch exec从ArrayList执行命令列表(java arraylist clear)

使用Java中的JSch exec从ArrayList执行命令列表(java arraylist clear)

使用JSch“
exec”通道,我连接到远程服务器并执行命令。我不能执行的是存储在中的命令列表ArrayList。我使用for循环将每个元素传递给,.setCommand(elem);但是出于某种奇怪的原因,只有最后一条命令被执行。

ArrayList<String> lists = new ArrayList<String>();
lists.add("hostname");
lists.add("df -l");
Channel channel=session.openChannel("exec");

for (String elem : lists){
    ((ChannelExec)channel).setCommand(elem);
}

完整代码

public class Exec{
  public static void main(String[] arg){
    try {
      JSch jsch=new JSch();

      String host=null;
      if(arg.length>0){
        host=arg[0];
      }
      else{
        host=JOptionPane.showInputDialog("Enter username@hostname",System.getProperty("user.name")+
                                         "@localhost"); 
      }
      String user=host.substring(0,host.indexOf('@'));
      host=host.substring(host.indexOf('@')+1);

      Session session=jsch.getSession(user,host,22);


      UserInfo ui=new MyUserInfo();
      session.setUserInfo(ui);
      session.connect();

      ArrayList<String> lists = new ArrayList<String>();
        lists.add("hostname");
        lists.add("df -l");
      Channel channel=session.openChannel("exec");

      for (String elem : lists){
          ((ChannelExec)channel).setCommand(elem);
      }

      channel.setInputStream(null);

      ((ChannelExec)channel).setErrStream(System.err);

      InputStream in=channel.getInputStream();

      channel.connect();

      byte[] tmp=new byte[1024];
      while(true){
        while(in.available()>0){
          int i=in.read(tmp,1024);
          if(i<0)break;
          System.out.print(new String(tmp,i));
        }
        if(channel.isClosed()){
          if(in.available()>0) continue; 
          System.out.println("exit-status: "+channel.getExitStatus());
          break;
        }
        try{Thread.sleep(1000);}catch(Exception ee){}
      }
      channel.disconnect();
      session.disconnect();
    }
    catch(Exception e){
      System.out.println(e);
    }
  }

  public static class MyUserInfo implements UserInfo,UIKeyboardInteractive{
    public String getPassword(){ return passwd; }
    public boolean promptYesNo(String str){
      Object[] options={ "yes","no" };
      int foo=JOptionPane.showOptionDialog(null,str,"Warning",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE,null,options,options[0]);
       return foo==0;
    }

    String passwd;
    JTextField passwordField=(JTextField)new JPasswordField(20);

    public String getPassphrase(){ return null; }
    public boolean promptPassphrase(String message){ return true; }
    public boolean promptPassword(String message){
      Object[] ob={passwordField}; 
      int result=
        JOptionPane.showConfirmDialog(null,ob,message,JOptionPane.OK_CANCEL_OPTION);
      if(result==JOptionPane.OK_OPTION){
        passwd=passwordField.getText();
        return true;
      }
      else{ 
        return false; 
      }
    }
    public void showMessage(String message){
      JOptionPane.showMessageDialog(null,message);
    }
    final GridBagConstraints gbc = 
      new GridBagConstraints(0,1,GridBagConstraints.NORTHWEST,GridBagConstraints.NONE,new Insets(0,0),0);
    private Container panel;
    public String[] promptKeyboardInteractive(String destination,String name,String instruction,String[] prompt,boolean[] echo){
      panel = new JPanel();
      panel.setLayout(new GridBagLayout());

      gbc.weightx = 1.0;
      gbc.gridwidth = GridBagConstraints.REMAINDER;
      gbc.gridx = 0;
      panel.add(new JLabel(instruction),gbc);
      gbc.gridy++;

      gbc.gridwidth = GridBagConstraints.RELATIVE;

      JTextField[] texts=new JTextField[prompt.length];
      for(int i=0; i<prompt.length; i++){
        gbc.fill = GridBagConstraints.NONE;
        gbc.gridx = 0;
        gbc.weightx = 1;
        panel.add(new JLabel(prompt[i]),gbc);

        gbc.gridx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weighty = 1;
        if(echo[i]){
          texts[i]=new JTextField(20);
        }
        else{
          texts[i]=new JPasswordField(20);
        }
        panel.add(texts[i],gbc);
        gbc.gridy++;
      }

      if(JOptionPane.showConfirmDialog(null,panel,destination+": "+name,JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE)
         ==JOptionPane.OK_OPTION){
        String[] response=new String[prompt.length];
        for(int i=0; i<prompt.length; i++){
          response[i]=texts[i].getText();
        }
        return response;
      }
      else{
        return null;  // cancel
      }
    }
  }
}

ArrayList.toArray()中的Java泛型

ArrayList.toArray()中的Java泛型

假设您有一个arraylist定义如下:

ArrayList<String> someData = new ArrayList<>();

稍后在代码中,由于泛型,您可以这样说:

String someLine = someData.get(0);

而且编译器完全知道它将得到一个字符串。是的仿制药!但是,这将失败:

String[] arrayOfData = someData.toArray();

toArray()将始终返回对象数组,而不是已定义的泛型数组。为什么该get(x)方法知道返回的内容,但toArray()默认为Objects?

答案1

小编典典

如果你看一下执行toArray(T[] a)的的ArrayList
类,它是这样的:

public <T> T[] toArray(T[] a) {    if (a.length < size)        // Make a new array of a''s runtime type, but my contents:        return (T[]) Arrays.copyOf(elementData, size, a.getClass());    System.arraycopy(elementData, 0, a, 0, size);    if (a.length > size)        a[size] = null;    return a;}

这种方法的问题是您需要传递相同泛型的数组。现在考虑如果此方法不带任何参数,则实现将类似于以下内容:

public <T> T[] toArray() {    T[] t = new T[size]; // compilation error    return Arrays.copyOf(elementData, size, t.getClass());}

但是这里的问题是, 您不能在Java中创建通用数组, 因为编译器不知道确切T代表什么。换句话说 在Java中不允许
创建非可校正类型的数组
(JLS§4.7)。


数组存储异常
(JLS§10.5)中的另一个重要报价:

如果数组的组件类型不可修改(第4.7节),则Java虚拟机将无法执行上一段所述的存储检查。
这就是为什么禁止使用不可修改元素类型的数组创建表达式的原因(第15.10.1节)。

这就是Java提供重载版本的原因toArray(T[]a)

我将重写toArray()方法以告诉它它将返回E数组。

因此toArray(),您应该使用而不是覆盖toArray(T[] a)

无法从Java
Doc
创建类型参数的实例可能对您也很有趣。

ArrayList.toArray()中的Java泛型 - Java generics in ArrayList.toArray()

ArrayList.toArray()中的Java泛型 - Java generics in ArrayList.toArray()

问题:

Say you have an arraylist defined as follows: 假设你有一个arraylist定义如下:

ArrayList<String> someData = new ArrayList<>();

Later on in your code, because of generics you can say this: 稍后在您的代码中,由于泛型,您可以这样说:

String someLine = someData.get(0);

And the compiler knows outright that it will be getting a string. 并且编译器完全知道它将获得一个字符串。 Yay generics! 是的仿制药! However, this will fail: 但是,这将失败:

String[] arrayOfData = someData.toArray();

toArray() will always return an array of Objects, not of the generic that was defined. toArray()将始终返回一个Object数组,而不是已定义的泛型数组。 Why does the get(x) method know what it is returning, but toArray() defaults to Objects? 为什么get(x)方法知道它返回什么,但toArray()默认为Objects?


解决方案:

参考: https://stackoom.com/en/question/2TZ3I

ArrayList中的java – toArray(T [])方法

ArrayList中的java – toArray(T [])方法

当我通过ArrayList实现时,我在toArray(T [])方法中发现了一段奇怪的代码.
public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type,but my contents:
            return (T[]) Arrays.copyOf(elementData,size,a.getClass());
        System.arraycopy(elementData,a,size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

这部分是,

if (a.length > size)
    a[size] = null;

为什么只有数组中此索引处的元素设置为null?一旦数组填充了列表的内容,其余索引处的元素应该设置为null,对吧?或者我在这里遗漏了什么?

解决方法

javadoc解释了原因:

If the list fits in the specified array with room to spare (i.e.,the array has more elements than the list),the element in the array immediately following the end of the list is set to null. (This is useful in determining the length of the list only if the caller kNows that the list does not contain any null elements.)

Flex中ArrayCollection 与java中的ArrayList互转

Flex中ArrayCollection 与java中的ArrayList互转

               FlexArrayCollection java中的ArrayList互转

 

这里说这是Flexremoting传一个ArrayCollection到后台(后台也用ArrayCollection接参)之后如何转成ArrayList.

(具体操作如将Flex页面的DataGrid中的若干内容添加到DataBase中)

 

public ArrayList convertArrayCollection(ArrayCollection array){

        ArrayList myObjectArray = new ArrayList();

        ASTranslator ast = new ASTranslator();

        ModuleVO myObject;

        ASObject aso;

 

        for (int i=0;i < array.size(); i++){

            myObject = new ModuleVO ();

            aso = new ASObject();

 

            aso = (ASObject) array.get(i);

            aso.setType("com.hospital.vo.ModuleVO");

            myObject = (ModuleVO) ast.convert(aso,ModuleVO.class);

            myObjectArray.add(myObject);

        }

        return myObjectArray;

    }

 

FlexVO

package vo

{

       [Bindable]

       public class ModuleVO

       {

              public var num:Number;

             

              public var MID:int;

              public var MCode:String;

              public var MCN:String;

              public var MEN:String;

              public var MState:int;

             

              public function fill(obj:Object):void{

                     for(var i:* in obj){

                            this[i]=obj[i];

                     }

              }

 

       }

}

 

JavaModuleVO

package com.hospital.vo;

 

public class ModuleVO {

       public Number num;

 

       public int MID;

       public String MCode;

       public String MCN;

       public String MEN;

       public int MState;

       public Number getNum() {

              return num;

       }

       public void setNum(Number num) {

              this.num = num;

       }

       public int getMID() {

              return MID;

       }

       public void setMID(int mid) {

              MID = mid;

       }

       public String getMCode() {

              return MCode;

       }

       public void setMCode(String code) {

              MCode = code;

       }

       public String getMCN() {

              return MCN;

       }

       public void setMCN(String mcn) {

              MCN = mcn;

       }

       public String getMEN() {

              return MEN;

       }

       public void setMEN(String men) {

              MEN = men;

       }

       public int getMState() {

              return MState;

       }

       public void setMState(int state) {

              MState = state;

       }

}

 

JavaconvertArrayCollection里面的数据:

       public boolean addMV( ArrayCollection ModuleList) {

                    

              ArrayList al = this.convertArrayCollection(ModuleList) ;

for(Iterator i = al.iterator(); i.hasNext();)    {  

            String MID = ((ModuleVO)i.next()).getMID()+""; 

            System.out.println(MID);

           

                     String sql = "insert into T_ModuleV (MVID,MID,MState) values " +

                                   "("+MVID+","+MID+","+MState+") ; ";

                     System.out.println(sql);

        }  

   }

 

       Flex端传过来的ArrayConllection转为Java端的ArrayList

       public ArrayList convertArrayCollection(ArrayCollection array){

        ArrayList myObjectArray = new ArrayList();

        ASTranslator ast = new ASTranslator();

        ModuleVO myObject;

        ASObject aso;

 

        for (int i=0;i < array.size(); i++){

            myObject = new ModuleVO();

            aso = new ASObject();

 

            aso = (ASObject) array.get(i);

            aso.setType("com.hospital.vo.ModuleVO");

            myObject = (ModuleVO) ast.convert(aso,ModuleVO.class);

            myObjectArray.add(myObject);

        }

        return myObjectArray;

    }

 

其实传一个对象集合到后台的话直接在后台用ArrayList接参就可以(java端传到Flex端也是一样),只不过ArrayCollectionvo对象要和后台中的bean对应起来(属性名一样,否则接不到值),需要注意的是Flexvo对象中的属性要用public.

 

 

Flex端传给Java端一个ArrayCollectionJava端用ArrayList接收,之后循环遍历ArrayList,强转,就会取到Flex端传过来的值

 

For(int I = 0; i<arrayList.size();i++ ){

       HashMap map = (HashMap)arrayList.get(i) ;

       String A = map.get(“FlexVO的字段名”).toString() ;

}

关于使用Java中的JSch exec从ArrayList执行命令列表java arraylist clear的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于ArrayList.toArray()中的Java泛型、ArrayList.toArray()中的Java泛型 - Java generics in ArrayList.toArray()、ArrayList中的java – toArray(T [])方法、Flex中ArrayCollection 与java中的ArrayList互转的相关知识,请在本站寻找。

本文标签: