cref - remarks c#
¿Intenta... atraparlo por dentro cuando suelte un recurso? (8)
¿Entonces cuál es la pregunta? No hay manera correcta o incorrecta. ¿Se puede cerrar incluso lanzar una excepción IO? ¿Que haces entonces? Por lo general, no me gusta ningún tipo de reingreso.
El problema es que, simplemente se traga una excepción de IO al cerrar, bien. ¿Puedes vivir con ese soplo? Si no tienes un problema, si es así, nada de malo.
Nunca hice eso, pero, nuevamente, eso depende de su caso de negocios.
Quiero escribir una String
a un archivo Unicode. Mi código en Java
es:
public static boolean saveStringToFile(String fileName, String text) {
BufferedWriter out = null;
boolean result = true;
try {
File f = new File(fileName);
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(f), "UTF-8"));
out.write(text);
out.flush();
} catch (Exception ex) {
result = false;
} finally {
if (out != null)
try {
out.close();
} catch (IOException e) {
// nothing to do! couldn''t close
}
}
return result;
}
Actualizar
Ahora compáralo con C #:
private static bool SaveStringToFile(string fileName, string text)
{
using (StreamWriter writer = new StreamWriter(fileName))
{
writer.Write(text);
}
}
o incluso try..catch
formulario de try..catch
sería:
private static bool SaveStringToFile(string fileName, string text)
{
StreamWriter writer = new StreamWriter(fileName);
try
{
writer.Write(text);
}catch (Exception ex)
{
return false;
}
finally
{
if (writer != null)
writer.Dispose();
}
}
Tal vez sea porque soy del mundo C # y .Net. Pero, ¿es esta la forma correcta de escribir una cadena en un archivo? Es demasiado código para una tarea tan simple. En C #, yo diría que solo out.close();
y eso fue todo, pero parece un poco extraño agregar un try..catch
dentro de una sentencia finally
. Agregué la sentencia finally
para cerrar el archivo (recurso) sin importar lo que pase. Para evitar utilizar demasiado recurso. ¿Es este el camino correcto en Java? Si es así, ¿por qué close
lanza excepción?
El equivalente de Java a la declaración de uso es la declaración de prueba con recursos agregada en Java 7:
public static void saveStringToFile(String fileName, String text) throws IOException {
try (Writer w = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
w.write(text);
}
}
El try-with-resources cerrará automáticamente la secuencia (lo que implícitamente la elimina) y lanzará las excepciones encontradas al hacerlo.
Un BufferedWriter no es necesario si realiza una sola llamada para escribir de todos modos (su propósito es combinar varias escrituras en el flujo subyacente para reducir el número de llamadas del sistema, mejorando así el rendimiento).
Si insiste en manejar los errores devolviendo falso, puede agregar una cláusula catch:
public static boolean saveStringToFile(String fileName, String text) {
try (Writer w = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
w.write(text);
return true;
} catch (IOException e) {
return false;
}
}
Esto debería funcionar. Si desea administrar excepciones con comportamientos complejos, cree StreamWriter
public static bool saveStringToFile(String fileName, String text)
{
try
{
File.WriteAllText(fileName, text, Encoding.UTF8);
}
catch (IOException exp)
{
return false;
}
return true;
}
La mejor manera de evitarlo es poniendo out.close () después de out.flush () y el proceso se maneja automáticamente si falla el cierre. O usar esto es mejor (lo que estoy usando):
File file = ...
OutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream(file));
...
finally {
if (out != null) {
out.close();
}
}
}
Sí, no hay nada extraño en Tratar de atrapar adentro finalmente () en java. close () puede lanzar IoException por varias razones, es por eso que tiene que estar encerrado por bloques try catch. Hay una solución mejorada para este problema tuyo, en el último java SE 7 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
Si desea un mínimo de código puede usar FileUtils.writeStringToFile
FileUtils.writeStringToFile(new File(fileName), text);
y no usaría booleano, ya que rara vez es una buena idea ignorar el hecho de que se produjo un error o la razón por la que se produjo en el mensaje de la excepción. El uso de una excepción marcada garantiza que la persona que llama siempre se ocupará de dicho error correctamente y podrá registrar mensajes de error significativos sobre por qué.
Para guardar el archivo utilizando un CharSet específico
try {
FileUtils.writeStringToFile(new File(fileName), text, "UTF-8");
} catch(IOException ioe) {
Logger.getLogger(getClass()).log(Level.WARNING, "Failed to write to " + fileName, ioe);
}
Tienes razón en que necesitas llamar a close () en el bloque finally y también necesitas envolver esto es un try / catch
En general, escribirá un método de utilidad en su proyecto o utilizará un método de utilidad de una biblioteca como http://commons.apache.org/io/apidocs/org/apache/commons/io/IOUtils.html#closeQuietly(java.io.Closeable) para cerrar. http://commons.apache.org/io/apidocs/org/apache/commons/io/IOUtils.html#closeQuietly(java.io.Closeable) Ignora cualquier excepción de lanzamiento del cierre ().
En una nota adicional, Java 7 ha agregado soporte para intentar con recursos, lo que elimina la necesidad de cerrar manualmente el recurso: http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
arch = new File("path + name");
arch.createNewFile();
FileOutputStream fos = new FileOutputStream(arch);
fos.write("ur text");
fos.close();
mi manera.