gpt4 book ai didi

Java - 如何逐字节读取 .dat 文件

转载 作者:行者123 更新时间:2023-12-01 09:35:55 25 4
gpt4 key购买 nike

我正在尝试使用 Java 读取 .dat,而不使用其他类。这是文件的结构: header 连载:字;//2字节 文件名:字符串[255];//1字节 日期:字;//2字节 字段编号:Word;//2字节 记录数:Word;//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 获取每个字节,将其读取为 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!");
}

}


}

最佳答案

在java中,Reader和Writer用于Unicode文本、字符串、2字节字符。

对于二进制数据,byte[]需要一个InputStream、OutputStream。

可以使用输入流:

BufferedInputStream in = new BufferedInputStream(new FileInputStream(...));

就您而言,您想阅读简短的内容等。为此,您可以将其包装在 DataInputStream 周围。

但是,使用 ByteBuffer 是最容易开始的。可以从文件(FileChannel)中读取,但简单的情况是:

Path path = Paths.get("C:/xxx/yyy.dat");
byte[] bytes = Files.readAllBytes(path);
ByteBuffer buffer = ByteBuffer.wrap(bytes);
//buffer.order(ByteOrder.LITTLE_ENDIAN); // So short is read as LSB,MSB

已解决:

// Header
short serial = buffer.getShort();
byte[] fileNameB = new byte[255];
buffer.get(fileNameB);
// If 0 terminated asciz string:
int len = fileNameB.length;
for (int i = 0; i < fileNameB.length; ++i) {
if (fileNameB[i] == 0) {
len = i;
break;
}
}
String fileName = new String(fileNameB, 0, len, StandardCharsets.ISO_8859_1);

short date = buffer.getShort();
short fieldNumbers = buffer.getShort();
short numbersOfRecords = buffer.getShort();

for (int fieldI = 0; fieldI < fieldNumber; ++fieldI) {
// Info about Fields
short fieldCode = buffer.getShort();
//byte fieldName: ShortString; //1 byte
}

字段信息 字段代码:Word;//2字节 字段文本:字符串[255];//1字节

DateTime = double
<小时/>
String getPascalString(ByteBuffer buffer) {
int length = buffer.get() & 0xFF;
byte[] bytes = new byte[length];
buffer.get(bytes);
return new String(bytes, StandardCharsets.ISO_8859_1);
}

Will deliver: d:/documentos/te...

short packedDate = buffer.getShort();
int year = packedDate & 0x7F; // + 1900?
int month = (packedDate >> 7) & 0xF:
int day = (packedDate >> 11) & 0x1F;

关于Java - 如何逐字节读取 .dat 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38934793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com