gpt4 book ai didi

Java 选择 : Store images in JAR or as Base64 sequence?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:32:05 24 4
gpt4 key购买 nike

我写了一个扑克模拟器/赔率计算器。在 GUI 上,有一些 JComboBoxes,用户可以从中选择卡片。

现在,我有了这些卡片的图像,而且我还有 Base64 格式的图像。我尝试了 3 种不同的方式来展示它们。为了演示目的,我为每一个都写了一个小程序。

以下是我尝试过的3种方法:

1).将图像存储在 JAR 文件中:

非常简单。图像进入 JAR,Java 代码从那里读取它们。之后,它创建一个包含所有这些的 JComboBox 并显示它:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.ImageIcon;

public class ImagesFromJAR
{
private JFrame mainframe;

public ImagesFromJAR ()
{
ImageIcon[] cardslist = new ImageIcon[52];

for (int i = 0; i < 52; ++i)
{
cardslist[i] = new ImageIcon (getClass (). getResource ((this.getImagePath (i))));
}

JComboBox cardsbox = new JComboBox (cardslist);
cardsbox.setSelectedIndex (0);
cardsbox.setEditable (false);

this.mainframe = new JFrame ();
this.mainframe.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
this.mainframe.setSize (150, 150);
this.mainframe.setLayout (null);

cardsbox.setBounds (20, 20, 55, 45);
this.mainframe.add (cardsbox);

this.mainframe.setVisible (true);
}

private String getImagePath (int index)
{
switch (index)
{
case 0: return "images/2c.gif";
case 1: return "images/3c.gif";
case 2: return "images/4c.gif";
case 3: return "images/5c.gif";
case 4: return "images/6c.gif";
case 5: return "images/7c.gif";
case 6: return "images/8c.gif";
case 7: return "images/9c.gif";
case 8: return "images/Tc.gif";
case 9: return "images/Jc.gif";
case 10: return "images/Qc.gif";
case 11: return "images/Kc.gif";
case 12: return "images/Ac.gif";
case 13: return "images/2d.gif";
case 14: return "images/3d.gif";
case 15: return "images/4d.gif";
......................................
default: return null;
}
}

public static void main (String[] args)
{
javax.swing.SwingUtilities.invokeLater (new Runnable ()
{
public void run ()
{
ImagesFromJAR t = new ImagesFromJAR ();
}
});
}
}

2).将图像以 Base64 格式存储在文本文件中:

我将每个图像转换为 Base64 格式,然后存储在一个文本文件中。 Java 代码读取该文件并通过解码文件中的行重新创建图像。之后,创建并显示一个JComboBox:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.ImageIcon;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.io.IOException;

public class CodeFromFile
{
private JFrame mainframe;

public CodeFromFile ()
{
ImageIcon[] cardslist = new ImageIcon[52];

InputStreamReader in = null;
BufferedReader buff;

int index = -1;

try
{
in = new InputStreamReader (new FileInputStream ("card.encodings.txt"));
buff = new BufferedReader (in);

String line;
byte[] ba;

while ((line = buff.readLine ()) != null)
{
if (line.length () < 10)
{
continue;
}

index++;

ba = Base64.decode (line);

cardslist[index] = new ImageIcon (ba);
}
}
catch (IOException e)
{
e.printStackTrace ();
}
finally
{
if (in != null)
{
try
{
in.close ();
}
catch (IOException e2) {}
}
}

JComboBox cardsbox = new JComboBox (cardslist);
cardsbox.setSelectedIndex (0);
cardsbox.setEditable (false);

this.mainframe = new JFrame ();
this.mainframe.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
this.mainframe.setSize (150, 150);
this.mainframe.setLayout (null);

cardsbox.setBounds (20, 20, 55, 45);
this.mainframe.add (cardsbox);

this.mainframe.setVisible (true);
}

public static void main (String[] args)
{
javax.swing.SwingUtilities.invokeLater (new Runnable ()
{
public void run ()
{
CodeFromFile t = new CodeFromFile ();
}
});
}
}

card.encodings.txt的内容是这样的:

2c:
R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXKIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaMQN9DEhgN5MBBA5OtzIHtgEGAJ9qpwLEvjsDAImtsTcIkMo3Ag4DmUAMztSbaajQMAmfCdig4aInDt3pfuyvQTXwMyt19ikiIQA7
3c:
R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXMIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaMowMA5k7B2kEDg22OJ+DT62xNwtbYDsDC5C9OAYkD6Wgw7JFSMKnzp9qqg/aq8gAidc3BQB3j3/jNgINJA3e26+tNfIzK3X4KSIhADs=
4c:
R0lGODlhHgAmALMAAAAAAP///+7u7szMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///yH5BAEAAA8ALAAAAAAeACYAAATC8D1Aq734yhm6/2AIApxonh6FrqLKvp2LGg7ADKtsGpYjoDrR4nIAAlY1i8K4ahCZogSgobhUHYbWMYTIYAqhYCfprSTCWxC5MrycR+nP4YIwtCsEtGk+NQgWAXwMYHosVUU5cSIIdwqIJmIeXV6EhTAskZeWmieZnCmKJwkMmKEiBTalLAINDaSJLAkHDK9QJwWAtKonAgw/urAnCnkBwLYhBm/FtZ2mHQwZCMcoxs0w1ZDOIdhan0Al3iMbZeQZEhEAOw==
5c:
R0lGODlhHgAmALMAAAAAAP///+7u7szMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///yH5BAEAAA8ALAAAAAAeACYAAATA8D1Aq734yhm6/2AIApxonh6FrqLKvp2LGg7ADKtsGpYjoDrR4nIAAlY1i8K4ahCZogSgobhUHYbWMYTIYAqhYCfprSTCWxC5MrycR+nP4YIwtCsEtGk+NQgWAXwMYHosVUU5cSIIdwqIJmIeXV6EhTAskZeWmieZnCmKJgwVS52hIQQWWaaGj4krAwAOCD+vKFIUDpWQpyEHQz5QL12umywMpbyaCAjCLzfOizgBjrYnbQu7yp+dJdwjG2XiGRIRADs=

.. 并且它适用于每张图片/卡片。

3).第三种方法是直接在源代码中将图像存储为 Base64 String。像这样:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.ImageIcon;

public class CodeFromSource
{
private JFrame mainframe;

public CodeFromSource ()
{
ImageIcon[] cardslist = new ImageIcon[52];

byte[] ba;

for (int i = 0; i < 52; ++i)
{
ba = Base64.decode (this.getImageCode (i));
cardslist[i] = new ImageIcon (ba);
}

JComboBox cardsbox = new JComboBox (cardslist);
cardsbox.setSelectedIndex (0);
cardsbox.setEditable (false);

this.mainframe = new JFrame ();
this.mainframe.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
this.mainframe.setSize (150, 150);
this.mainframe.setLayout (null);

cardsbox.setBounds (20, 20, 55, 45);
this.mainframe.add (cardsbox);

this.mainframe.setVisible (true);
}

private String getImageCode (int index)
{
switch (index)
{
case 0: return "R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXKIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaMQN9DEhgN5MBBA5OtzIHtgEGAJ9qpwLEvjsDAImtsTcIkMo3Ag4DmUAMztSbaajQMAmfCdig4aInDt3pfuyvQTXwMyt19ikiIQA7";
case 1: return "R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXMIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaMowMA5k7B2kEDg22OJ+DT62xNwtbYDsDC5C9OAYkD6Wgw7JFSMKnzp9qqg/aq8gAidc3BQB3j3/jNgINJA3e26+tNfIzK3X4KSIhADs=";
case 2: return "R0lGODlhHgAmALMAAAAAAP///+7u7szMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///yH5BAEAAA8ALAAAAAAeACYAAATC8D1Aq734yhm6/2AIApxonh6FrqLKvp2LGg7ADKtsGpYjoDrR4nIAAlY1i8K4ahCZogSgobhUHYbWMYTIYAqhYCfprSTCWxC5MrycR+nP4YIwtCsEtGk+NQgWAXwMYHosVUU5cSIIdwqIJmIeXV6EhTAskZeWmieZnCmKJwkMmKEiBTalLAINDaSJLAkHDK9QJwWAtKonAgw/urAnCnkBwLYhBm/FtZ2mHQwZCMcoxs0w1ZDOIdhan0Al3iMbZeQZEhEAOw==";
case 3: return "R0lGODlhHgAmALMAAAAAAP///+7u7szMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///yH5BAEAAA8ALAAAAAAeACYAAATA8D1Aq734yhm6/2AIApxonh6FrqLKvp2LGg7ADKtsGpYjoDrR4nIAAlY1i8K4ahCZogSgobhUHYbWMYTIYAqhYCfprSTCWxC5MrycR+nP4YIwtCsEtGk+NQgWAXwMYHosVUU5cSIIdwqIJmIeXV6EhTAskZeWmieZnCmKJgwVS52hIQQWWaaGj4krAwAOCD+vKFIUDpWQpyEHQz5QL12umywMpbyaCAjCLzfOizgBjrYnbQu7yp+dJdwjG2XiGRIRADs=";
case 4: return "R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXZIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaNwNiAE+gsTJMDKW3PExpqLgvAw+fmTsLD6MMtr04DwxITA1gNgQAn2KJztbYLky8gDgD3i0GANtqOw0O3w/VNgUAdwQOwNw3Bl5ox6+tNf5mrKhDMIWIEAA7";
case 5: return "R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXGIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaMUwniaCxMIckD2A2j08tCX+2OAO/LQ61w0AFDpmnCgnOQA5IvDsGDai3YZ+t2zEPA9o/hj+uLwtp46+tNewzK3XyKSIhADs=";
case 6: return "R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXYIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaMowPn6CxMG1wBLRgNw4NLguQrbcvDE4tDAm9S0YDCMPEPIxbmTwGC161ajsGDskA24BdfwHHzDECAOUID+gxCw9wAg3l3DtiJOLjr601/TNW1BmYQkQIADs=";
case 7: return "R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXZIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaMghFk5k7CA4DAWJIrbF6aS0OkL44BQClbbqgvy4GyC6DvWrGAH+RANOrMg3QBAwPYDePJLhbxUAGD8vMQAQOn+07A23B4jICJArs969xNf5mrKhDMIWIEAA7";
case 8: return "R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAX4IAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaLgIJDp8BBA1GSKsvDkWfAw9VCA8DvC8FAJ8LDS4NW4A3BMouwi7Exy7TmMlpLUyJL67bLQYApealQbHa1AHpLvDi7C3kAd0u4NE29gHWLdj2yejHzBm0eTeSAbNGzJhAGGVINKuXi8Guh6/i1Mg4Y0WdjylEhAAAOw==";
case 9: return "R0lGODlhHgAmALMAAAAAAP///+7u7szMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///yH5BAEAAA8ALAAAAAAeACYAAAS38D1Aq734yhm6/2AIApxonh6FrqLKvp2LGg7ADKtsGpYjoDrR4nIAAlY1i8K4ahCZogSgobhUHYbWMYTIYAqhYCfprSTCWxC5MrycR+nP4YIwtCsEtGk+NQgWAXwMYHosVUU5cSIIdwqIJmIeXV6EhTAskZeWmieZnCmKIQM9iS9deaUsczipK6uYoSKvrSizUK4ArLe1ubAvtp2xIQcOL54BVQQIb7TDFEvGwp8xJdMjG2XZGRIRADs=";
case 10: return "R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXvIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemNgRlJAtIN6ktg38Cl7KaL0wJMGWlgDcOTjAEY6C6LQVGMl6Jq4IAWzENAMA5yZHSMtXXQdkGzDHOajdFAzADx+WLAH8uYmnsNmXTtwC9yDsHXiQN8vp4MPoUkAeBKQwAQttBIIEXbwFoZFMVZEWdiylEhAAAOw==";
case 11: return "R0lGODlhHgAmAMQAAAAAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABAALAAAAAAeACYAAAXgIAQBZGme6CmOQeu+cAwDrGzfLonvss7/LR/u8AA0CDuh7WB6CHBKGeOEgAJ2RdPCunNQuTIFwLE4lR+H3jWWSKEMsWgr6y4p4msYvTQ93Wd5LwgnCQd9JQV4NoNjBwIMAYwNcIo8ZVVJgTIJhwuYNnIubW6UlUA8oaemqjeprDmaLmUlcA0lDaCxLgMAkC4Nk626LQIAWy0IvsI3xccKCajDAc2PadHMRmRArsUMU8pgMs0BUw0DmdjHgw5IyzbjLUwA7Wo3vOBl4IA2syRwoyQe1HvVqgbBGSvqKEwhIgQAOw==";
case 12: return "R0lGODlhHgAmALMAAAAAAP///+7u7szMzLu7u6qqqpmZmYiIiHd3d2ZmZlVVVURERDMzMyIiIhEREf///yH5BAEAAA8ALAAAAAAeACYAAATR8D1Aq734yhm6/2AIApxonh6FrqLKvp2LGg7ADKtsGpYjoDrR4nIAAlY1i8K4ahCZogSgobhUHYbWMYTIYAqhYCfprSTCWxC5MrycR+nP4YIwtCsEtGk+NQgWAXwMYHosVUU5cSIIdwqIJmIeXV6EhTAskZeWmieZnCmKJgMAeYkvVW9QKAIODD6mKwcIc4+QoSENA6wMsCcFgAFVOJ23H4MdBQAIqiKjFw3MIQm1XZWbIKw/HqNLticL3cYAtR+ZSQ4fZLzXnyMl7e4SZfMZEhEAOw==";
case 13: return "R0lGODlhHgAmAMQAAAAAAP////8AAP8REf8iIv8zM/9ERP9VVf9mZv93d/+IiP+Zmf+qqv+7u//MzP/d3f/u7v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABEALAAAAAAeACYAAAW/YBQBZGme6CmOQeu+cAwDrGzfLonvss4HiJ9vtxAkeMMbhCAQNHZJm6EpIEBw0ZiC2gzesq8Gl7r4ApTMcfPZO9sOairBBm4t40662yZWK8w7W1wGWHs3U01WhTx3eYs8DAJejzwJV1CGP5iamnWcM5kxD4gGDps4BQwBDgQDl3o4C6YtkX+AmhACtrCaD468PwqElDtLD6c8BmzENwllSKExCbsJx8A2CWNzt9hqk22f0OFQNeMxNCIp6uskIiEAOw==";
.........
default: return null;
}
}

public static void main (String[] args)
{
javax.swing.SwingUtilities.invokeLater (new Runnable ()
{
public void run ()
{
CodeFromSource t = new CodeFromSource ();
}
});
}
}

(我不得不删除一些 switch case,因为 StackOverflow 有 30 K 个字符的限制)

这些方法中的每一个都会产生相同的结果,即:

Result

PS:Base64 类只是一些实用类,用于编码/解码 Base64 信息(您可以在下面的链接中找到它)。

如果您想要这方面的所有资源(图像、源代码等),您可以从这里获取它们:Resources

既然我们已经搞清楚了……我想知道这 3 种方法中哪种更好。他们每个人的优点和缺点是什么?我应该使用哪一个?为什么 ?我也在谈论 JAR 文件损坏的可能性。

我唯一不关心的是性能。

最佳答案

  1. 更可取,因为不涉及转换,您的代码可以从类路径中读取它们。这使您的应用程序自包含。损坏不是问题,因为这会使整个应用程序无用 - 不仅是图像文件

  2. 将涉及转换的运行时惩罚(启动时间和内存),并且还会引入配置文件。

  3. 和 2 一样糟糕,但也不太灵活(如果不重新编译就不能更改图像)

关于Java 选择 : Store images in JAR or as Base64 sequence?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9359803/

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