java - 使用扫描仪解析文本文件时,为什么我在每个预期字符之间得到空字符?

标签 java file-io null registry java.util.scanner

我正在使用以下命令创建注册表快照: 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”字符,但如果我将这些连接的行写入文件,整个文件在每个预期字符之间都有它们。

最佳答案

在我寻找理解我遇到的问题的过程中 Java reading and writing paractices 这绝对值得一看。除此之外,早期的评论似乎是正确的。如果文件作为 UTF-16 流打开并写入,则输出没有空字符。顺便说一句,您还需要处理注册表转储中的转义换行符,因为如果不这样做,您最终会得到类似:“00,00,\00”的内容,而您应该在其中使用“00,00,00 ”。

这是一个例子:


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

关于java - 使用扫描仪解析文本文件时,为什么我在每个预期字符之间得到空字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945238/

相关文章:

java - 如何将自定义的 CellEditorListener 添加到我的 JTable 中?

java - Android Deeplink 两次打开应用

java - Mapstruct没有在springboot中生成映射器类

c++ - 使用 const std::string& 作为方法参数类型时,处理 nullptr const char* 的正确方法是什么?

java - 如何将 null 转换为 int 而不转换为整数?

R:创建一个带有 NULL 值的 data.frame

java - 如何通过 GMail API 使用 GSUITE 组 ID 发送电子邮件?

java - 从文本文件读取,记录用空行分隔(java)

c - 如何从文件中读取字符串并将其标记为数组?

ruby - 如何在 ruby​​ 中的特定行开始读取大文件