Java LittleEndandaInputStream是否已知不稳定,特别是在Linux上?
我最近接手了一辆方程式学生车遥测软件的开发。它使用Java8和JavaFX8。有一个主要的错误,我现在正试图修复,但我完全卡在此刻。 程序可以在以后以自定义格式加载记录的数据以供查看。这在Mac和Windows上运行良好,但在Linux上会造成问题。有些发行版有时会设法加载数据,有些发行版根本不管理数据。问题可能与LittleEndandaInputStream有关 我还不了解整个问题。所以我想知道是否有人可以告诉我一些“调试”的方法,或者是如何解决这类问题。并告诉我使用LittleEndiandTainPutStream(不是我实现的)是否是一个好主意(甚至IntelliJ也将此API标记为不稳定)。如果不是,什么是合适的替代品? 由于版本号错误,代码总是从“readVersion()”到达“Loader Exeption”。从Windows加载相同的文件可以正常工作 可能 ErrorLog的有趣部分:Java LittleEndandaInputStream是否已知不稳定,特别是在Linux上?,java,stream,Java,Stream,我最近接手了一辆方程式学生车遥测软件的开发。它使用Java8和JavaFX8。有一个主要的错误,我现在正试图修复,但我完全卡在此刻。 程序可以在以后以自定义格式加载记录的数据以供查看。这在Mac和Windows上运行良好,但在Linux上会造成问题。有些发行版有时会设法加载数据,有些发行版根本不管理数据。问题可能与LittleEndandaInputStream有关 我还不了解整个问题。所以我想知道是否有人可以告诉我一些“调试”的方法,或者是如何解决这类问题。并告诉我使用LittleEndian
de.***.***.loader.LoaderException: The loader failed loading from /home/****/****/****/****/***/***/01 - 05.06.2018/Logfiles/1970-01-01-01-01-08/brake_pressure-front.ebl
at de.***.***.loader.ebl.EboxLogReader.readVersion(EboxLogReader.java:155)
at de.***.***.loader.ebl.EboxLogReader.readTimestampFromHeader(EboxLogReader.java:130)
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:3106)
at java.io.ObjectInputStream.readFully(ObjectInputStream.java:1076)
at de.*.loader.ebl.EboxLogReader.readString(EboxLogReader.java:158)
at de.*.loader.ebl.EboxLogReader.readTimestampFromHeader(EboxLogReader.java:127)
at de.*.loader.ebl.EboxLogLoader.load(EboxLogLoader.java:65)
at de.*.loader.ebl.EboxLogLoader.load(EboxLogLoader.java:24)
at de.*.loader.LoaderManager.load(LoaderManager.java:122)
at de.*.model.DataManager.forceLoadRunData(DataManager.java:193)
at de.*.model.DataManager.getRunData(DataManager.java:218)
at de.*.gui.fx.job.runData.LoadRunDataJob.call(LoadRunDataJob.java:22)
at de.*.gui.fx.job.runData.LoadRunDataJob.call(LoadRunDataJob.java:8)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
WARNING - 26.06.19 19:32:24: Could not read record header. Ignoring ...
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:3106)
at java.io.ObjectInputStream.readFully(ObjectInputStream.java:1076)
at de.*.loader.ebl.EboxLogReader.readString(EboxLogReader.java:158)
at de.*.loader.ebl.EboxLogReader.readHeader(EboxLogReader.java:52)
at de.*.loader.ebl.EboxLogLoader.load(EboxLogLoader.java:86)
at de.*.loader.ebl.EboxLogLoader.load(EboxLogLoader.java:24)
at de.*.loader.LoaderManager.load(LoaderManager.java:122)
at de.*.model.DataManager.forceLoadRunData(DataManager.java:193)
at de.*.model.DataManager.getRunData(DataManager.java:218)
at de.*.gui.fx.job.runData.LoadRunDataJob.call(LoadRunDataJob.java:22)
at de.*.gui.fx.job.runData.LoadRunDataJob.call(LoadRunDataJob.java:8)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
编辑:
总结我在评论或我自己的建议中尝试的事情及其影响:
- 从ErrorLog->File手动添加缺少的版本加载到GUI中时没有错误,但调用08.01.105917131而不是“xyz.ebl”,并且不可用
- 将com.google.guava API的依赖项更新到更高版本不会改变任何事情
- 简单地将LittleEndianInputStream交换到ObjectInputStream会产生相同的错误日志,但版本为256
- 我试图加载的文件似乎是作为ObjectOutputStream编写的,并且正在被LittleEndianInputStream读取。这似乎很奇怪,但只有Linux有困难。写入文件(我正在尝试加载)在此处完成:
遗憾的是,错误没有被修复,但在重新设计应用程序的这一部分后,困难消失了,再次感谢所有的贡献。支持的\u版本初始化时没有元素,而初始值1支持的\u版本初始化时没有元素,和和初始值183946924可以用十六进制写成0x0500EDAC。字节
ac ed 00 05
是Java序列化流的签名。如果使用ObjectOutputStream编写文件,则必须使用ObjectOutputStream读取该文件。此项目的配置文件(如还原布局)通过使用ObjectOutputStream存储。所以你怀疑程序试图用LittleEndAndainPutStream读取ObjectOutputStream?是的,这不行。我会深入研究的。非常感谢。83946924可以用十六进制写成0x0500EDAC。字节ac ed 00 05
是Java序列化流的签名。如果使用ObjectOutputStream编写文件,则必须使用ObjectOutputStream读取该文件。此项目的配置文件(如还原布局)通过使用ObjectOutputStream存储。所以你怀疑程序试图用LittleEndAndainPutStream读取ObjectOutputStream?是的,这不行。我会深入研究的。非常感谢是的,没错。实际上1谢谢你的建议,刚刚试过。我不能提供支持的_版本的填充,因为就我目前所知,它停留在初始值。手动添加它会给我一个名为“08.01.105917131”的对象,它根本不能在GUI中使用。该对象应称为“xyz.ebl”。快速查看一下@VGR建议,这可能真的会发生。当我有时间彻底研究这个问题时,我会回来的。谢谢你们两位!你提到你不能想象C类的bug-我必须在软件中添加值,这些值存储在这些文件中。ebl文件实际上来自板机,它是用C编写的,通过UDP连接的。在这个阶段,我只能胡乱猜测。我认为@VGR更正确。也许可以尝试一个没有空格的文件名(尽管那会很奇怪)。实际上,1谢谢你的建议,试一下吧。我不能提供支持的_版本的填充,因为就我目前所知,它停留在初始值。手动添加它会给我一个名为“08.01.105917131”的对象,它根本不能在GUI中使用。该对象应称为“xyz.ebl”。快速查看一下@VGR建议,这可能真的会发生。当我有时间彻底研究这个问题时,我会回来的。谢谢你们两位!你提到你不能想象C类的bug-我必须在软件中添加值,这些值存储在这些文件中。ebl文件实际上来自板机,它是用C编写的,通过UDP连接的。在这个阶段,我只能胡乱猜测。我认为@VGR更正确。也许可以尝试一个没有空格的文件名(尽管那会很奇怪)。
public long readTimestampFromHeader(File file) throws LoaderException
{
try(FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
LittleEndianDataInputStream input = new LittleEndianDataInputStream(bis))
{
bytesRead.set(0);
readVersion(input, file);
input.readUnsignedShort(); // ID
readString(input); // Name
readString(input); // Type
return input.readLong();
}
catch(EOFException e)
{
// File corrupt, much too short. Simply ignore
log.log(Level.WARNING, "Could not read record header. Ignoring ...", e);
return 0L;
}
catch(IOException e)
{
throw new LoaderException(file, e);
}
}
private void readVersion(LittleEndianDataInputStream input, File file) throws IOException, LoaderException
{
int version = input.readInt();
bytesRead.set(bytesRead.get() + 4);
if(!SUPPORTED_VERSIONS.contains(version))
{
throw new LoaderException(file, new Exception("File version "
+ version + " is not supported"));
}
}
de.***.***.loader.LoaderException: The loader failed loading from /home/****/****/****/****/***/***/01 - 05.06.2018/Logfiles/1970-01-01-01-01-08/brake_pressure-front.ebl
at de.***.***.loader.ebl.EboxLogReader.readVersion(EboxLogReader.java:155)
at de.***.***.loader.ebl.EboxLogReader.readTimestampFromHeader(EboxLogReader.java:130)
Caused by: java.lang.Exception: File version 83946924 is not supported
public class DataRecordSerializer implements Serializer<DataRecord, FileDataLocator>
{
public static final int VERSION = (0 << 16) + (1 << 8) + 0;
private final boolean append;
public DataRecordSerializer()
{
this(false);
}
public DataRecordSerializer(boolean append)
{
this.append = append;
}
@Override
public void serialize(DataRecord data, FileDataLocator locator) throws SerializerException
{
File target = locator.getFile();
boolean actuallyAppends = this.append && target.exists();
// Save the data
try(FileOutputStream fos = new FileOutputStream(target, this.append);
BufferedOutputStream bos = new BufferedOutputStream(fos);
ObjectOutputStream out = actuallyAppends ?
new AppendingObjectOutputStream(bos) :
new ObjectOutputStream(bos))
{
if(!actuallyAppends)
{
// Version info
out.writeInt(VERSION);
// Save the concrete class
out.writeUTF(data.getClass().getName());
// Header
out.writeObject(data.getHeader());
}
// Data
float[] x = data.getXValues();
float[] y = data.getYValues();
for(int i = 0; i < x.length; i++)
{
out.writeFloat(x[i]);
out.writeFloat(y[i]);
}
}
catch(IOException e)
{
throw new SerializerException(e);
}
}
public static class AppendingObjectOutputStream extends ObjectOutputStream
{
public AppendingObjectOutputStream(OutputStream out) throws IOException
{
super(out);
}
@Override
protected void writeStreamHeader() throws IOException
{
// do not write a header, but reset
reset();
}
}
}
public static final int VERSION = (0 << 16) + (1 << 8) + 0;
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:3106)
at java.io.ObjectInputStream.readFully(ObjectInputStream.java:1076)
at de.*.loader.ebl.EboxLogReader.readString(EboxLogReader.java:158)
at de.*.loader.ebl.EboxLogReader.readTimestampFromHeader(EboxLogReader.java:127)
at de.*.loader.ebl.EboxLogLoader.load(EboxLogLoader.java:65)
at de.*.loader.ebl.EboxLogLoader.load(EboxLogLoader.java:24)
at de.*.loader.LoaderManager.load(LoaderManager.java:122)
at de.*.model.DataManager.forceLoadRunData(DataManager.java:193)
at de.*.model.DataManager.getRunData(DataManager.java:218)
at de.*.gui.fx.job.runData.LoadRunDataJob.call(LoadRunDataJob.java:22)
at de.*.gui.fx.job.runData.LoadRunDataJob.call(LoadRunDataJob.java:8)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
WARNING - 26.06.19 19:32:24: Could not read record header. Ignoring ...
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:3106)
at java.io.ObjectInputStream.readFully(ObjectInputStream.java:1076)
at de.*.loader.ebl.EboxLogReader.readString(EboxLogReader.java:158)
at de.*.loader.ebl.EboxLogReader.readHeader(EboxLogReader.java:52)
at de.*.loader.ebl.EboxLogLoader.load(EboxLogLoader.java:86)
at de.*.loader.ebl.EboxLogLoader.load(EboxLogLoader.java:24)
at de.*.loader.LoaderManager.load(LoaderManager.java:122)
at de.*.model.DataManager.forceLoadRunData(DataManager.java:193)
at de.*.model.DataManager.getRunData(DataManager.java:218)
at de.*.gui.fx.job.runData.LoadRunDataJob.call(LoadRunDataJob.java:22)
at de.*.gui.fx.job.runData.LoadRunDataJob.call(LoadRunDataJob.java:8)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
static {
SUPPORTED_VERSIONS.add(83946924);
}
throw new LoaderException("File version "
+ version + " is not supported: " + file);