Re: retrieve data from hashtable
On 21 Jan, 13:11, Gordon Beaton <n....@for.email> wrote:
On Mon, 21 Jan 2008 05:11:36 -0800 (PST), christopher_bo...@yahoo.co.uk wrote:
I am currently developing a java application that allows the user to
wake up computers using Wake On Lan. The program reads in a CSV file
whic has the computer names and there MAC Address. Once the file has
been read it then populates a HashTable to add the records. What I
would like to happen is when the user selects a computer name from
the JList on the application it searches through the hashtable to
find its MAC address. However whether I use the variable used for
the computer name or hard code the computer name into the program it
keeps on returning null and am not sure why this is happening.
You've created a new Hashtable for each line you read from the file,
i.e. one table per computer, instead of one Hashtable for all entries.
Presumably your code will work if (and only if) the user chooses the
host that was last in the file.
Also, your diagnostic message ("Retrieving data for") only looks for
CBO_TEST, regardless of the user's choice.
/gordon
--
Hi thanks, for the reply,
I have sorted out the mistake where I am creating a new Hashtable each
time I add a record. Where you see CBO_TEST is just a test to see if
it worked if I hard coded the computer name, which unfortunately it
doesn't. This is the code that I am using now:
package remoteshutdown;
import java.io.*;
import java.net.*;
import java.util.*;
import
com.sun.org.apache.xerces.internal.impl.xs.identity.Selector.Matcher;
public class WakeOnLan {
Hashtable macTable = new Hashtable();
String ipStr;
String macStr;
String mac;
// String Computer;
public void readFile() {
try {
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("C:\
\Documents and Settings\\All Users\\Application Data\\Remote Shutdown\
\DHCP Export.csv");
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new
InputStreamReader(fstream));
String strLine;
//Read File Line By Line
while ((strLine = br.readLine()) != null) {
System.out.println("strLine is: " + strLine );
StringTokenizer st = new StringTokenizer(strLine, ",");
String Computer = st.nextToken();
mac = st.nextToken();
System.out.println("Computer TOKENIZED: " + Computer);
System.out.println("Mac Token: " + mac);
macTable.put(Computer, mac);
Computer = (String)
mainScreen.lstComputerNames.getSelectedValue();
System.out.println("computer is showing: " + Computer);
macStr = mac;
macTable.get(Computer);
System.out.println("Inside the HashMap: " + macTable);
// WOL();
// Print the content on the console
//Close the input stream
}
in.close();
} catch (Exception e) { //Catch exception if any
System.err.println("Error: " + e.toString());
}
WOL();
}
public void WOL() {
final int PORT = 9;
String ipStr = "255.255.255.255";
String choice = (String)
mainScreen.lstComputerNames.getSelectedValue();
System.out.println( choice );
// will be -1 if there aare none or muliple selections.
int which = mainScreen.lstComputerNames.getSelectedIndex();
System.out.println( which );
// detecting multiple selections
System.out.println( "--multiples--" );
Object[] choices = mainScreen.lstComputerNames.getSelectedValues();
// macStr = "00:07:E9:93:18:EB";
for ( Object aChoice : choices )
{
System.out.println("The selection for wake on lan is: " +
aChoice);
System.out.println("The mac address is: " + mac);
try {
byte[] macBytes = getMacBytes(macStr);
byte[] bytes = new byte[6 + 16 * macBytes.length];
for (int i = 0; i < 6; i++) {
bytes[i] = (byte) 0xff;
}
for (int i = 6; i < bytes.length; i += macBytes.length) {
System.arraycopy(macBytes, 0, bytes, i, macBytes.length);
}
InetAddress address = InetAddress.getByName(ipStr);
DatagramPacket packet = new DatagramPacket(bytes,
bytes.length, address, PORT);
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
socket.close();
System.out.println("Wake-on-LAN packet sent.");
}
catch (Exception e) {
System.out.println("Failed to send Wake-on-LAN packet: " +
e);
System.exit(1);
}
}
}
private static byte[] getMacBytes(String macStr) throws
IllegalArgumentException {
byte[] bytes = new byte[6];
String[] hex = macStr.split("(\\:|\\-)");
if (hex.length != 6) {
throw new IllegalArgumentException("Invalid MAC address.");
}
try {
for (int i = 0; i < 6; i++) {
bytes[i] = (byte) Integer.parseInt(hex[i], 16);
}
}
catch (NumberFormatException e) {
throw new IllegalArgumentException("Invalid hex digit in MAC
address.");
}
return bytes;
}
}
However the same problem persists where I am searching the hashtable
and the result is null. I am fairly new to Java and would appreicate
any help that you can provide.
Thanks very much for your help