【发布时间】:2023-04-10 15:47:02
【问题描述】:
我正在尝试使用没有其他类的 Java 读取 .dat。 这是文件的结构: 标题 序列号:字; //2字节 文件名:字符串[255]; //1个字节 日期:字; //2字节 字段编号:字; //2字节 NumbersOfRecords:字; //2 个字节
Info about Fields
FieldCode: Word; //2 bytes
FieldName: ShortString; //1 byte
Info in Field
FieldCode: Word; //2 bytes
FieldText: String[255]; //1 byte
DateTime = double
我必须知道的是如何使用 BufferedReader 获取每个 Byte,将其作为 int 读取,然后将相同的 int 转换为字符串并在屏幕上显示。 我可以创建不同的方法来读取每种类型的数据吗?我可以让它同时读取 2 个字节吗?
更新:
package binarios5;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main5
{
public static void main(String[] args) throws FileNotFoundException, IOException
{
try
{
Path path = Paths.get("C:\\\\Dev-Pas\\\\EXAMEN2.dat");
System.out.println("File open");
byte[] bytes = Files.readAllBytes(path);
ByteBuffer buffer = ByteBuffer.wrap(bytes);
buffer.order(ByteOrder.BIG_ENDIAN);
short serial = buffer.getShort();
System.out.println("----[CONTENIDO DEL ARCHIVO]--------------------");
System.out.println("Nro. de Serie: " + serial);
int largoCadena = buffer.get();//Bytes 1 int Longitud de la cadena
//System.out.println("largoCadena: " + largoCadena);//33
byte[] bytesChar = new byte[largoCadena];//CString
buffer.get(bytesChar);
String nombre = new String(bytesChar, StandardCharsets.ISO_8859_1);
System.out.println("Nombre: " + nombre);
short date = buffer.getShort();//FALTA DECODIFICAR FECHA
System.out.println("Fecha sin procesar. "+date);//FALTA DECODIFICAR FECHA
short cantCampos = buffer.getShort(); //cantidad de campos que tienen los registros
System.out.println("Cantidad de Campos Customizados: "+cantCampos);//debe decir 4
int[] codCampo = new int[cantCampos];
String[] nombreCampo = new String[10];
for (int i = 0; i < cantCampos; i++) //leer RegType segun la cantidad de campos
{
codCampo[i] = buffer.getShort();//Bytes 2 codigo del campo
int largoCadena2 = buffer.get();//Bytes 1 int Longitud de la cadena
byte[] bytesChar2 = new byte[largoCadena2];
buffer.get(bytesChar2);
nombreCampo[i] = new String(bytesChar2, StandardCharsets.ISO_8859_1);
}
for (int i = 0; i < cantCampos; i++)//mostrar codigos y campos
{
System.out.println("Campo [codigo: " + codCampo[i] + ", descripcion: " + nombreCampo[i] + "]");
}
short cantRegistros = buffer.getShort();//cantidad de registros total
System.out.println("Cantidad de Registros: "+cantRegistros);
System.out.println("-----------------------");//OK
String[] contenidoCampo = new String[10];
for (int i = 0; i < cantRegistros; i++) //leyendo RegData 5 veces
{
short cantCamposCompletos = buffer.getShort();
for (int j = 0; j < cantCamposCompletos; j++)
{
short codCampoInterno = buffer.getShort();
int largoCadena3 = buffer.get();
byte[] bytesChar3 = new byte[largoCadena3];
buffer.get(bytesChar3);
contenidoCampo[j] = new String(bytesChar3, StandardCharsets.ISO_8859_1);
System.out.println(nombreCampo[j]+": "+contenidoCampo[j]);
}
System.out.println("-----------------------");
}
System.out.println("----[FIN CONTENIDO DEL ARCHIVO]-----------------");
}
catch (IOException e)
{
System.out.println("File I/O error!");
}
}
}
【问题讨论】:
-
您使用 InputSTream 读取字节,而不是 Reader。 Reader 用于字符,而不是字节。所有的 InputStream 都有一个 read() 方法,返回一个字节。 docs.oracle.com/javase/8/docs/api/java/io/…。 Integer.toString() 将一个 int(例如 234)返回到一个字符串中,例如“234”。不过,不确定这是否是您的意思。您能否举一个具体的例子,因为我不明白文件名如何既可以是字符串 [255] 又可以是 1 字节。
-
Reader/Writer 用于文本而非二进制。将 Streams 用于二进制。
-
为什么要逐个字节?这是
DataInputStream的工作。注意String[255]是 255 个字节(至少),而不是一个。