我想在我的 Java 代码中序列化一些对象。我不想把它放在硬盘上的某个随机文件夹中。我希望它位于我的 eclipse 项目文件夹中的 A FOLDER 中。如何制作此文件夹并将我的对象存储在其中?
这是一个好习惯吗?如果我尝试从这个项目中制作一个独立的 JAR,会有问题吗?
我想在我的 Java 代码中序列化一些对象。我不想把它放在硬盘上的某个随机文件夹中。我希望它位于我的 eclipse 项目文件夹中的 A FOLDER 中。如何制作此文件夹并将我的对象存储在其中?
这是一个好习惯吗?如果我尝试从这个项目中制作一个独立的 JAR,会有问题吗?
下面的源代码显示了如何在当前目录中创建子文件夹:
import java.io.File;
public class SourceCodeProgram {
public static void main(String argv[]) throws Exception {
File currentFolder = new File(".");
File workingFolder = new File(currentFolder, "serialized");
if (!workingFolder.exists()) {
workingFolder.mkdir();
}
System.out.println(workingFolder.getAbsolutePath());
}
}
当您运行此源代码并刷新 Eclipse 项目时,您应该会serialized
在 Eclipse 项目结构中看到目录。现在您可以使用它并将所有文件存储在其中。
在我的应用程序中,当我想在硬盘中存储一些数据时,我总是使用用户推荐。我创建application.properties
包含密钥的文件:
working.folder=/example/app-name
应用程序在开始时读取此文件并在需要时创建此文件夹。第二种解决方案可以是“应用程序参数”。当我只需要用户的一两个参数时,我会从命令行读取它。例如,用户使用该命令运行我的应用程序:
java -jar app.jar -dir /example/app-name
当用户不提供任何文件夹时,我使用默认文件夹 -当前目录。
有用的网址:
这取决于那些可序列化对象有什么信息。
此外,如果您想在代码库中拥有一个文件夹(但仅作为文件夹部署),您可以编写代码、写入或读取文件:
URL dir_url = ClassLoader.getSystemResource(dir_path);
// Turn the resource into a File object
File dir = new File(dir_url.toURI());
// List the directory
String files = dir.list()
注意目录应该在类路径中。
脚步:
这将创建一个文件夹,当从 Eclipse 中运行时,该文件夹应该可以从您的工作目录访问。
在运行时摆弄 JAR 文件中的文件是个坏主意。想象一个场景,当有两个或多个 JVM 运行相同的 JAR 时,这也意味着它们使用相同的文件并且读取/写入这些文件可能会导致冲突。您通常希望将这些文件彼此分开。
因此,除非这些文件是只读的,否则不应将它们包含在 JAR 中(否则没问题)
写入用户目录不是更好吗,例如在子文件夹中.myApp/
?
你会做这样的事情来设置/初始化目录:
File userDir = new File(System.getProperty("user.home"));
File storageDir = new File(userDir, ".myApp");
if (!storageDir.exists())
storageDir.mkdir();
// store your file in storageDir
看看这里找出userDir
通常位于的位置(尽管您不一定需要关心)。
如果您在 Eclipse 中启动程序,则默认情况下,进程的当前工作目录将是项目的根目录。然后你可以像这样初始化和使用serialized
在你的项目的根目录中命名的目录:
File serializedDir = new File("serialized");
if (!serializedDir.exists()) {
serializedDir.mkdir();
}
代码中的相对路径将是相对于工作目录的,默认情况下是项目的根目录。您可以在启动器配置中更改默认工作目录。
这是否是一个好的解决方案取决于您的项目。如果您不想/不需要与其他人共享序列化对象,那么我认为这没有任何问题。
当使用 Eclipse 的 Export 功能从项目创建 jar 时,请记住默认情况下会选择该文件夹。您必须明确取消选择它才能从 jar 中排除。(无论如何,最好使用 Maven 或 Ant 来生成 jars 而不是 Eclipse,您只需配置一次,因此无需担心目录被意外包含。)
您可能还想从版本控制中排除该目录。
为此,您需要两件事:A)访问/创建特定文件夹 B)实际序列化您的对象并将它们保存到磁盘。
对于A),这里的其他答案肯定会回答这个问题,这些答案显示了如何:1)检查文件夹是否存在。2) 如果文件夹不存在,则创建该文件夹。此外,在 eclipse 中启动的项目将 eclipse 项目文件夹作为工作目录。
对于 B),您需要使用 FileOutputStream 序列化您的对象。请参阅http://www.tutorialspoint.com/java/java_serialization.htm。您可以将每个对象序列化到一个单独的文件中,也可以使用包含对所有对象的引用的 ArrayList(或其他一些数据结构)创建一个类。
下面的示例类使用静态方法执行您所要求的操作,因为我不想实例化一个对象。此外,您需要在 eclipse 项目中按 F5 来刷新包资源管理器并查看新文件夹和文件。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class CreateDirAndSerialize {
public static void main(String args[])
{
ArrayList<String> sampleString = new ArrayList<String> ();
sampleString.add("Test1");
sampleString.add("Test2");
sampleString.add("Test2");
//Get the directory
File directory = getSerializedDirectory();
writeObjects(directory, sampleString);
}
public static void writeObjects(File directory, Object object)
{
try
{
FileOutputStream fileOut =
new FileOutputStream(directory+"//serializedData");
ObjectOutputStream out =
new ObjectOutputStream(fileOut);
out.writeObject(object);
out.close();
fileOut.close();
}catch(IOException i)
{
i.printStackTrace();
}
}
public static File getSerializedDirectory()
{
File serializedDir = new File("serialized");
if (!serializedDir.exists()) {
serializedDir.mkdir();
}
return serializedDir;
}
}
作为 eclipse 中的项目所指的问题,以上内容适用于 eclipse 项目中的代码。如果您想与 Eclipse 本身进行交互,我们正在谈论 eclipse 插件开发,这完全是另一回事,因此您需要指定它。
最后,您还可以创建一个自定义类来保存您想要的任何变量,并实例化一个包含所有其他对象的单例对象。然而,在序列化对象时有一些限制,例如: - 带有静态修饰符的对象引用是不可序列化的。
有关一些可序列化的一些规则/提示,请参阅此:http ://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208
您可以忽略 Eclipse 并以编程方式或手动创建目录(和其中的文件)。
然后,在 Eclipse 中刷新您的项目资源管理器视图,瞧,目录和文件是视图的一部分。