JavaのI / Oシステムの学習シリーズ3:一般的な使用のI / Oストリーム

  がIOストリームクラスは、さまざまな方法で組み合わせることができるが、我々はおそらく唯一のそれらのいくつかを組み合わせて使用​​します。基本的なIO典型的な使用法として、以下の参考例。これらの例では、例外処理は、コンソールに例外を渡すために簡略化されているが、これは少量の試料とツールにのみ適用可能です。コードでは、より洗練されたエラー処理を考慮する必要があります。

  また、この記事では、次の側面が含まれます:

  バッファリングされた入力ファイル

  メモリからの入力

  フォーマットされたメモリ入力

  基本的なファイル出力

  データを格納および取得

  読むとランダムアクセスファイルの読み書き

  ユーティリティ

  概要

 

1.バッファリングされた入力ファイル

  あなたは、文字入力用のファイルを開きたい場合は、文字列やファイル名のFileReaderのようFileオブジェクトを使用することができます。速度を改善するために、我々は、我々が参照BufferedReaderのコンストラクタが生成されます渡す必要があり、そのファイルをバッファリングすることができます。readLine()は、ファイルの終わりまでに、NULLを返したときのreadLine()メソッドの使用により、行毎にファイルを読み取ります。

パブリック クラスBufferedInputFile { 

    パブリック 静的文字列の読み出し(文字列のファイル名)をスロー例外{ 
        BufferedReaderのBR = 新しい BufferedReaderの(新しいFileReaderの(ファイル名))。
        StringBuilderの列str = 新しいStringBuilderの(); 
        文字列のTEMP = nullを一方、((TEMP = br.readLine())!= NULL ){ 
            str.append(TEMP + "\ n" ); 
        } 
        br.close()。
        返すstr.toStringを(); 
    } 
    
    パブリック 静的 ボイドメイン(文字列[]引数){
         試みる{ 
            のSystem.out.println(BufferedInputFile.read( "のpom.xml" )); 
        } キャッチ(例外e){ 
            e.printStackTrace(); 
        } 
    } 
}

  ファイルのすべての内容は、文字列strに蓄積し、最終的にストリームを閉じるためにclose()を呼び出すことを覚えています。

メモリから2.入力

  次の例では、上記BufferedInputFile.readから()文字列結果にStringReaderを作成するために使用され読み取ります。そして、1つの文字を読み、コンソールにそれを印刷)(読みを呼び出します。

パブリック クラスMemoryInput { 
    
    公共 静的 ボイドメイン(文字列[]引数){
         試みる{ 
            にStringReader SR = 新しいにStringReader(BufferedInputFile.read( "のpom.xml" ));
            int型のC;
            一方、(!(C = sr.read())= -1 ){ 
                System.out.print((CHAR )C); 
            } 
        } キャッチ(例外e){ 
            
        } 
    } 

}

  ()を読みノートは、INT、バイトの下で、それは正しい結果を表示するために、char型に強くなければならない返します。

3。 フォーマットされたメモリ入力

  データ形式を読み取るには、DataInputStreamのは、バイト指向のI / Oクラスである、使用することができる、我々はInputStreamを使用することができますバイト単位で任意のデータを読み取ります。

パブリック クラスFormattedMemoryInput { 

    公共 静的 ボイドメイン(文字列[]引数){
         試みる{ 
            DataInputStreamのディ = 新しい DataInputStreamの(新しいれるByteArrayInputStream(BufferedInputFile.read( "のpom.xml" ).getBytesを()))。
            一方、(di.available()!= 0 ){ 
                System.out.print((CHAR )di.readByte())。
            } 
        } キャッチ(例外e){ 
            e.printStackTrace(); 
        } 
    } 
}

  コンストラクタれるByteArrayInputStreamバイトアレイに設けられ、DataInputStreamをれるByteArrayInputStreamが「飾る」に送信実行した後、我々は唯一のreadByteによって読み取られ、(例えば、直接読み出しINT、ダブルタイプなど)の入力をフォーマットすることができなければならないことに注意してください1バイトを取り、結果は正当なメソッドが呼び出された任意のバイトの値は、戻り値、したがって、我々がアクセス可能な文字のどれだけを見るために利用可能()メソッドを使用して、ここで、入力端かどうかを検出するために使用することはできませんされていますエンドかどうかを判断します。

4。 基本的なファイル出力

  FileWriterオブジェクトは、通常、性能を向上させるためにバッファするBufferedWriterの出力に同梱されているファイルに書き込むことができます。本実施形態では、順番にPrintWriterを飾られているフォーマットの機構を提供します。

パブリック クラスBasicFileOutput { 
    
    静的な文字列のファイル=「BasicFileOutput.out」
    
    パブリック 静的 ボイドメイン(文字列[]引数){
         試みる{ 
            にBufferedReaderのを = 新しい BufferedReaderの(新しいにStringReader(BufferedInputFile.read( "のpom.xml" ))); 
            PrintWriterのうち = 新しい PrintWriterの(新しい BufferedWriterの(新しいてFileWriter(ファイル))); 
            文字列の温度; 
            int型のカウント= 0 ;
            しばらく((TEMP = in.readLine())!= nullを){ 
                out.printlnを(カウント ++ +をTEMP); 
            } 
            in.close()。
            out.close(); 
            System.out.println(BufferedInputFile.read(ファイル)); 
        } キャッチ(例外e){ 
            e.printStackTrace(); 
        }         
    } 

}

  すべてではないため場合BasicFileOutput.outは、ここで最初の呼び出しから近いの内容を読む前に()、バッファが、ここで使用されている一方で、一部のためのリソースを節約するためにオフに実行ストリームの後にタイムリーの必要性のために、それをオフにします出力ファイルには、これは不完全な情報につながる可能性が近い()、バッファの内容がクリアされない場合があり、リフレッシュを呼び出します。

  また、JavaのSE5はPrintWriterの補助コンストラクタを追加し、あなたは直接によってPrintWriterを構築装飾作業ファイル名のシリーズを実行しなくても簡単に行えます。

PrintWriterのうち= 新しい PrintWriterの(ファイル);

5。 データを格納および取得

  PrintWriterのは、読むためにデータをフォーマットすることができます。しかし、回復の他の「流れ」に利用可能なデータを出力するために、我々はデータDataOutputStreamをを書き、データのDataInputStreamを復元する必要があります。もちろん、これらのストリームは、任意の形態であってもよく、以下の実施例で使用されるファイルです。

パブリック クラスStoringAndRecoveringData { 
    
    公共 静的 ボイドメイン(文字列[]引数){
         試みる{ 
            DataOutputStreamをアウト = 新しい DataOutputStreamを(新たなBufferedOutputStream(たFileOutputStream( "data.txtをします" )))。
            out.writeDouble( 3.14159 )。
            out.writeUTF( "それはパイでした" ); 
            out.writeDouble( 1.41413 )。
            out.writeUTF( "2の平方根" ); 
            out.close(); 
            でDataInputStreamの =新しい DataInputStreamを(新しい BufferedInputStreamを(新しい FileInputStreamを( "data.txtを" ))); 
            System.out.println(in.readDouble())。
            System.out.println(in.readUTF())。
            System.out.println(in.readDouble())。
            System.out.println(in.readUTF())。
            in.close(); 
        } キャッチ(例外e){ 
            e.printStackTrace(); 
        } 
    } 

}

  使用DataOutputStreamをは、データを書き込むJavaは、我々は正確にデータを読まないのDataInputStreamを使用できることを保証することができます - に関係なく、データの読み込み方法を別のプラットフォームと書きます。我々はDataOutputStreamをを使用する場合は、文字列を書いて、達成するために)その唯一確実な方法は、この場合には、UTF-8エンコーディングを使用することで再開することがDataInputStreamのははwriteUTF()とのreadUTF(であるしましょう。

  書き込み可能とdouble型のデータを復元するのwriteDouble()とのreadDouble()メソッド。他の種類のデータについては、読み取りおよび書き込みのための類似の方法があります。しかし、すべてが正しく動作する方法を読み書きすることを確実にするために、我々は、データ項目のストリームは、最も可能性が高いので、二重のデータはバイト、charまたは読書の他の種類の簡単なシーケンスとして保存されます正確な場所を知っている必要があります。

6。 読むとランダムアクセスファイルの読み書き

  <<書かれた特別の前でのRandomAccessFile使用、およびDataOutputStreamをDataInputStreamをと同様組み合わせて使用​​する文書の中を移動するシーク()を使用しながら、同時に、ファイルへの読み取りおよび書き込みすることができ、非常に便利であり、詳細な使用のRandomAccessFile、 JavaのI / Oシステム:ファイルとのRandomAccessFile >>。

  しかし、使用にRandomAccessFileは、あなたはそれを正しく動作するように、特定の様々な方法でのRandomAccessFileは基本タイプとUTF-8の文字列を読み取るために、レイアウトファイルを知っている必要があります。

パブリック クラスUsingRandomAccessFile {
     静的な文字列のファイル=「rtest.dat」静的 ボイドディスプレイ()スローにIOException { 
        たRandomAccessFile RF = 新規のRandomAccessFile(ファイル、 "R"を)。
        以下のためにint型、iは7 <; I = 0 iは++ ){ 
            するSystem.out.println( "値" + I + ":" + rf.readDouble())。
        } 
        のSystem.out.println(rf.readUTF())。
        rf.close(); 
    } 
    パブリック 静的 ボイドメイン(文字列[]引数)がスローIOException { 
        たRandomAccessFile RF = 新規のRandomAccessFile(ファイル、 "RW" )。
        以下のためにint型、iは7 <; I = 0 iは++ ){ 
            rf.writeDouble(iは 1.414を* )。
        } 
        rf.writeUTF(「ファイルの終わり」)。
        rf.close(); 
        表示(); 
        RF = 新しいのRandomAccessFile(ファイル、 "RW" )。
        rf.seek( 5 * 8 )。
        rf.writeDouble( 47.0001 )。
        rf.close(); 
        表示(); 
    } 
}

  私たちは望んでいないどのようなデータ型のダブルそう読んでいないならば、我々は組版まで必要な理由であるのreadDouble()メソッドによって読み取らDoubleデータ型とのファイルへのwriteDouble()メソッドで書きます結果。

7。 ユーティリティ

  ここでは、I / Oは、そのようなバッファリングされた入力ファイルとして、一般的なJavaのI / Oストリームしているメモリ、基本的なファイル出力、保存し、データを取得、ランダム読み取りおよび書き込み、ファイルからの入力ストリームの様々な典型的な使用を検討します用法。ここでは、ファイルは、読み取り、変更、一般的なプログラミング作業に書くことを見つけるが、Java I / Oライブラリの設計は、我々はどのように覚えておくことは、これらの操作を実装するために多くのコードを記述する必要があるという問題がありましたファイルを開く利点は難しいものです。だから、ここを収集するためにいくつかのヘルパークラスがあり、簡単に将来を見やすくするために、ここで私たちの記録のためにこれらの基本的なタスクを達成することができます。

  2つのツールがここに収集されます。

  • 一つは、ファイルを読み書きするために私たちを助け、TextFileのです。
  • もう一つは、私たちは、バイナリファイルを読み込む簡素化、BinaryFileです。

7.1ファイルを読み込みます

  TextFileのクラスは、テキストファイルの単純な文字列として読み取ることができる静的メソッドが含まれている、と我々はTextFileのオブジェクトを作成することができ、それはファイルの行数を保持するためのArrayListを使用して、我々はすべての関数のファイルの内容を操作する際の利点はArrayListのを使用することができます。

public class TextFile extends ArrayList<String>{
    // 将文件读取到一行字符串中
    public static String read(String fileName){
        StringBuilder sb = new StringBuilder();
        try{
            BufferedReader in = new BufferedReader(new FileReader(new File(fileName).getAbsoluteFile()));
            try{
                String s;;
                while((s = in.readLine()) != null){
                    sb.append(s).append("\n");
                }
            }finally{
                in.close();
            }
        }catch (IOException e){
            throw new RuntimeException(e);
        }
        return sb.toString();
    }

    // 单次调用将一个字符串写入一个文件
    public static void write(String fileName,String text){
        try{
            PrintWriter out = new PrintWriter(new File(fileName).getAbsoluteFile());
            try{
                out.print(text);
            }finally{
                out.close();
            }
        }catch(IOException e){
            throw new RuntimeException(e);
        }
    }

    // 读取文件,并通过正则表达式将其分离,保存在List中
    public TextFile(String fileName,String splitter){
        super(Arrays.asList(read(fileName).split(splitter)));
        // 因为split()方法有时会在返回的数组第一个位置产生一个空字符串
        if(get(0).equals(""))
            remove(0);
    }

    // 常规的分行读取
    public TextFile(String fileName){
        this(fileName,"\n");
    }

    // 将该TextFile中的内容分行写入指定文件中
    public void write(String fileName){
        try{
            PrintWriter out = new PrintWriter(new File(fileName).getAbsoluteFile());
            try{
                for(String item : this){
                    out.println(item);
                }
            }finally{
                out.close();
            }
        }catch(IOException e){
            throw new RuntimeException(e);
        }
    }

    // 简单验证一下
    public static void main(String[] args){
        String file = read("TextFile.java");
        write("test.txt",file);
        TextFile text = new TextFile("test.txt");
        text.write("test2.txt");
        TreeSet<String> words = new TreeSet<String>(new TextFile("TextFile.java","\\W+"));
        System.out.println(words.headSet("a"));
    }
}

  这里利用静态的read()方法将文件读取到一个字符串中,再用静态的write()方法将其写入到文件中。然后将新写入的文件作为构造参数构造一个TestFile对象,利用其List的特性,将其内容写入文件test2中。这个类的作用是帮我们读取文件,可以通过静态的read方法读取到一个字符串中,也可以通过构造器读取文件到一个TextFile对象中。

7.2 读取二进制文件

public class BinaryFile{
    public static byte[] read(File bFile)throws IOException{
        BufferedInputStream bf = new BufferedInputStream(new FileInputStream());
        try{
            byte[] data = new byte[bf.available()];
            br.read(data);
            return data;
        }finally{
            bf.close();
        }
    }

    public static byte[] read(String bFile)throws IOException{
        return read(new File(bFile).getAbsoluteFile());
    }
}

8. 总结

  本文没有总结什么新的知识点,只是总结了一些Java I/O的常见用法比如缓冲输入文件、从内存输入、基本的文件输出、存储和恢复数据、随机读写文件等,并且搜集了两个工具类用来帮助我们读写文件读取二进制文件,以提高些代码的效率。

 

おすすめ

転載: www.cnblogs.com/volcano-liu/p/10991248.html