2017-01-18 5 views
-1

ユーザーがマシンIPスキーム(IP、SubnetMask、DefaultGateway)を永久に変更できる機能をアプリケーションに追加したい次のコードを使用してLinuxネットワーク構成ファイル( "/ etc/network/interfaces")で読み取り/書き込み操作を実行します。コードを使って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

このファイルを開くための管理者特権がないためだと思います。たぶん良いスタートを読む:http://stackoverflow.com/questions/36828036/is-there-a-way-for-a-java-app-to-gain-root-permissions –

+0

解決策を再考する必要があります – rkosegi

+0

IすでにIp/Subnet(sudo ifconfig eth0 new_ip netmask new_subet)を変更して永久に行うコマンドをコードで直接実行しようとしました。しかし残念なことにDefaultGatewayではなく、(sudoルートはデフォルトのgw new_gwを追加します)。マシンが再起動すると、 'interfaces'ファイルからマシンがロードされます。 スクリプトの使用は私にとってはオプションではありません。 他の解決策がありますか?それを感謝します。ありがとう – AlphaTry

答えて

0

書き込みと読み取りのファイルを開こうとすると、問題とループは最初に終了します。したがって、同じファイルに対してFileReaderの前にFileWriterを使用しないでください。そうすることによって、FileReaderが空のファイルを読み込み、ループが終了したときにEndOfFileが最初に取得されます。その後、それは空のファイルを閉じ、その内容はすべて失われています。

良い方法だけで「読む」のファイルを開いてまず

  • することでした。
  • ファイルを1行ずつスキャンする&各行のバッファを解析します(私の場合はリスト)。
  • マーカーライン&に更新されたときに、更新するコンテンツをファイルに追加してバッファリングすることもできます。
  • は今「書き込み」あなた更新リストにファイルを開くことが

注:ファイルサイズはファイルの処理時間を収容するために合理的に小さい場合これが適しています。

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"); 

} 
関連する問題