我的文本文件很少。每个文本文件都包含一些路径和/或其他文件的引用。
File1中
#file#>D:/FilePath/File2.txt
Mod1>/home/admin1/mod1
Mod2>/home/admin1/mod2
文件2
Mod3>/home/admin1/mod3
Mod4>/home/admin1/mod4
我想要的是,通过仅提供Mod1, Mod2, Mod3, Mod4
作为我的java程序的输入,将所有路径File1.txt
复制到另一个文本文件中。
到目前为止我做了什么?
public void readTextFile(String fileName){
try {
br = new BufferedReader(new FileReader(new File(fileName)));
String line = br.readLine();
while(line!=null){
if(line.startsWith("#file#>")){
String string[] = line.split(">");
readTextFile(string[1]);
}
else if(line.contains(">")){
String string[] = line.split(">");
svnLinks.put(string[0], string[1]);
}
line=br.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}
}
目前我的代码仅读取File2.txt
的内容,控件不会返回File1.txt
。
请询问是否需要更多输入。
答案 0 :(得分:0)
看起来很简单。我们需要在填充svnLinks
Map
后编写您的文件,假设您现有的代码正常工作(在其中看不到任何太奇怪的东西)。
因此,一旦填充了Map
,您就可以使用以下内容:
File newFile = new File("myPath/myNewFile.txt");
// TODO check file can be written
// TODO check file exists or create
FileOutputStream fos = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
fos = new FileOutputStream(newFile);
osw = new OutputStreamWriter(fos);
bw = new BufferedWriter(osw);
for (String key: svnLinks.keySet()) {
bw.write(key.concat(" my separator ").concat(svnLinks.get(key)).concat("myNewLine"));
}
}
catch (Throwable t) {
// TODO handle more gracefully
t.printStackTrace();
if (bw != null) {
try {
bw.close();
}
catch (Throwable t) {
t.printStackTrace();
}
}
答案 1 :(得分:0)
首先,您在没有关闭当前阅读器的情况下跳转到另一个文件,当您回来时,您将丢失光标。首先读取一个文件,然后写入与另一个文件匹配的所有内容。关闭当前阅读器(不要关闭编写器),然后打开下一个要阅读的文件,依此类推。
答案 2 :(得分:0)
以下是您的方法的非递归实现:
public static void readTextFile(String fileName) throws IOException {
LinkedList<String> list = new LinkedList<String>();
list.add(fileName);
while (!list.isEmpty()) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(new File(list.pop())));
String line;
while ((line = br.readLine()) != null) {
if (line.startsWith("#file#>")) {
String string[] = line.split(">");
list.add(string[1]);
} else if (line.contains(">")) {
String string[] = line.split(">");
svnLinks.put(string[0], string[1]);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
br.close();
}
}
}
只需使用 LinkedList 来维护订单。如果你要将文件的读数限制在一定的数量(深度),我建议你添加一些计数器。例如:
while (!list.isEmpty() && readCount < 10 )
这将消除将代码运行到无穷大的可能性(在循环引用的情况下)。