La segunda parte de la serie java9: mejora gramatical del cierre automático de recursos

expediente

En el próximo período de tiempo planeo escribir una serie de artículos sobre Java 9. Aunque Java 9 no es una versión básica de Java como Java 8 o Java 11, todavía hay muchas características a las que vale la pena prestar atención. Esperando su atención, escribiré una serie de artículos sobre Java 9, unos diez artículos.

En la versión de Java 9, se ha mejorado la sintaxis de prueba con recursos compatible con JDK 7. Aunque es solo una pequeña mejora, todavía espero presentárselo. Mejoremos un poco todos los días.

Primero, hablemos de probar con recursos de Java7 (la versión mejorada de Java9 es posterior)

Antes de Java 7, no existía la try-with-resourcesgramática. Todas las acciones de destrucción de la secuencia deben cerrarse manualmente escribiendo código en el método. Como el código siguiente, escriba una cadena en un archivo.

@Test
void testStream() throws IOException {
  String fileName = "D:\\data\\test\\testStream.txt";

  FileOutputStream fos = new FileOutputStream(fileName);  //创建IO管道流
  OutputStreamWriter osw = new OutputStreamWriter(fos);
  BufferedWriter bw = new BufferedWriter(osw);

  try{
    bw.write("手写代码进行Stream流的关闭");
    bw.flush();
  }finally{
    bw.close();   //手动关闭IO管道流
    osw.close();
    fos.close();
  }
}

La try-with-resourcesgramática se proporciona a partir de la versión de Java 7. Solo necesitamos try()incluir el flujo de canalización . Una vez que se ejecuta el segmento de código de prueba, el flujo de canalización de E / S se cerrará automáticamente. No es necesario escribir código para cerrarlo. Esto es muy conciso!

@Test
void testTry() throws IOException {
  String fileName = "D:\\data\\test\\testTry.txt";
  try(FileOutputStream fos = new FileOutputStream(fileName);
      OutputStreamWriter osw = new OutputStreamWriter(fos);
      BufferedWriter bw = new BufferedWriter(osw);){
    bw.write("IO管道流被自动调用close()方法");
    bw.flush();
  }
}

2. Evite malentendidos

Muchos amigos son try-with-resourcesfáciles de caer en malentendidos después de conocer la gramática.

  • Malentendido 1: solo el flujo de canalización de IO puede usar la try-with-resourcessintaxis para cerrar automáticamente los recursos
  • Malentendido 2: todos los objetos de clase con el método close () llamarán automáticamente al método close () para cerrar el recurso

El malentendido uno reduce el alcance de la práctica, y el malentendido dos exagera el alcance de la práctica. Entonces, ¿qué tipo de recursos se pueden cerrar automáticamente? La respuesta es que las clases que implementan la interfaz AutoCloseable o Closeable pueden cerrar automáticamente el recurso.

public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

La interfaz Closeable hereda de la interfaz AutoCloseable y ambas incluyen el método close (). Si sus clases personalizadas que ocupan recursos del sistema deben reciclarse, implemente una de estas dos interfaces y realice el reciclaje y cierre de recursos con el método close (). De esta manera, sus clases personalizadas también pueden usar try-with-resourcessintaxis para reciclar y cerrar recursos.

3. try-with-resourcesMejoras en Java 9

try-with-resourcesLa gramática se ha mejorado en Java 9. La try-with-resourcesgramática try()puede contener variables y varias variables están separadas por punto y coma. El propósito de esta mejora es aclarar la semántica y separar el código de creación de recursos de la sintaxis de intentar recuperar recursos.

  • Semántica 1: intente ejecutar el segmento de código, si se lanza una excepción, maneje la excepción
  • Semántica 2: intente cerrar automáticamente el recurso, ¿quién debería cerrarlo? Cerrar la try()variable incluida

@Test
void testJava9Try() throws IOException {
  String fileName = "D:\\data\\test\\testJava9Try.txt";

  FileOutputStream fos = new FileOutputStream(fileName);
  OutputStreamWriter osw = new OutputStreamWriter(fos);
  BufferedWriter bw = new BufferedWriter(osw);

  try(bw;osw;fos){  //注意这里:尝试去回收这三个对象对应的资源,和上文中的java 7代码对比
    bw.write("Java9-可以被自动调用close()方法");
    bw.flush();
  }
}

Bienvenido a seguir mi blog, hay muchas colecciones boutique.

  • Este artículo se reproduce con una indicación de la fuente (se debe adjuntar la conexión y el texto no se puede reproducir únicamente): Blog de Letter Brother .

Si crees que es útil para ti, ¡dale me gusta y compártelo! ¡Tu apoyo es mi inagotable motivación creativa! . Además, el autor ha publicado el siguiente contenido de alta calidad recientemente y espero su atención.

Supongo que te gusta

Origin blog.csdn.net/hanxiaotongtong/article/details/109089575
Recomendado
Clasificación