Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > [JavaFX] Error al escribir con BuferredWriter

Hola, buenas tardes con todos.

Tengo un problemilla que la verdad no entiendo. Estoy haciendo una Aplicación, que necesita de un Login. Cuando el login detecte que no existe el fichero 'rootpass.txt' en la ruta que he elegido para que se guarden (user.home/appdata/local/agenda/), muestre un dialogo para que se establezca el root y contraseña de la Base de datos.

Así mismo, el menú Editar de la aplicación se pueden cambiar El username y password del login, y el root y pass de la base de datos.

El problema está cuando trato de establecer datos, tanto para el Login, como para la BD. El fichero se genera pero sin nada dentro. Además de esto, al cerrar la conexión del FileWriter en el finally, tengo que atraparlo con un try - catch NullPointerException, ya que me genera un NullPointerException.


Les dejo los métodos:

Cambiar data Login:

// usuario y contraseña de usuario y pass de login
@FXML public void setUserAndPass() {
final Stage dialog = new Stage();
dialog.initStyle(StageStyle.UTILITY);
Pane pane = new Pane();
Scene scene = new Scene(pane,350,250);
pane.setStyle("-fx-background-color: #2E2E2E");
Label user = new Label("Usuario:");
final TextField txtuser = new TextField();
Label pass = new Label("Contraseña:");
final PasswordField txtpass = new PasswordField();
Button guardar = new Button("Guardar");
Button cancelar = new Button("Cancelar");
user.setTextFill(Color.web("#bfbfbf"));
pass.setTextFill(Color.web("#bfbfbf"));
user.setStyle("-fx-font-weight: bold");
pass.setStyle("-fx-font-weight: bold");
user.setLayoutX(30);
user.setLayoutY(33);
txtuser.setLayoutX(130);
txtuser.setLayoutY(30);
pass.setLayoutX(30);
pass.setLayoutY(83);
txtpass.setLayoutX(130);
txtpass.setLayoutY(80);
guardar.setLayoutX(30);
guardar.setLayoutY(160);
guardar.setPrefSize(90, 35);
cancelar.setLayoutX(200);
cancelar.setLayoutY(160);
cancelar.setPrefSize(90,35);
pane.getChildren().addAll(user,txtuser,pass,txtpass,guardar,cancelar);
guardar.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
configDataUser(txtuser.getText(),txtpass.getText());
}
});
cancelar.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
dialog.close();
}
});

dialog.setScene(scene);
dialog.setTitle("Establecer Usuario y Contraseña");
dialog.setResizable(false);
dialog.show();
}



// configuracion del y user y pass de la agenda
public void configDataUser(String user, String pass) {

File archivo = null;
FileWriter fw = null;
BufferedWriter escritor = null;
try {

archivo = new File(System.getProperty("user.home")+"\\AppData"+"\\Local"+"\\agenda"+"\\userpassx.txt");
if(!archivo.exists()) {
archivo.createNewFile();
fw = new FileWriter(archivo);
escritor = new BufferedWriter(fw);
escritor.write(user);
escritor.newLine();
escritor.write(pass);

Dialogs.showInformationDialog(LoginController.ventanaAgenda, "Sus datos se han registrado satisfactoriamente.",
"Información", "Informe");
}
else {
cambiarPass(user,pass);
Dialogs.showInformationDialog(LoginController.ventanaAgenda, "Sus datos se han modificado satisfactoriamente.",
"Información", "Informe");
}

}

catch(IOException ioe) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "Error al registrar sus datos.",
"Información", "Informe");
}
finally {
try {
fw.close();
} catch (IOException e) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "No se puede cerrar el archivo","Error","Error");
}
catch (NullPointerException npe) {System.err.println(npe.getMessage());}
}

}



// si el fichero la existe se elimina el fichero y se vuelve a generar uno nuevo
private void cambiarPass(String user, String pass) {

File archivo = null;
FileWriter fw = null;
BufferedWriter escritor = null;
try {
archivo = new File(System.getProperty("user.home")+"\\AppData"+"\\Local"+"\\agenda"+"\\userpassx.txt");
archivo.delete();
archivo.createNewFile();
fw = new FileWriter(archivo);
escritor = new BufferedWriter(fw);
escritor.write(user);
escritor.newLine();
escritor.write(pass);

} catch (IOException ioe) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "Error al editar sus datos.",
"Información", "Informe");
}
finally {
try {
fw.close();
} catch (IOException e) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "No se puede cerrar el archivo","Error","Error");
}
}

}

Cambiar data BD

// configuracion de la database
@FXML public void configDatabase() {
final Stage dialog = new Stage();
dialog.initStyle(StageStyle.UTILITY);
Pane pane = new Pane();
Scene scene = new Scene(pane,350,250);
pane.setStyle("-fx-background-color: #2E2E2E");

Label user = new Label("Root:");
final TextField txtroot = new TextField();
Label pass = new Label("Contraseña:");
final PasswordField txtpassw = new PasswordField();
Button guardar = new Button("Guardar");
Button cancelar = new Button("Cancelar");
guardar.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
setLoginDatabase(txtroot.getText(),txtpassw.getText());
}
});
cancelar.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
dialog.close();
}
});
user.setTextFill(Color.web("#bfbfbf"));
pass.setTextFill(Color.web("#bfbfbf"));
user.setStyle("-fx-font-weight: bold");
pass.setStyle("-fx-font-weight: bold");
user.setLayoutX(30);
user.setLayoutY(33);
txtroot.setLayoutX(130);
txtroot.setLayoutY(30);
pass.setLayoutX(30);
pass.setLayoutY(83);
txtpassw.setLayoutX(130);
txtpassw.setLayoutY(80);
guardar.setLayoutX(30);
guardar.setLayoutY(160);
guardar.setPrefSize(90, 35);
cancelar.setLayoutX(200);
cancelar.setLayoutY(160);
cancelar.setPrefSize(90,35);
pane.getChildren().addAll(user,txtroot,pass,txtpassw,guardar,cancelar);

dialog.setScene(scene);
dialog.setTitle("Establecer Database");
dialog.setResizable(false);
dialog.show();
}



// metodo para establecer el usuario y contraseña de la base de datos
public void setLoginDatabase(String user, String pass) {

File archivo = null;
FileWriter fw = null;
BufferedWriter escritor = null;
try {

archivo = new File(System.getProperty("user.home")+"\\AppData"+"\\Local"+"\\agenda"+"\\rootpass.txt");
if(!archivo.exists()) {
archivo.createNewFile();
fw = new FileWriter(archivo);
escritor = new BufferedWriter(fw);
escritor.write(user);
escritor.newLine();
escritor.write(pass);

Dialogs.showInformationDialog(LoginController.ventanaAgenda, "Sus configuracion se ha registrado satisfactoriamente.",
"Información", "Informe");
}
else {
setLoginDatabase2(user,pass);
Dialogs.showInformationDialog(LoginController.ventanaAgenda, "Sus configuracion se ha modificado satisfactoriamente.",
"Información", "Informe");
}

}

catch(IOException ioe) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "Error al registrar su configuracion.",
"Información", "Informe");
}
catch(NullPointerException npe){
System.err.println(npe.getMessage());
}
finally {
try {
fw.close();
} catch (IOException e) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "No se puede cerrar el archivo","Error","Error");
} catch (NullPointerException npe) {
System.err.println(npe.getMessage());
}
}

}



// si el fichero la existe se elimina el fichero y se vuelve a generar uno nuevo
private void setLoginDatabase2(String user, String pass) {

File archivo = null;
FileWriter fw = null;
BufferedWriter escritor = null;
try {
archivo = new File(System.getProperty("user.home")+"\\AppData"+"\\Local"+"\\agenda"+"\\rootpass.txt");
archivo.delete();
archivo.createNewFile();
fw = new FileWriter(archivo);
escritor = new BufferedWriter(fw);
escritor.write(user);
escritor.newLine();
escritor.write(pass);

} catch (IOException ioe) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "Error al editar los datos de su Database.",
"Información", "Informe");
}
finally {
try {
fw.close();
} catch (IOException e) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "No se puede cerrar el archivo","Error","Error");
}
}

}

Cuando se detecta que no existe el fichero que contiene el root y pass de la BD:

public static void setConfigDatabase() {
final Stage dialog = new Stage();
dialog.initStyle(StageStyle.UTILITY);
Pane pane = new Pane();
Scene scene = new Scene(pane,350,250);
pane.setStyle("-fx-background-color: #2E2E2E");
Label user = new Label("Root:");
final TextField txtroot = new TextField();
Label pass = new Label("Contraseña:");
final PasswordField txtpassw = new PasswordField();
Button guardar = new Button("Guardar");
Button cancelar = new Button("Cancelar");
user.setTextFill(Color.web("#bfbfbf"));
pass.setTextFill(Color.web("#bfbfbf"));
user.setStyle("-fx-font-weight: bold");
pass.setStyle("-fx-font-weight: bold");
user.setLayoutX(30);
user.setLayoutY(33);
txtroot.setLayoutX(130);
txtroot.setLayoutY(30);
pass.setLayoutX(30);
pass.setLayoutY(83);
txtpassw.setLayoutX(130);
txtpassw.setLayoutY(80);
guardar.setLayoutX(30);
guardar.setLayoutY(160);
guardar.setPrefSize(90, 35);
cancelar.setLayoutX(200);
cancelar.setLayoutY(160);
cancelar.setPrefSize(90,35);
pane.getChildren().addAll(user,txtroot,pass,txtpassw,guardar,cancelar);
guardar.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
try {
setRootYPassIfNull(txtroot.getText(), txtpassw.getText());
}
catch (Exception ex) {
// nada
}
}
});
cancelar.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
dialog.close();
}
});

dialog.setScene(scene);
dialog.setTitle("Establecer Root y Password");
dialog.setResizable(false);
dialog.show();
}


public static void setRootYPassIfNull(String txtroot,String txtpassw) {
File archivo = null;
FileWriter fw = null;
BufferedWriter escritor = null;
try {

archivo = new File(System.getProperty("user.home")+"\\AppData"+"\\Local"+"\\agenda"+"\\rootpass.txt");
archivo.createNewFile();
fw = new FileWriter(archivo);
escritor = new BufferedWriter(fw);
escritor.write(txtroot);
escritor.newLine();
escritor.write(txtpassw);
System.out.println("root: "+txtroot+" Pass: "+txtpassw);
Dialogs.showInformationDialog(LoginController.ventanaAgenda, "Sus datos se han registrado satisfactoriamente.",
"Información", "Informe");
}

catch(IOException ioe) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "Error al registrar sus datos.",
"Error al registrar.", "Error...");
}
finally {
try {
fw.close();
} catch (IOException e) {
Dialogs.showErrorDialog(LoginController.ventanaAgenda, "No se puede cerrar el archivo","Error","Error");
}
}
}

Este metodo que establece el root y pass de la db la primera vez que se inicia la aplicación, no tira null como los otros. Crea el archivo, pero vacío.

octubre 27, 2013 | Registered CommenterJFK

Solucionado. Me faltaba el flush() luego de escribir.

El null pointer que me daba al cerrar el FileWriter, lo solucioné usando:


if (filewriter != null ) {
filewriter.close();
}


Saludos.

octubre 28, 2013 | Registered CommenterJFK