2

次のコマンドでレジストリ スナップショットを作成しています: Runtime.getRuntime().exec("REG EXPORT HKLM " + pathVariable + "\HKLM.txt /y");

次に、このファイルを解析して、レジストリ エントリを単一の文字列にグループ化しようとしています。これは、レジストリ エントリが複数の行に分かれていることが多いためです。このコードを使用すると、偶数文字ごとに常に「NUL」文字が取得されます。

String line, concatLine;
Scanner scanner;
try {
    scanner = new Scanner(myFile);
    line = null;
    concatLine = "";
    while(scanner.hasNextLine()){
        line = scanner.nextLine();
        if(line !=null && !(line.isEmpty())){
            concatLine += line;
        }
        else if(!(concatLine.equals(""))){
            System.out.println(concatLine);
            concatLine = "";
        }
            }
} catch (IOException e) {//Catch I/O Exceptions
            System.err.println(e);
}

NP++ でスキャンする前にファイルを見ていますが、「NUL」文字はありませんが、これらの連結行をファイルに書き込むと、ファイル全体で予想される各文字の間にそれらが含まれます。

4

1 に答える 1

0

問題を理解するための検索で、Java の読み取りと書き込みのパラクティクスに出くわしました。これは間違いなく調べる価値があります。それとは別に、初期のコメントは正しかったようです。ファイルが UTF-16 ストリームとして開かれ、そのように書き込まれた場合、出力にはヌル文字が含まれません。ところで、レジストリ ダンプ内のエスケープされた改行にも対処する必要があります。 、」。

以下に例を示します。


import java.io.*;
import java.util.*;
import static java.lang.System.out;
public class ReadReg {
    public static void main(String[] argv){
        String line=null; StringBuilder sb = new StringBuilder();
        Scanner scanner; 
        FileOutputStream fos; 
        BufferedOutputStream bos; OutputStreamWriter fosw;
        try {
            scanner = new Scanner(new File("hklm-hw.txt"), "UTF-16");
            fos  = new FileOutputStream("hklm-hw.cat.txt");
            bos  = new BufferedOutputStream(fos);
            fosw = new OutputStreamWriter(bos, "UTF-16");
            while (scanner.hasNextLine()) {
                sb.append( line = scanner.nextLine());
                if (line.isEmpty()) {
                    sb.append("\n");
                }
            }
            if (null != scanner.ioException()) {
                out.format("scanner ioe:\n\t%s\n", scanner.ioException().getMessage());
                //scanner.ioException().printStackTrace();
            }
            fosw.write( sb.toString(), 0, sb.length());
            fosw.flush();
            fosw.close();
            scanner.close();
        } catch (IOException io) {
            io.printStackTrace();
        }
    }
}

出力:


$ javac ReadReg.java  && java ReadReg ; file *
hklm-hw.cat.txt: Big-endian UTF-16 Unicode text, with very long lines
hklm-hw.txt:     Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
ReadReg.class:   compiled Java class data, version 50.0 (Java 1.6)
ReadReg.java:    C source, ASCII text
于 2012-10-18T13:46:41.563 に答える