2016-04-08 9 views
1

私は現在、大学プロジェクトのスマートウォッチに保存されているデータを抽出して検索できるツールを作成しています。スキャナがファイル内の外部文字を読み取ることができません

smartwatchが接続されている携帯電話のBluetooth MACアドレスを含むsmartwatchから、特に "Node.db"というファイルを抽出することができました。私は今、この "node.db"ファイルをスキャンしてMACアドレスを出力するよりもスキャナを作成しようとしています。

// Identify the location of the node.txt file  
File file = new File("C:\\WatchData\\node.txt"); 
// Notify the user that Bluetooth extraction has initalized 
Txt_Results.append("Pulling bluetooth data..."); 
     Scanner in = null; 
     try { 
      in = new Scanner(file); 
      while(in.hasNext()) 
      { // Scan till the end of the file 
       String line=in.nextLine(); 
       // Scan the file for this string 
       if(line.contains("settings.bluetooth")) 
       // Print the MAC Address string out for the user 
        System.out.println(line); 
      } 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  

前の関数が.txtにファイルを変換:

これは私が現在持っているコードです。 コードは各行を検索し、 "settings.bluetooth"を検索し、見つかった場合はMACアドレスを含むこの行を出力します。しかし、私はnode.dbファイルのフォーマットがスキャナがこの文字列を見つけるのを止めていると思います。ファイル内のデータの一部がエンコードされていると思います。データの表示例を以下に示します。

Picture of file lines

を、私は、ファイル上でコードを実行すると、プログラムは単純にハングアップしてエラーメッセージを提供しません:私はそれはそれは認識していない黒い文字であると考えています。私はプログラムを20分以上実行しても、まだ成功していません。

私は、ファイルからプリントアウトしようとしています正確なラインを以下に示します。

Line showing MAC Address of paired device

私は、これらのエンコードされた文字なしのテキストファイルにこのコードをテストしていると、コードが仕事をしていることを結論付けることができます。だから私の質問は以下の通りです:

私はそれがファイルをスキャンし続けることができますので、それがファイルに認識されない文字をスキップするスキャナを得ることができる方法はありますか?

ありがとうございます。

+0

エラーが発生しますか? – Hackerdarshi

+0

@Hackerdarshiねえ、そこに。プログラムは単に停止し、エラーメッセージは表示されません。私はこの情報を含むように質問を更新しました。 – JPM

+0

あなたの質問にファイルのいくつかの行(印刷したいものを含め、すべての行ではなく)を含めることができます.... – Hackerdarshi

答えて

1

ここでファイルを提供していないので、ファイルをテストするコードを書くことはできません。あなたのファイルは、Javaがそれをデコードするために使用するものとは異なるエンコーディングを持っているようです。

したがって、入力ストリームに対して異なるエンコード設定を試す必要があります。

通常、次の方法でエンコーディングを指定します。

String encoding = "UTF-8"; // try "UTF-8" first and also change to other encodings to see the results 
Reader reader = new InputStreamReader(new FileInputStream("your_file_name"), encoding); 

Refer to this post for more information。この記事では、ファイルのエンコーディングを検出するコードの記述方法についても説明します。

ところで、暗い背景のファイルに表示されるデコードされた文字は、ASCIIの制御文字です。

テキストビューアアプリケーションのデコード方法を変更して、実際に特定のエンコード方法でテキストを正しく表示できるかどうかを確認することをお勧めします。

UPDATE

他のIOクラスを使用すると、実際に正常に動作しながら、Scannerが動作しないように見えます。

StringBuilder sb = new StringBuilder(); 

try (BufferedReader reader = new BufferedReader(new FileReader("node.txt"))) { 

    String line; 
    while ((line = reader.readLine()) != null) { 
     sb.append(line); 
    } 

} catch (Exception e) { 
    // TODO: handle exception 
} 


int index = sb.indexOf("settings.bluetooth"); 
if (index != -1) 
    System.out.println(sb.substring(index, index + 18)); 

UPDATE

[ファイルからScannerを作成するときには、ファイルからの読み取り時Scannerの内側の方法のいずれかで例外が発生しますだけのように見えます。しかし、入力ストリームを以下のように使用すると、Scannerの中にラップすることさえできます。

try (Scanner s = new Scanner(new FileInputStream("node.txt"))) { 
    while(s.hasNext()) { 
     System.out.println(s.next()); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

UPDATE

このソリューションは、ちょうどあなたのファイルからすべての不正な文字を排除します。

public static void main(String args[]) { 
    String encoding = "UTF-8"; // try "UTF-8" first and also change to other encodings to see the results 

    StringBuilder sb = new StringBuilder(); 
    try(Reader reader = new InputStreamReader(new FileInputStream("node.txt"), encoding)) { 
     int c = -1; 
     while ((c = reader.read()) != -1) { 
      if (eligible(c)) { 
       sb.append((char)c); 
      } 
     } 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 

    int index = sb.indexOf("settings.bluetooth"); 
    if (index >= 0) { 
     System.out.println(sb.substring(index)); 
    } 
} 

public static boolean eligible(int c) { 
    return (c >= 'a' && c <= 'z' || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '.'); 
} 
+0

ファイル全体には約38000行が含まれており、機密データも含まれているため、ファイルのサンプルへのリンクのみを提供できます。しかし、ファイルのサンプルへのリンクはここにあります:http://www.mediafire.com/download/523h456eub8j7c0/node.txt – JPM

+0

@JPM「Scanner」はこのファイルでは機能しません。私はまだその理由を探しています。しかし、私の更新された答えのように 'FileReader'を使っても問題ありません。 –

+0

こんにちは、ありがとうございました。私はちょうどあなたのコードを使用し、 "+18"を "+65"に変更して行全体を確実に表示しなければなりませんでした。しかし、ここに示すように、いくつかのエンコードされたデータを示しています:http://i.imgur.com/92R94rA.png。とにかく四角形を取り除くには?前もって感謝します。 – JPM

関連する問題