スキャンフロー——Scanner類

2587 ワード

BufferedReaderクラスは、大きなテキストデータファイルの読み込み操作に便利ですが、2つの問題があります。
  • データを読み出す時は、文字列によってのみ戻ります。public String readline()throws IOException。
  • セパレータは固定されていて、改行でセパレータとして使用されます。
  • そこで、Scannerクラスがすべての入力ストリームの操作問題を解決します。
    Scannerの構造方法(そのうち2つ):
    public Scanner(File source) throws FileNotFoundException
    public Scanner(InputStream source)
    ちょっとPrintStreamのような構造方法のデザインですか?
    Scannerはデフォルトでは、空白(改行とスペース)を区切り記号として使用します。任意でセパレータを設定できます。
    public Scanner useDelimiter(String pattern)
    一般的な方法関数:
    public boolean hasNext()
    public String next()
    public boolean hasNextXxx()
    public xxx nextXxx()
    public boolean hasNext(String pattern)
    public String next(String pattern)
    例1:キーボード入力ストリームからデータを読み出す
    public class Main {
        public static void main(String[] args) throws IOException {
            Scanner scanner=new Scanner(System.in);
            while (true){
                if (scanner.hasNextInt()){
                    System.out.println("      :"+scanner.nextInt());
                }else if(scanner.hasNextDouble()){
                    System.out.println("      :"+scanner.nextDouble());
                }else if(scanner.hasNext("\\w{3}")){
                    System.out.println("        :"+scanner.next("\\w{3}"));
                }else {
                    System.out.println("       :"+scanner.next());
                }
            }
        }
    }
    実行結果:
    6-9 687wr o7.8 uuu p 98.5 4
           :6-9
           :687wr
           :o7.8
            :uuu
           :p
          :98.5
          :4
    例2:ファイルからデータを読み出す
    まず私のeディスクの下にハロー.txtファイルを準備します。内容は以下の通りです。
    hello world 
       
    1.4 4
    javaファイル: 
    import java.io.*;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args)  {
            Scanner scanner= null;
            try {
                scanner = new Scanner(new File("e:"+File.separator+"hello.txt"));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            scanner.useDelimiter("
    "); while (scanner.hasNext()) System.out.println(scanner.next()); } }
    実行結果:
    hello world 
       
    1.4 4
    最初はnew Scannerの構造関数でいつもファイルの内容を読み取れませんでしたが、new Scanner(FileInput Stream in)でScannerオブジェクトを実装すれば読めます。その後、元々はファイルに中国語があるからです。そして、utf-8として保存しておけば、読めます。
    締め括りをつける
    Scanner類でデータを読み取るのは前のBufferedereaderより便利です。だから今後はScannerを使ってできるだけScannerで読み取ります。
    Scanner類はInputStream類の完備で、BufferediaderはReader類の完備で、PrintStreamはOutputStreamの完備で、PrintWriterはWriterの完備です。