小编Joh*_*tam的帖子

在Java中没有内存问题的缩略图加载大图像?

我试图让用户从他们的硬盘加载图像,并在GUI中以视觉形式呈现这些缩略图列表(带有添加到JList的图标的JPanel).我目前正在使用ImageIO.read()获取BufferedImage并为每个图像使用getScaledInstance(听说你不应该使用它).

它适用于小图像,但加载超过四张照片(5000x3000或其他一些),我得到"java.lang.OutOfMemoryError:Java堆空间".不保存对全尺寸BufferedImage的引用,所以我认为垃圾收集器会处理它并且只保留缩放的图像(不应该占用太多内存),但它看起来不像.我也踩了getRuntime().gc()和System.gc(),没有效果.

从文件加载缩放图像的任何好方法,而不会遇到内存错误?显然很多软件都设法做到这一点,但也许不是用Java做的.外部库是可以的.


当前代码:

BufferedImage unscaledImage = ImageIO.read(imageFile);

int unscaledHeight = unscaledImage.getHeight();
int unscaledWidth = unscaledImage.getWidth();

int imageRatio = unscaledHeight/unscaledWidth;

if (imageRatio >= 1) {
    return new ImageIcon(unscaledImage.getScaledInstance(width,-1,Image.SCALE_FAST));
} else {
    return new ImageIcon(unscaledImage.getScaledInstance(-1,height,Image.SCALE_FAST));
}
Run Code Online (Sandbox Code Playgroud)

java memory-management image-processing thumbnails

11
推荐指数
1
解决办法
5174
查看次数

ObjectOutputStream的等价物,不仅保存了它的状态,还保存了整个对象?

我让用户使用URLClassLoader从远程位置导入类似插件的类,因此这些导入的类不存在于构建路径中(但是,它们都实现了包含的接口IPlugin).

我假设可以简单地使用ObjectOutputStream将所有加载的插件保存到文件中,然后使用ObjectInputStream读取它们.但这似乎并非如此,因为它保存的只是对象的状态,而不是包含逻辑(即方法).

我希望做的是使用ObjectOutputStream保存加载的插件列表(activePlugins):

ObjectOutputStream oos = new ObjectOutputStream(*fileoutputstream*);
oos.writeObject(activePlugins);
oos.close();
Run Code Online (Sandbox Code Playgroud)

然后在另一个运行时,使用ObjectInputStream加载/恢复所有这些插件:

ObjectInputStream ois = new ObjectInputStream(*fileinputstream*);
activePlugins = (ArrayList<IPlugin>) ois.readObject();
Run Code Online (Sandbox Code Playgroud)

但是由于实际的对象类在构建路径中不可用(它们位于硬盘驱动器上的其他位置),因此它会变得混乱.我所追求的是在没有类可用的情况下加载对象的某种方式,即加载具有状态且没有依赖关系的对象.

java serialization classloader

5
推荐指数
1
解决办法
257
查看次数

"选择...进入.."语句失败,"表或视图不存在",即使它不应该运行

我有以下PL/SQL脚本,我试图通过SQL*Plus运行:

DECLARE 
   table_exists number;
   sequence_exists number;
   sequence_start number;
BEGIN
   select count(*) into sequence_exists
       from all_sequences
       where sequence_name='DBSEQ';
   select count(*) into table_exists
       from dba_tables
       where table_name='DBTABLE';
   IF sequence_exists = 0 AND table_exists > 0 THEN
       select MAX(ID) + 1 into sequence_start from DBTABLE;
   ELSE
       sequence_start := 1;
   END;
   IF sequence_exists = 0 THEN
       execute immediate 'CREATE SEQUENCE DBSEQ
             start with ' || sequence_start || '
             increment by 1
             nomaxvalue';
   END IF;
END;
Run Code Online (Sandbox Code Playgroud)

(这有点最小化,以显示实际失败的部分).

问题是排

select MAX(ID) + 1 into sequence_start from …
Run Code Online (Sandbox Code Playgroud)

oracle plsql sqlplus

3
推荐指数
1
解决办法
2020
查看次数