Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LittleEndandaInputStream是否已知不稳定,特别是在Linux上?_Java_Stream - Fatal编程技术网

Java LittleEndandaInputStream是否已知不稳定,特别是在Linux上?

Java LittleEndandaInputStream是否已知不稳定,特别是在Linux上?,java,stream,Java,Stream,我最近接手了一辆方程式学生车遥测软件的开发。它使用Java8和JavaFX8。有一个主要的错误,我现在正试图修复,但我完全卡在此刻。 程序可以在以后以自定义格式加载记录的数据以供查看。这在Mac和Windows上运行良好,但在Linux上会造成问题。有些发行版有时会设法加载数据,有些发行版根本不管理数据。问题可能与LittleEndandaInputStream有关 我还不了解整个问题。所以我想知道是否有人可以告诉我一些“调试”的方法,或者是如何解决这类问题。并告诉我使用LittleEndian

我最近接手了一辆方程式学生车遥测软件的开发。它使用Java8和JavaFX8。有一个主要的错误,我现在正试图修复,但我完全卡在此刻。 程序可以在以后以自定义格式加载记录的数据以供查看。这在Mac和Windows上运行良好,但在Linux上会造成问题。有些发行版有时会设法加载数据,有些发行版根本不管理数据。问题可能与LittleEndandaInputStream有关

我还不了解整个问题。所以我想知道是否有人可以告诉我一些“调试”的方法,或者是如何解决这类问题。并告诉我使用LittleEndiandTainPutStream(不是我实现的)是否是一个好主意(甚至IntelliJ也将此API标记为不稳定)。如果不是,什么是合适的替代品? 由于版本号错误,代码总是从“readVersion()”到达“Loader Exeption”。从Windows加载相同的文件可以正常工作

可能

ErrorLog的有趣部分:

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);