Solución al reto de los filtros

Como es viernes, os expongo la solución al reto que os propuse la semana pasada. Podéis recordarlo aquí.

Como puede hacerse

El método comprueba, en primer lugar, que los parámetros recibidos son correctos. A continuación, crea un flujo de escritura sobre el nombre de archivo obtenido. El flujo de escritura lo representa un objeto de la clase DataOutputStream, ya que esta clase actúa como filtro añadiendo métodos que permiten la escritura de tipos de datos por separado. El objeto DataOutputStream parte de un objeto BufferedOutputStream, que tiene la particularidad de añadir un sistema de almacenamiento intermedio (buffering) al flujo inicial establecido sobre un archivo. Después se determina el número de días del mes considerando un año no bisiesto y este número se utiliza para controlar un bucle que, en cada iteración, escribe en el archivo un número de día seguido de su correspondiente letra. Y el archivo es finalmente cerrado.

Parámetros del método

Un valor entero indicando el mes del año y una letra para indicar el día de la semana correspondiente al día de dicho mes

Valor de retorno

El método no devuelve ningún valor de retorno

Solución

import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class RetoFiltros {

public void escribirMes(int mes, char letraDia) throws IOException {
if (mes < 1 || mes > 12) {
throw new IllegalArgumentException(“Mes no valido”);

}

String letraDia1 = “” + letraDia;
String letrasDiasSemana = “LMXJVISD”;

if (letrasDiasSemana.indexOf(letraDia1.toUpperCase()) == -1) {
throw new IllegalArgumentException(“Letra no valida”);
}

DataOutputStream archivoMes = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(“C:/misArchivos/mes” + mes + “.txt”)));
int numDiaMes = 0;

switch (mes) {
case 2:
numDiaMes = 28; // OBTENER EL NUMERO DE DIAS DEL MES
break;
case 4:
case 6:
case 9:
case 11:
numDiaMes = 30;
break;
default:
numDiaMes = 31;
}

for (int i = 0; i < numDiaMes; i++) {
char letra = letrasDiasSemana.charAt((letrasDiasSemana.indexOf(letraDia) + i) % 7);
archivoMes.writeInt(i + 1);
archivoMes.writeChar(letra);
}

archivoMes.close();
}

}

NOTA: Para calcular la letra correspondiente a cada día se comienza con la posición que ocupa la correspondiente al día 1 en la cadena letrasDiasSemana. A esta posición se le suma el día pero, a continuación, se aplica el módulo de la división entre siete para no desbordar la cadena. En el archivo se escribe i+1 porque interesa comenzar desde 1, para calcular correctamente la letra correspondiente a cada día 

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s