java 对 jar内的某个txt文件进行读 写

shewa 发布于 2012/12/07 10:11
阅读 3K+
收藏 2

【DevOps必读】产品经理与程序员之间如何破局?>>>

本人java小菜。基本之前没怎么用过java,但是现在要做点事,必须用java,因为是引用人家提供的一个jar包进行开发。

问题是这样的:我想对人家提供的jar包里的某个txt文件进行读 和  写。

人家提供一个jar包,里面有一些.class 文件父类和txt文件是数据。父类中有对制定名字的txt文件进行读取并运算的功能。

现在我想继承父类,然后做点自己的事。我要对一些新的数据进行运算,所以,我必须先将我的数据替换掉jar包内的txt文件的内容。然后再进行操作。


举例来说:人家给我一个jar包,里面有个.class 能实现两个数相加的功能。但是相加的两个数,必须从jar包中的input.txt进行读写。我要写个实现3个数相加的函数。然后我必须也要从input.txt里读参数。于是,我得对input.txt进行改写,用程序自动完成。但是,input.txt在jar包内,怎么改写啊?


不知道问题描述清楚没啊。。。在线等啊。您回复会及时发到我的邮箱啊。一直在关注啊。。。谢谢各位啦。

以下是问题补充:

@shewa:还有一个问题,在程序运行过程中,jar是被加载到虚拟机里的,是否对其写会涉及到锁的问题? 我现在在网上查,用InputStream is=this.getClass().getResourceAsStream("my.txt");能对jar内的文件进行读取了 (2012/12/07 10:40)
加载中
0
缪斯的情人
缪斯的情人
直接贴代码吧:
  try {
// 判断目录是否存在
File baseDir = new File(baseDirName);
if (!baseDir.exists() || !baseDir.isDirectory()) {
System.out.println("文件查找失败:" + baseDirName + "不是一个目录!");
} else {
String[] filelist = baseDir.list();
for (int i = 0; i < filelist.length; i++) {
if (filelist[i].contains("txtjar")) {//查找含有你的txt的jar包
JarFile localJarFile = new JarFile(new File(baseDirName
+ File.separator + filelist[i]));
Enumeration<JarEntry> entries = localJarFile.entries();
while (entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
String entryName = jarEntry.getName();
if (jarEntry.isDirectory()) {
// System.out.println(entryName);
} else if (entryName.endsWith(".txt")) {
//在此处找到你的txt进行处理 }
}
}
}
}

} catch (IOException e) {
e.printStackTrace();
}
写的话麻烦些,需要解压后修改完了再打成jar包,直接用解压软件解压即可,修改完成后用命令行或者eclipse导成新jar
0
Z
ZYud
感觉应该是只能读吧,没有听说可以写jar中的文件,除非是使用zip功能,写jar中的文件.
shewa
shewa
zip什么功能?有具体一点的介绍吗?
0
shewa
shewa

引用来自“缪斯的情人”的答案

直接贴代码吧:
  try {
// 判断目录是否存在
File baseDir = new File(baseDirName);
if (!baseDir.exists() || !baseDir.isDirectory()) {
System.out.println("文件查找失败:" + baseDirName + "不是一个目录!");
} else {
String[] filelist = baseDir.list();
for (int i = 0; i < filelist.length; i++) {
if (filelist[i].contains("txtjar")) {//查找含有你的txt的jar包
JarFile localJarFile = new JarFile(new File(baseDirName
+ File.separator + filelist[i]));
Enumeration<JarEntry> entries = localJarFile.entries();
while (entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
String entryName = jarEntry.getName();
if (jarEntry.isDirectory()) {
// System.out.println(entryName);
} else if (entryName.endsWith(".txt")) {
//在此处找到你的txt进行处理 }
}
}
}
}

} catch (IOException e) {
e.printStackTrace();
}
写的话麻烦些,需要解压后修改完了再打成jar包,直接用解压软件解压即可,修改完成后用命令行或者eclipse导成新jar
问题是这样,我的程序在运行的时候,加载了jar包。我是边运行我的程序,边修改被加载的jar包的内容。
首先感谢您的回答,这么快就有答复,OSC真给力。
如果按照您说的,修改完了重新打包成jar,可能不好使。
还有,您能稍微再完善一下您的代码吗?比如,我就是想往名为myjar的jar包中,folder/1.txt中写一行“I love OSC”。您能稍微改写一下您的程序吗?我是小菜,目前只能参考别人的程序来改写。。。所以。。麻烦了。
缪斯的情人
缪斯的情人
我提供的代码可以按照你的jar名字查找某一个jar包的,看注释。你如果是动态修改jar中的内容,那估计java办不到
0
震秦
震秦

你修改的是jar文件中的file.txt文件而不是class.JarURLConnection可以办到.


@Test
    public void testUri() throws Exception {
        URL url = new URL("jar:file:E:/dubbo-2.5.3.jar!/META-INF/MANIFEST.MF");
        JarURLConnection jarConnection = (JarURLConnection)url.openConnection();
        InputStream in = jarConnection.getInputStream();//("!/META-INF/MANIFEST.MF"));
        System.out.println(IOUtils.copy(in, System.out));
    }
有了jarConnection你可以取得InputStream和OutputStream了.


shewa
shewa
您好,前两天我有点急事,没来的急试。今天试了一下,发现这个只能获取InputStream ,不能获取OutputStream.抛出异常如下:java.net.UnknownServiceException: protocol doesn't support output at java.net.URLConnection.getOutputStream(Unknown Source)
Z
ZYud
回复 @shewa : 更简单的写是 InputStream is=this.getClass().getResourceAsStream("/sgip/test.txt");
Z
ZYud
回复 @shewa : 只支持读,不支持写.修改还是需要使用zip
shewa
shewa
十分感谢,我试一下。嘿嘿。
0
丁加砙
丁加砙

怎么会有这么奇葩的需求?

那个input.txt既然不是只读的,放到jar包里做什么?

既然放到jar包里了,那就是只读的,你把它的内容copy出来放到一个资源文件里,然后操作这个资源文件不行吗,为什么一定要修改jar包?

0
shewa
shewa

引用来自“sherlokk”的答案

怎么会有这么奇葩的需求?

那个input.txt既然不是只读的,放到jar包里做什么?

既然放到jar包里了,那就是只读的,你把它的内容copy出来放到一个资源文件里,然后操作这个资源文件不行吗,为什么一定要修改jar包?

嘿嘿,是这样的。这个是人家发布的,里面有函数,有数据。数据是放在txt里的。我现在想测试更多的数据。但是,人家在程序中写死了,数据只能从jar中的几个文件内读取。所以,有了这个奇葩的需求。
丁加砙
丁加砙
把input.txt从jar包中移出来,放到同名目录下。 比如它是com.osc.input.txt。你就在自己的项目路径下创建com.osc,然后把input.txt从那个jar包里移出来,放到这个目录下。
返回顶部
顶部