- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近接手了学生方程式赛车遥测软件的开发。它使用Java8和JavaFX8。我现在正在尝试修复一个主要错误,但目前我完全陷入困境。该程序可以稍后以自定义格式加载记录的数据以供查看。这在 Mac 和 Windows 上运行良好,但在 Linux 上会引起问题。有些发行版有时会设法加载数据,而有些发行版则根本不管理数据。该问题可能与 LittleEndianDataInputStream 有关。
我还没明白整个问题。所以我想知道是否有人可以向我展示一些“调试”或解决此类问题的方法。并告诉我使用 LittleEndianDataInputStream (不是我实现的)是否是一个好主意(甚至 IntelliJ 也将此 API 标记为不稳定)。如果不是,什么是合适的替代品?由于版本号错误,代码总是从“readVersion()”到达“加载器异常”。从 Windows 加载相同的文件工作正常。
可能
private static Set<Integer> SUPPORTED_VERSIONS = new HashSet<>(Arrays.asList(
1 << 16
));
在操作系统上的计算方式不同?
例如,Fedora 在末尾导致错误日志(每次)。相关代码如下。
private static Set<Integer> SUPPORTED_VERSIONS = new HashSet<>(Arrays.asList(
1 << 16
));
...
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"));
}
}
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)
......
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;
没有改变任何东西。之后我将其保留为 Supported_Versions 并再次交换 LittleEndianInputStream 和 ObjectInputStream 并得到此错误日志:
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)
编辑不幸的是,错误没有得到修复,但在重新设计应用程序的这一部分后,困难就消失了,再次感谢所有贡献。
最佳答案
SUPPORTED_VERSIONS 初始化时没有任何元素,并且初始值 1<<16。您可以调试,或尝试:
static {
SUPPORTED_VERSIONS.add(83946924);
}
您没有显示SUPPORTED_VERSIONS的填充,其中由于并发的原因,可能会发生并发、类加载错误。例如,据我所知,Linux 具有更好的并发支持。也许初始化发生在第二个类中,并且类加载出错。
83946924是0x500_EDAC,其中包含一个字节0x00,但我无法想象这样一个类似C的错误,或者与字符串相关的修改后的UTF-8转换,其中0x00也被转换为多字节序列。
也许版本本身就是错误的,应该是 0xACED_0005。
顺便说一句,异常可以简单地编写为:
throw new LoaderException("File version "
+ version + " is not supported: " + file);
替代类(class):
您可以使用内存映射文件,将 ByteBuffer
与 .order(ByteOrder.LITTLE_ENDIAN);
结合使用。这是标准的java。
关于java - LittleEndianDataInputStream 是否不稳定,特别是在 Linux 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56737607/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!