How can an app use files inside the JAR for read a

2018-12-31 02:51发布

I need to store data into files inside .jar file and read it again.

I know that I can use Class.getResourceAsStream() method but it returns an InputStream that I can read from. But I look for a way to write.

5条回答
ら面具成の殇う
2楼-- · 2018-12-31 03:22

I need to store data into files inside .jar file and read it again

No you don't.

Instead store the 'default' file inside the Jar. If it is changed, store the altered file in another place. One common place is a sub-directory of user.home. When checking for the file, first check the existence of an altered file on the file system, and if it does not exist, load the default file.


Note that it is generally better to describe the goal, rather than the strategy. 'Store changed file in Jar' is a strategy, whereas 'Save preferences between runs' might be the goal.

Related: What is the XY problem?

查看更多
无色无味的生活
3楼-- · 2018-12-31 03:22

You can manipulate any jar file using the package java.util.jar (or indeed just java.util.zip). As files inside a jar will be compressed, this isn't the most time efficient way for you to store data.

You should probably use a directory somewhere else (e.g. System.getProperty("user.home") + "/.myProgram") or see java.util.prefs.

查看更多
唯独是你
4楼-- · 2018-12-31 03:30

Class.getResource() returns a URL. Theoretically, you can use this URL to create your InputStream and OutputStream. But in most cases, the generated JAR is a read-only file (or archive). So your application might trip when trying to use it.

查看更多
旧人旧事旧时光
5楼-- · 2018-12-31 03:37

This is not really supported. In principle, you could operate on the jar file, but there's no guarantee the new contents would be correctly loaded. Let your build tools manage the jar file -- and choose something else for persistent storage managed by your program itself. Like a file.

查看更多
妖精总统
6楼-- · 2018-12-31 03:37

It is unlikely that you can change a loaded jar safely. Changing it while it is being used is not a good idea.

If you want to do this, use a plain file system directory and add/remove files from it. Even this may not work as you expect.

查看更多
登录 后发表回答