Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Capturar datos separados obtenidos desde CMD

Cordial saludo para todos. Estoy realizando una aplicación que me permita obtener los nombres de los adaptadores de red en un equipo, por ejemplo "Conexión de área Local", "Conexiones de red inalámbrica", etc, el comando que utiliza cmd es : netsh interface show interface, depende del equipo pueden aparecer diferentes cantidades de adaptadores de red, lo que necesito es que cada nombre de adaptador de red quede almacenado en una variable diferente. El còdigo que estoy ejecutando al presionar un botón se encuentra a continuaciòn:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = null;
try {
//Se determina el sistema operativo.
String so = System.getProperty("os.name");
String comando;

// Si el sistema operativo es Linux se ejecuta el comando "ifconfig"
if (so.equals("Linux"))
comando = "ifconfig";

else
comando = "cmd /c netsh interface show interface";

Process p = Runtime.getRuntime().exec(comando);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(
p.getInputStream()));

BufferedReader stdError = new BufferedReader(new InputStreamReader(
p.getErrorStream()));

// Se lee la salida del comando
System.out.println("Ésta es la salida standard del comando:\n");
while ((s = stdInput.readLine()) != null) {
System.out.println(s);

}

// Lectura de errores
System.out.println("Errores a continuación:\n");
while ((s = stdError.readLine()) != null) {
System.out.println(s);

}


} catch (IOException e) {
System.out.println("Excepción: ");
e.printStackTrace();

}
}

una salida tìpica es la siguiente:

Ésta es la salida standard del comando:


Estado admin. Estado Tipo Nombre interfaz
-------------------------------------------------------------------------
Habilitado Dedicado Conexiones de red inal�mbricas
Habilitado Dedicado Conexi�n de �rea local
Habilitado Bucle invertido Bucle invertido
Habilitado Interno Interno

Errores a continuación:

Agradezco cualquier ayuda que me puedan brindar, gracias por la atención.

febrero 1, 2015 | Unregistered CommenterLeonardo

No hay necesidad de hacer todo eso, ni nada parecido.

http://docs.oracle.com/javase/tutorial/networking/nifs/retrieving.html

Puedes usar el código de ese tutorial, adaptándolo a tu necesidad.

febrero 1, 2015 | Registered Commenterchoces

Gracias por la respuesta choces, pero, no es lo que necesito, observe que lo que deseo es capturar el nombre con el cual aparece el adaptador de red en Conexiones de red, la solución que me indica el link que ud me ha suministrado ya la había ensayado, es decir, necesito capturar nombres como: "Conexión de área Local", "Conexiones de red inalámbricas"; capturar nombres como "eth" o "eth0", no me sirve para mi propósito.

febrero 2, 2015 | Unregistered CommenterLeonardo

"... lo que necesito es que cada nombre de adaptador de red quede almacenado en una variable diferente."

Si ejecuto este código en mi sistema:

import static java.lang.System.out;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Collections;
import java.util.Enumeration;

public class NewMain {

public static void main(String[] args) throws SocketException {
Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();

for (NetworkInterface netIf : Collections.list(nets)) {
out.printf("Display name: %s\n", netIf.getDisplayName());
out.printf("Name: %s\n", netIf.getName());
out.printf("\n");
}
}

}

Obtengo salidas como las siguientes:

Display name: Software Loopback Interface 1
Name: lo

Display name: Adaptador de red de depuración de kernel de Microsoft
Name: eth0

Display name: Realtek PCIe GBE Family Controller
Name: eth1

Display name: Dispositivo Bluetooth (TDI protocolo RFCOMM)
Name: net0

Display name: Dispositivo Bluetooth (Red de área personal)
Name: eth2

Display name: Adaptador ISATAP de Microsoft
Name: net1

Y así sucesivamente. Ese "Display Name" es el nombre que le asigna el Sistema Operativo a cada adaptador de red, y ese código lo proporciona, como puedes ver.

http://docs.oracle.com/javase/7/docs/api/java/net/NetworkInterface.html#getDisplayName()

febrero 2, 2015 | Registered Commenterchoces

Gracias por esta otra respuesta, pero, tampoco es lo que necesito. Efectivamente el DisplayName muestra el nombre que el sistema operativo le asigna a cada adaptador de red, ese nombre es diferente al que se muestra en la sección de "Conexiones de red", por ejemplo, el nombre de mi adaptador de red es " broadcom 802.11n", pero, en Conexiones de red, se llama "Conexiones de red inalámbricas", además, este último nombre puede ser modificado por cualquier usuario, por eso es que necesito capturar este nombre y no el que le otorga cada sistema operativo. Con el comando ejecutado en cmd "netsh interface show interface" puedo observar los nombres de cada una de los adaptadores, pero, necesito que cada nombre quede almacenado en una variable diferente, para que después el usuario pueda elegir el adaptador deseado y poder ejecutar una configuración en particular. He buscado algún método en java.net, pero, no he encontrado nada que se pueda ajustar a mis necesidades, nuevamente, gracias por la atención y colaboración.

febrero 2, 2015 | Unregistered CommenterLeonardo

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class NewMain {

public static void main(String[] args) throws IOException {

Process p = Runtime.getRuntime().exec("cmd /c netsh interface show interface");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
String s;
List<String> salida = new ArrayList<>();
while ((s = stdInput.readLine()) != null) {
salida.add(s);
}

List<String> nombres = salida.stream()
.skip(3)
.filter((String adaptadores) -> !adaptadores.isEmpty())
.map((String adaptadores) -> {
String[] split = adaptadores.split(" ");
return split[split.length - 1];
})
.collect(Collectors.toList());

nombres.stream().forEach((String adaptador) -> System.out.println("adaptador: " + adaptador));
}

}

Salida por la consola de Java:
adaptador: TunnelTap
adaptador: Ethernet

Salida de la consola del sistema:
C:\WINDOWS\system32>cmd /c netsh interface show interface

Estado admin. Estado Tipo Nombre interfaz
-------------------------------------------------------------------------
Habilitado Desconectado Dedicado TunnelTap
Habilitado Conectado Dedicado Ethernet

febrero 2, 2015 | Registered Commenterchoces