我想在App中添加一个功能,用户可以永久更改机器IP方案(IP,SubnetMask,DefaultGateway),所以我想在Linux网络配置文件上进行读/写操作(" / etc / network / interfaces")使用以下代码。
File file = new File("/etc/network/interfaces");
boolean exists = file.exists();
String line = "";
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
try
{
FileReader fr = new FileReader(file.getAbsoluteFile());
//BufferedReader br = new BufferedReader(fr);
Scanner scan = new Scanner(new FileInputStream(file));
if(exists)
{
while(scan.hasNext()) //while((line = br.readLine()) != null)
{
// Any Write operation
}
scan.close(); // br.close
}
}
bw.close();
问题是对while()循环的检查会一直返回false。 我做了一些研究,包括使用BufferedReader或Scanner来读取文件,但没有工作。以下所有检查都会继续返回false。
while(scan.hasNext())
while(scan.hasNextLine())
while((line = br.readLine()) != null)
尽管文件确实存在,但它包含其内容但每次我尝试使用上面的代码阅读它时,所有文件内容都会被删除,文件将变空。
我错过了什么吗?还有更好的选择吗?我也尝试在同一目录中读取另一个文件,该文件具有对所有用户的完全读/写/执行权限但仍然是相同的结果
答案 0 :(得分:1)
因为我正在尝试打开文件进行写入和读取是导致问题的原因并且循环在开始时被终止。因此,事实证明您不应在FileWriter
之前使用FileReader
来获取相同的文件。这样做同时导致文件读取器读取空文件并且循环终止,因为它在开始时获得EndOfFile。之后它将文件关闭,因此其所有内容都将丢失。
更好的方法是
注意:如果文件大小相当小以适应文件处理时间,这是合适的。
File file = new File("/etc/network/interfaces");
boolean exists = file.exists();
Scanner scanner = null;
PrintWriter wirtter = null;
String line = "";
List<String> fileLines = new ArrayList<String>();
if(exists)
{
try {
scanner = new Scanner(new FileInputStream(file));
while(scanner.hasNextLine())
{
line = scanner.nextLine();
fileLines.add(line);
if(line.trim().startsWith("iface eth0 inet static"))
{
while(scanner.hasNextLine())
{
line = scanner.nextLine();
fileLines.add(line);
if(line.trim().startsWith("address"))
{
String updateStr = "\taddress "+ipAddress+"\t";
fileLines.remove(fileLines.size()-1);
fileLines.add(updateStr);
System.out.println("IP add updated");
}
else if(line.trim().startsWith("netmask"))
{
String updateStr = "\tnetmask "+subnetMask+"\t";
fileLines.remove(fileLines.size()-1);
fileLines.add(updateStr);
System.out.println("subnet add updated");
}
else if(line.trim().startsWith("gateway"))
{
String updateStr = "\tgateway "+defaultGateway+"\t";
fileLines.remove(fileLines.size()-1);
fileLines.add(updateStr);
System.out.println("Gatway add updated");
}
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
finally{
if(scanner != null)
scanner.close();
}
现在单独写作。此外,您还想重新启动网络服务
try {
wirtter = new PrintWriter(file);
for (String lineW : fileLines)
wirtter.println(lineW);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
finally{
if(wirtter != null)
wirtter.close();
}
}
synchronized (p) {
String cmd = "sudo /etc/init.d/networking restart ";
p.exec(cmd);
p.wait(10000);
System.out.println("finishing restart 'Networking:' service");
}