Para recorrer un Vector, lo puedes hacer directamente con un iterador, sin necesidad de copiar temporalmente a un array:
Código:
public String[] listarContactos2()
{
String[] str = new String[this.getV().size()];
int i = 0;
// En Java5 podrías incluso usar el foreach
for (Iterator iter = this.getV().iterator(); iter.hasNext();)
{
Persona unaPersona = (Persona) iter.next();
str[i] = unaPersona.toString();
}
return str;
}
Y para el tratamiento de errores, la cuestion sería algo como que no tienes que guardar los streams abiertos todo el rato y la cosa quedaria algo más así:
Código:
private File f;
private final String NOMBRE_FICHERO = "C:\\guardar.txt";
public Contacto()
{
this.setF(new File(NOMBRE_FICHERO));
}
public boolean salvarDisco()
{
boolean salvadoCorrectamente = false;
String[] a = this.listarContactos();
PrintWriter thePW = null;
FileWriter theFW = null;
try
{
theFW = new FileWriter(this.getF());
thePW = new PrintWriter(theFW);
for (int i = 0; i < a.length; i++)
{
String[] b = a[i].split(",");
for (int j = 0; j < b.length; j++)
{
thePW.print(b[j] + "\r\n");
}
}
thePW.flush();
salvadoCorrectamente = true;
}
catch (IOException e)
{
System.err.println("Ocurrió un error guardando los contactos: " + e.getMessage());
e.printStackTrace();
}
finally
{
if(thePW!=null)
{
thePW.close();
}
}
return salvadoCorrectamente;
}
Fijate que con el try/catch/finally, seguro que cierras siempre el Stream al fichero, aunque haya una excepcion. Y que detectas si todo fue bien al grabar, ya que solo será true si todo fue bien hasta el flush. Así en cada metodo que trata el fichero controlas los errores y puedes saber, en caso de error, donde y cuando pasó, aparte de minimizar el tener abiertos los ficheros que nunca es bueno más allá de lo necesario.
El bloque try/catch/finally así es típico de cualquier recurso que tengas que crear/obtener y luego devolver/cerrar de forma segura al 100%. (Streams, Conexiones a BDD...)
Un saludo.