1

書き直す必要があるパケット サイズの膨大な長いリストがありますが、これを手作業で行いたくないので、そのためのプログラムを作成します。

public static OutcommingPacket aClass198_1993 = new OutcommingPacket(68, 8);

これは、行の 1 つの例です。私がする必要があるのは、プログラムを 68 に移動させ、それをパケット文字列に格納し、数値 8 を取得して、それをサイズ文字列に格納することです。

これまでの私のコードは次のとおりです。

public class PacketSizeFixer {

public static final String IN = "./out/OldPacketSizes.txt";
public static final String OUT = "./out/PacketSizesFormatted.txt";

public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader(IN));
    BufferedReader writer = new BufferedReader(new FileReader(OUT));

    String line;
    String packet, size;
    while ((line = reader.readLine()) != null) {
        packet = line.substring(line.indexOf("new OutcommingPacket(", line.indexOf(", ")));
        size = line.substring(line.indexOf(", "), line.indexOf(");"));
    }
}

}

範囲外の文字列インデックスを取得し続けるため、正しい方法で実行しているかどうかはわかりません

助けてください!

ところで、すべてのパケットが同じ名前を持つわけではなく、長いものも短いものもあり、パケットは 2 桁になる可能性があり、サイズも同じです。助けてください!

4

3 に答える 3

3

私はここで多くのことを想定しています...

while ((line = reader.readLine()) != null) {
    String pair = line.substring(line.lastIndexOf("("), line.lastIndexOf(")"));
    String values[] = pair.split(","); //values[0] == packet, values[1] == size
}
于 2012-07-12T00:25:18.063 に答える
3

このエラーは、探している部分文字列が見つからない (-1 を返す) ために発生する可能性がありsubstring、返されたインデックスを確認せずに呼び出します。
試す:

int index1 = line.indexOf("new OutcommingPacket(");
int index2 = line.indexOf(", ");
if (index1 > -1 && index2 > index1)
   packet = line.substring(index1, index2 - index1);
//same for the rest
于 2012-07-12T00:22:05.280 に答える
2

あなたの例から、抽出したい情報は次のように聞こえます:

#,#

では、正規表現を使用しないのはなぜですか?

CharSequence inputStr = "new OutcommingPacket(68, 8)";

String patternStr = "(\\d+),(\\d+)";

// Compile and use regular expression
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.find();

if (matchFound) {
    // Get all groups for this match
    for (int i=0; i<=matcher.groupCount(); i++) {
        String groupStr = matcher.group(i);
    }
}

注: 私はこの正確なパターンをテストしていませんが、少なくとも正しいに近いはずです...

于 2012-07-12T00:32:00.660 に答える