Java - Random Access File

 
Vista:
sin imagen de perfil
Val: 31
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Random Access File

Publicado por Joker (27 intervenciones) el 04/11/2021 15:59:19
Hola!
Estoy teniendo problemas y es que no sé porque no consigo que funcione, diría que es un problema con los bits pero no estoy seguro. Alguien que me pueda ayudar? Gracias!
Los datos que meto son así:
1
2
3
4
5
6
7
Id:			Numero Entero.
	DNI: 			String [9].
	Nombre: 		String[10].
	Identidad secreta: 	String[20].
	Tipo: 			String[10]
	Peso: 			Numero Entero.
	Altura: 		Numero Entero
Y el codigo que tengo es el siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public static void main(String[] args) throws IOException {
 
		//Longitud del registro
		final int long_registro = 168;
 
		try {
			File fichero =  new File(".\\src\\TAE02\\Marvel.dat");
			RandomAccessFile file = new RandomAccessFile(fichero, "rw");
 
			String dniFichero, nombreFichero, identidadFichero, tipoFichero, tipoConsola;
			int pesoFichero, alturaFichero, i, p;
			Boolean existeTipo = false;
 
			System.out.print("Introduce el tipo de personaje:");
			tipoConsola = Consola.readString();
 
			for (p = 0; p < file.length(); p += long_registro) {
				file.seek(p);
				file.skipBytes(124);
 
				//Se coge el tipo
				char[] auxTipo = new char[10];
				for (i = 0; i < 10; i++) {
					auxTipo[i] = file.readChar();
				}
				tipoFichero = new String(auxTipo);
 
				if (tipoFichero.trim().equalsIgnoreCase(tipoConsola)) {
					existeTipo = true;
					file.seek(p);
 
					//Saltamos el ID
					file.skipBytes(4);
 
					//Se coge el DNI
					char[] auxDNI = new char[9];
					for (i = 0; i < 9; i++) {
						auxDNI[i] = file.readChar();
					}
					dniFichero = new String(auxDNI).trim();
 
					//Se coge el Nombre
					char[] auxNombre = new char[10];
					for (i = 0; i < 20; i++) {
						auxNombre[i] = file.readChar();
					}
					nombreFichero = new String(auxNombre).trim();
 
					//Se coge la identidad
					char[] auxIdentidad = new char[20];
					for (i = 0; i < 40; i++) {
						auxIdentidad[i] = file.readChar();
					}
					identidadFichero = new String(auxIdentidad).trim();
 
					//Salto el tipo
					file.skipBytes(10);
 
					//Se coge la peso
					pesoFichero = file.readInt();
 
					//Se coge la altura
					alturaFichero = file.readInt();
 
					//Se visualizan los datos del personaje
					System.out.println("Pesonaje [Dni = " + dniFichero + ", Nombre = " + nombreFichero +
							", Identidad = " + identidadFichero + ", Tipo = " + tipoFichero + ", Peso = " + pesoFichero +
							", Altura = " + alturaFichero);
				}
			}
 
			if (!existeTipo)
				System.out.println("No existe el tipo " + tipoConsola + " en el fichero.");
 
			file.close();
 
		}  catch (FileNotFoundException e) {
 
		}
 
	}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Random Access File

Publicado por Tom (1831 intervenciones) el 04/11/2021 17:01:02
Habría que ver cómo lo has escrito, pero esto no parece muy coherente:

char[] auxNombre = new char[10];

for (i = 0; i < 20; i++) {
auxNombre[i] = file.readChar();
}
¿ Haces un array de 10 chars y un loop para leer 20 chars ?

Para escribir y leer strings se suelen usar writeUTF() y readUTF()

Y, en todo caso, puedes leer un array de una tirada (ahora sí que podrías necesitar el doble de espacio, pero en el array no en el string)

byte bytes[] = new bytes[20];
file.read(bytes);
nombreFichero = new String(bytes);

Insisto, habría que ver, además, cómo se están escribiendo esos datos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 31
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Random Access File

Publicado por Joker (27 intervenciones) el 04/11/2021 17:38:11
Sisi, lo del array 10 chars y loop 20 ya lo he cambiado. Con lo de como se están escribiendo los datos, te refieres a como escribo en el fichero?

Yo creo que el problema esta en el file.skipBytes, pero no lo consigo arreglar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Random Access File

Publicado por Tom (1831 intervenciones) el 04/11/2021 18:13:46
Yo cuento 82 bytes, no 124 para el primer skip.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 31
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Random Access File

Publicado por Joker (27 intervenciones) el 04/11/2021 22:38:20
Y para coger el peso y la altura se haría como lo tengo puesto verdad?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 31
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Random Access File

Publicado por Joker (27 intervenciones) el 05/11/2021 13:18:42
Me podrías decir como están repartidos esos 82 bytes? Entiendo que cada int son 4 bytes, pero mi duda esta con los strings.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Random Access File

Publicado por Tom (1831 intervenciones) el 05/11/2021 14:18:48
Pero ¿ ese código no es tuyo ? ¿ Entiendes lo que hace ?
Pega la parte en la que se escribe en el fichero.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 31
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Random Access File

Publicado por Joker (27 intervenciones) el 05/11/2021 17:20:01
Sisi, es mío, pero ya he arreglado todo. Gracias por la ayuda ^^
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar