首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java、ByteBuffer解析文件中的数据

java、ByteBuffer解析文件中的数据
EN

Stack Overflow用户
提问于 2011-02-09 04:02:41
回答 3查看 4.6K关注 0票数 0

在java中,我想要快速解析包含异构数据(数字和字符)的文件。

我一直在读关于ByteBuffer和内存映射文件的文章。

我可以复制它,但在解析数据时就会变得很棘手。我想分配不同的字节。但是它会变得依赖编码吗?

如果文件的格式为,例如:

someString 8

some other string 88

如何将其解析为StringInteger对象?

谢谢!

乌多。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-09 04:11:24

假设您的格式类似于

代码语言:javascript
复制
{string possibly with spaces} {integer}\r?\n

您需要搜索换行符,然后向后搜索,直到找到第一个空格。您可以自己解码数字并将其转换为int,或者将其转换为字符串并对其进行解析。除非迫不得已,否则我不会使用Integer。现在您知道了行的开始位置和整数的开始位置,您可以提取字节形式的字符串,并使用所需的编码将其转换为字符串。

这里假设换行符和空格是编码中的一个字节。如果它们是多字节的,这将会更加复杂,它仍然可以做到。

编辑:下面的示例打印...

代码语言:javascript
复制
text: ' someString', number: 8
text: 'some other string', number: -88

代码

代码语言:javascript
复制
ByteBuffer bb = ByteBuffer.wrap(" someString 8\r\nsome other string -88\n".getBytes());
while(bb.remaining()>0) {
    int start = bb.position(),end, ptr;
    for(end = start;end < bb.limit();end++) {
        byte b = bb.get(end);
        if (b == '\r' || b == '\n')
            break;
    }
    // read the number backwards
    long value = 0;
    long tens = 1;
    for(ptr = end-1;ptr>= start;ptr--) {
        byte b = bb.get(ptr);
        if (b >= '0' && b <= '9') {
            value += tens * (b - '0');
            tens *= 10;
        } else if (b == '-') {
            value = -value;
            ptr--;
            break;
        } else {
            break;
        }
    }
    // assume separator is a space....
    byte[] bytes = new byte[ptr-start];
    bb.get(bytes);
    String text = new String(bytes, "UTF-8");
    System.out.println("text: '"+text+"', number: "+value);

    // find the end of the line.
    if (bb.get(end) == '\r') end++;
    bb.position(end+1);
}
票数 2
EN

Stack Overflow用户

发布于 2011-02-09 04:09:49

你可以这样尝试:

代码语言:javascript
复制
CharacterIterator it = new StringCharacterIterator(StringBuffer.toString());
for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
    if (Character.isDigit(c)) {
        // character is digit
    } else {
        // character is not-digit
    }
}

或者,如果您愿意,也可以使用regex

代码语言:javascript
复制
String str = StringBuffer.toString();
String numbers = str.replaceAll("\\D", "");
String letters = str.replaceAll("\\W", "");

然后,需要像往常一样对字符串numbers中的字符执行Integer.parseInt()

票数 1
EN

Stack Overflow用户

发布于 2011-02-09 04:51:01

你在找java.util.Scanner吗?除非您有非常奇特的性能需求,否则应该足够快:

代码语言:javascript
复制
    Scanner s = new Scanner(new File("C:\\test.txt"));
    while (s.hasNext()) {
        String label = s.next();
        int number = s.nextInt();

        System.out.println(number + " " + label);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4937752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档