【Java】文字列から0x00を削除する方法まとめ|初心者向けサンプル付き解説

お疲れ様です。はるさらと申します。

Javaで文字列を扱っていると、
意図せず「0x00」(ヌル文字)が混ざってしまうことがあります。

これはファイル入出力や外部システムとの連携時に発生しやすく、
そのままでは処理がうまく動作しないケースも少なくありません。

本記事では、Javaで文字列から0x00を削除する方法をサンプルコード付きで解説します。
基本的な方法から実務でよく使うケース、代替手法の比較まで幅広く紹介します。

関連記事:


0x00が文字列に含まれる原因とは?

「0x00」は16進数で表現されるヌル文字(NULL character, \u0000を意味します。
この文字が文字列に含まれる原因には以下があります。

  • バイナリファイルを文字列として読み込んだ
  • C言語など他言語とのデータ連携
  • データベースや通信での終端文字が混入

JavaのStringは内部的にヌル文字を保持できますが、
出力や処理で予期せぬ不具合を引き起こすことがあります。


基本例:replaceで0x00を削除する

もっともシンプルな方法はString#replaceを使うことです。

public class RemoveNullExample {
    public static void main(String[] args) {
        String text = "Hello\u0000World";
        String result = text.replace("\u0000", "");
        System.out.println(result); // HelloWorld
    }
}

ここでは \u0000 を空文字に置換して、文字列から削除しています。
シンプルで直感的に理解できる方法です。


実務利用例:trimでは削除できないケースに注意

「文字列の不要な空白を削除する」という発想で
trim()を使うことも考えられますが、0x00は削除されません。

public class TrimTest {
    public static void main(String[] args) {
        String text = "\u0000Hello\u0000";
        String result = text.trim();
        System.out.println("[" + result + "]"); // [Hello?] (先頭の0x00は残る)
    }
}

trim()空白や改行などのホワイトスペースを対象としますが、
ヌル文字は対象外です。
そのため、replaceや正規表現を使う必要があることを覚えておきましょう。


代替手法の比較:正規表現やバイト処理での削除

1. 正規表現を使う方法

正規表現を利用すれば、複数の制御文字をまとめて削除できます。

public class RegexExample {
    public static void main(String[] args) {
        String text = "A\u0000B\u0001C";
        String result = text.replaceAll("\\x00", "");
        System.out.println(result); // AB\u0001C(0x00のみ削除)
    }
}

\\x00 を指定すれば0x00だけ削除できますし、
[\\x00-\\x1F] と範囲を指定すれば制御文字全体を除去できます。


2. バイト配列として処理する方法

場合によってはStringではなくbyte[]として処理し、
不要な0x00を取り除く方法も有効です。

import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class ByteArrayExample {
    public static void main(String[] args) {
        byte[] data = "Test\u0000Data".getBytes(StandardCharsets.UTF_8);
        byte[] cleaned = Arrays.stream(data)
                               .filter(b -> b != 0x00)
                               .collect(StringBuilder::new,
                                       (sb, b) -> sb.append((char) b),
                                       StringBuilder::append)
                               .toString()
                               .getBytes(StandardCharsets.UTF_8);

        System.out.println(new String(cleaned, StandardCharsets.UTF_8));
        // 出力: TestData
    }
}

こちらはやや複雑ですが、バイナリデータを扱う際には役立ちます。


注意点と間違えやすいポイント

  • trim()では0x00を削除できない
    ホワイトスペース処理と混同しないようにする。
  • バイナリデータを文字列に変換するときに混入しやすい
    そのまま表示や比較に使うとバグの原因になる。
  • 正規表現を使う場合はパフォーマンスに注意
    大量データを処理する場合はreplaceの方が効率的。

関連記事リンク


まとめ

  • 0x00はヌル文字で、Javaの文字列にも含まれる場合がある
  • 削除するには replace("\u0000", "") が最も簡単
  • trim()では削除できないため注意が必要
  • 正規表現やバイト配列処理でも削除可能
  • データ処理の前にヌル文字を取り除くことで予期せぬ不具合を防げる

どなたかのお役に立てば幸いです。
それではまたー!