Javaベース-10-IOフローの復習

30846 ワード

一.概要
1.ストリームの概念
  • ストリーム:ストリームは、データを生成または受信する能力のあるオブジェクトであり、本質的にはデータ伝送であり、データソースとプログラムとの間に伝送路
  • を確立する役割を果たす.
    2.IOフローの分類
    データの流れによって
  • 入力ストリーム:外部(ディスク)データをプログラム(メモリ)に読み込む
  • 出力ストリーム:プログラムデータがディスクに出力
  • データ単位で
  • バイトストリーム:バイト単位でデータを操作し、一般的に非テキストファイル(jpg、mp 4、mp 3、doc、ppt)
  • を処理する.
  • 文字ストリーム:文字でデータを操作し、一般的にテキストファイル(txt、java、c、cpp)
  • を処理する.
    ストリームの機能によって
  • ノードストリーム:データソースのプログラム間で直接伝送するストリーム
  • .
  • 処理フロー:既存のフロー(ノードフローまたは処理フロー)をパッケージ(複数回可能)、伝送機能を強化するフロー
  • .
    ストリームの全体的な分類
    ベースクラス
    バイトストリーム
    文字ストリーム
    にゅうりょくりゅう
    InputStream
    Reader
    しゅつりょくりゅう
    OutputStream
    Writer
    ここで、ファイル、配列、パイプ、文字列クラスはノードフローであり、残りは処理フローである.
    ぶんかつ
    InputStream
    OutputStream
    Reader
    Writer
    ファイル
    FileInputStream
    FileOutputStream
    FileReader
    FileWriter
    はいれつ
    ByteArrayInputStream
    ByteArrayOutputStream
    CharArrayReader
    CharArrayWriter
    パイプ本
    PipedInputStream
    PipeOutputStream
    PipedReader
    PipedWriter
    文字列
    StringReader
    StringWriter
    きりかえりゅう
    InputStreamReader
    OutputStreamWriter
    オブジェクトフロー
    ObjectInputStream
    ObjectOutputStream
    印刷フロー
    PrintStream
    PrintWriter
    ろ過流
    FilterInputStream
    FilterOutputStream
    FilterReader
    FilterWriter
    バッファフロー
    BufferedInputStream
    BufferedOutputStream
    BufferedReader
    BufferedWriter
    プッシュバック
    PushbackInputStream
    PushbackReader
    データ・フロー
    DataInputStream
    DataOutputStream
    *表に太字を付けたものが一般的な流れです
    3.Fileクラス(java.io.File)
    Fileクラスのオブジェクトは、ファイルまたはディレクトリを表し、ファイルまたはディレクトリの作成、検索、削除操作に使用されます.
    Fileクラスのコンストラクタ:
  • File(String file Path)指定されたパス文字列に基づいて新しいFileインスタンス
  • を作成する.
  • File(String parentPath,String childPath)親パスと子パスに基づいて新しいFileインスタンス
  • を作成する.
  • File(File parentFile,String childPath)親ファイルオブジェクトと子パスに基づいて新しいFileインスタンス
  • を作成する.
    //       
    String path = "D:\\123.txt";
    File file1 = new File(path); 
    
    //      
    String path2 = "D:\\1\\2.txt";
    File file2 = new File(path2);     -------------   D:\\1\\2.txt
    
    //             
    String parent = "F:\\aaa";
    String child = "bbb.txt";
    File file3 = new File(parent, child);  --------   F:\\aaa\\bbb.txt
    
    //    File         
    File parentDir = new File("F:\\aaa");
    String child = "bbb.txt";
    File file4 = new File(parentDir, child); --------   F:\\aaa\\bbb.txt
    

    Fileクラスの一般的な方法は、菜鳥チュートリアルを参照してください.
    二.共通ストリームの使用
    ストリームの標準化コード操作フローを使用して、読み出しを例に、同理に書き込む
  • Fileクラスオブジェクトを作成し、読み込んだデータソースを示します.ファイルは
  • でなければなりません.
  • 対応する入力ストリームを作成し、Fileクラスオブジェクトをパラメータとしてストリームのコンストラクタ
  • に渡す.
  • 対応するバイトまたは文字配列
  • を作成する.
  • .close()クローズフロー
  • 異常に対するtry-catch-finally処理
  • 1.ファイルフロー
    選択の原則:純粋なテキストデータを処理する場合は、文字ストリームを優先し、それ以外はバイトストリームを使用します.
    ファイルストリームを使用してtxtテキストファイルを読み込むとします.コードは次のとおりです.
    @Test
    public void testFileReader() throws IOException {
         
    //1.File     
    File file = new File("Hello.txt");
    //2.FileReader    
    FileReader fr = new FileReader(file);
    //3.     read(char[] c):      c       ,       ,  -1
    char[] c = new char[5];
    int len;
    while((len = fr.read(c)) != -1){
         
    	String str = new String(c, 0, len);
    	System.out.print(str);
    	}
    //4.   
    fr.close();
    }
    

    txtファイルを書き込むのと同じです
    @Test
    public void testFileWriter() throws IOException {
         
    //1.File     
    File file = new File("Hello.txt");
    //2.FileWriter    
    FileWriter fw = new FileWriter(file);
    //3.    
    fw.write("Hello, world!
    "
    ); //4. fw.close(); }

    2.バッファフロー
    役割:デフォルトサイズ(8 kb)を内蔵したバッファ配列を作成し、バッファの読み書きにより読み書き効率を向上させる読み取り:一度にファイルから8 kbを読み取り、バッファの中にバッファがいっぱいになるまでまっすぐに存在し、次の8 kb配列の書き込みを読み取る:バッファに書き込み、書き込みまで書き込み、ファイルに書き込み、flush()を使用してバッファにファイルを強制的に書き込む
    画像のコピー操作を実現
    @Test
    public void testBufferedStream(){
         
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
         
            //1.   
            File srcFile = new File("  1.jpg");
            File destFile = new File("  2.jpg");
            
            //2.  
            //2.1    
            FileInputStream fis = new FileInputStream(srcFile);
            FileOutputStream fos = new FileOutputStream(destFile);
            //2.2    ,      
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);
    
            //3.    、    
            byte[] buffer = new byte[1024];
            int len;
            while ((len = bis.read(buffer)) != -1){
         
                bos.write(buffer,0,len);
            }
        } catch (IOException e) {
         
            e.printStackTrace();
        } finally {
         
            //4.   
            if (bos != null){
         
                try {
         
                    bos.close();
                } catch (IOException e) {
         
                    e.printStackTrace();
                }
            }
            if (bis != null){
         
                try {
         
                    bis.close();
                } catch (IOException e) {
         
                    e.printStackTrace();
                }
            }
        }
    }
    

    3.変換フロー
  • InputStreamReader:バイト配列->文字配列(復号)
  • OutputStreamWriter:文字配列->バイト配列(符号化)
  • テキストファイルをUTF-8符号化からGBK符号化フォーマットに変換
    @Test
    public void test() {
         
        InputStreamReader isr = null;
        OutputStreamWriter osw = null;
        try {
         
            //1.   、  
            File file1 = new File("dbcp_utf8.txt");
            File file2 = new File("dbcp_gbk.txt");
    
            FileInputStream fis = new FileInputStream(file1);
            FileOutputStream fos = new FileOutputStream(file2);
    
            isr = new InputStreamReader(fis, "utf-8");
            osw = new OutputStreamWriter(fos, "gbk");
    
            //2.    
            char[] cbuf = new char[20];
            int len;
            while ((len = isr.read(cbuf)) != -1){
         
                osw.write(cbuf,0,len);
            }
        } catch (IOException e) {
         
            e.printStackTrace();
        } finally {
         
            //3.  
            if (isr != null){
         
                try {
         
                    isr.close();
                } catch (IOException e) {
         
                    e.printStackTrace();
                }
            }
            if (osw != null){
         
                try {
         
                    osw.close();
                } catch (IOException e) {
         
                    e.printStackTrace();
                }
            }
        }
    }
    

    4.印刷フロー
    print()もprintln()もバイト印刷ストリームPrintStreamから
    テキストファイルのコピー
    @Test
    public printTest(){
         
    	BufferedReader br = new BufferedReader(new FileReader("copy.txt"));
    	PrintStream ps = new PrintStream("printcopy.txt");
    	String line;
    	while((line = br.readline()) != null){
         
    		ps.println(line);
    	}
    	br.close();
    	ps.close();
    }
    

    5.オブジェクトフロー
    シーケンス化メカニズムにより、メモリ内のJavaオブジェクトをプラットフォームに関係のないバイナリストリームに変換できます.これにより、このバイナリストリームをディスクに永続的に保存したり、ネットワークを介して別のネットワークノードに転送したりすることができます.他のプログラムがこのバイナリストリームを取得すると、元のJavaオブジェクトに復元できます.
  • ObjectOutputStream:メモリ内のオブジェクト->ストレージファイル、ネットワーク送信(シーケンス化プロセス)
  • ObjectInputStream:ストレージファイル、ネットワーク受信->メモリ内のオブジェクト(逆シーケンス化プロセス)
  • オブジェクトをシーケンス化するには、次の条件を満たす必要があります.
  • javaを実現する.io.Serializableインタフェース
  • は、グローバル定数serialVersionUID(シーケンスバージョン番号、逆シーケンス化検証用)
  • を提供する.
  • オブジェクトの内部属性は、直列化可能(staticおよびtransient修飾属性は直列化不可)
  • である必要がある.
    Personクラスのオブジェクトシーケンス化の実装
    @Test
    public void personSerializeTest(){
         
    	Person p = new Person();
    	p.name = "  ";
    	p.age = 28;
    	try{
         
    		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Person.dat"));
    		oos.writeObject(p);
    		oos.close();
    		fileOut.close();
    	}catch(IOException i){
         
    		i.printStackTrace();
    	}
    }