Java IOストリームの文字ストリーム、バッファ付き文字ストリーム

10283 ワード

IO流
字が少なくて、内容は本当に少なくて、ここから諸君に1篇の大神のブログを推薦して、総括の構想ははっきりしていて、鬼斧神工、ははは、とにかく総括するのはとても良いです.住所を参照:
***
***
IO分類
  • は、データ型によって文字ストリーム、バイトストリームに分けられる.
  • は、データの流れによって入力ストリームに分けられ、出力ストリームである.

  • 入力バイトストリーム(InputStrem)出力バイトストリーム(OutputStrem)文字入力ストリーム(Reader)文字出力ストリーム(Writer)
    まず、文字出力ストリームWriterを見てみましょう.
    文字出力ストリーム-----Writer
    それを理解するには、抽象的で、辺鄙で、交流しにくいので、私たちはその子孫から始めます.まず孫のFileWrilerを見てみましょう.
    FileWriterはOutputStreamWriterから継承
    構築方法:
         //                    。       ,   。
         public FileWriter(String var1) throws IOException {
                super(new FileOutputStream(var1));
            }// :FileWriter fw=new FileWriler("D:files.txt");
    
          //                    ,                 。
         public FileWriter(String var1, boolean var2) throws IOException {
                super(new FileOutputStream(var1, var2));
            }// :FileWriter fw=new FileWriler("D:files.txt",true);//true              ,false         ,   ,   (  )
    
          //       
         public FileWriter(File var1) throws IOException {
                super(new FileOutputStream(var1));
            }// :FileWriter fw=new FileWriter(new File("D:files.txt"));
    
          //       
         public FileWriter(File var1, boolean var2) throws IOException {
                super(new FileOutputStream(var1, var2));
            }// :FileWriter fw=new FileWriter(new File("D:files.txt"),flase);//    
    
          //   
          public FileWriter(FileDescriptor var1) {
                super(new FileOutputStream(var1));
            }// :
    

    構造方法が異常であることがわかります.上のコードはすでにFileWriterのすべてのコードです.
    主な方法:
  • void write(String str)書き込み文字列.このメソッドを実行した後も、文字データは目的のファイルに書き込まれていません.文字データはバッファに保存されます.このとき、リフレッシュメソッドを使用すると、目的のファイルにデータを保存できます.
  • void flush()は、ストリーム内のバッファをリフレッシュします.バッファ内の文字データを目的ファイルに保存します.
  • void close()このストリームを閉じます.閉じる前に、このストリームのバッファがリフレッシュされます.クローズ後、書き込みまたはリフレッシュすると、IOException異常が放出されます.

  • ケース
        /**
         * IO      ,           
         */
        public class Demo {
            public static void main(String[] args) {
                FileWriter writer = null;
                FileWriter writer1 = null;
    
                FileWriter writer2 = null;
                FileWriter writer3 = null;
                try {
                    //1.   FileWriter  ,             
                    writer = new FileWriter(Config.PATH + "testFileWriter1.txt");//            
                    //2.              
                    writer.write("hello");
                    writer.flush();//3、      ,     //         
    
                    //          ,        
                    writer1 = new FileWriter(Config.PATH + "testFileWriter1.txt");//                 
                    writer1.write("  -->1");
                    writer1.flush();
    
                    //          ,        
                    writer2 = new FileWriter(Config.PATH + "testFileWriter2.txt");
                    writer2.write("  -->2");
                    writer2.flush();
    
                    //          ,         true    false   
                    writer3 = new FileWriter(Config.PATH + "testFileWriter2.txt", false);//             
                    writer3.write("  -->");
                    writer3.flush();
                    writer3.write(" ");
                    writer3.flush();
    
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        writer.close(); //   
                        writer1.close();
                        writer2.close();
                        writer3.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
  • Configのコード
      public static final String PATH = "/Volumes/huang/studyfromGitHub/JavaForAndroid/JavaForAndroid/series10/src/main/java/files/";
    
  • 結果
    デフォルトの書き込みモードが上書きであることを示します.
    文字入力ストリーム-----Reader
    同じように彼の孫類を見る.
    FileReaderはInputStreamReaderから継承されます
    構築方法は、すべてのソースコードでもあります.
        //         String       。        。      。
        public FileReader(String var1) throws FileNotFoundException {
                super(new FileInputStream(var1));
            }// :FileReader fr = new FileReader(String file);
        //        ,         String           
        public FileReader(File var1) throws FileNotFoundException {
                super(new FileInputStream(var1));
            }// :FileReader fr = new FileReader(new File(str));//str String  
    
        //   
        public FileReader(FileDescriptor var1) {
                super(new FileInputStream(var1));
            }// :
    

    主な方法:
  • void read()は、単一の文字を読み出します.整数として読み込まれた文字を返し、ストリームの最後に達した場合は-1を返します.
  • void read(char[]char)文字を配列に読み込みます.読み出された文字数を返します.末尾に達した場合は、-1を返します.
  • void close()このストリームオブジェクトを閉じます.関連付けられたすべてのリソースを解放する
  • ケース---前のケースのtestFileWriter 2.txtファイルの内容を読みます
        public class Demo {
            public static void main(String[] args) {
                //1.  FileReader  
                FileReader fileReader = null;
                try {
                    //2.    FileReader  
                    fileReader = new FileReader(Config.PATH + "testFileWriter2.txt");//     FileNotFoundException  
                    //3.    
                    int num = 0;
                    while ((num = fileReader.read()) != -1) {//       ,   -1          
                        System.out.print((char) num);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        fileReader.close();//   
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    

    結果
    ケース----void read(char[]char)の使い方を示す
        public class Demo {
            public static void main(String[] args) {
                FileReader fileReader = null;
                try {
                    fileReader = new FileReader(Config.PATH + "testFileWriter2.txt");
                    char[] buffer = new char[4];//     4   
                    int n = 0;
                    while ((n = fileReader.read(buffer)) != -1) {//     4   ,   -1          
                        //         , 0    ,          
                        System.out.println("   "+n+"   : "+new String(buffer,0,n));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }finally {
                    try {
                        fileReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    

    結果
    読み取った内容は同じであることがわかります.
    文字ストリーム(FileReader FileWriter)レプリケーション・ファイル・ケース
        /**
         *   :copy   Demo1  
         *   :       
         */
        public class Demo {
            //     
            public static final String PATH = "/Volumes/huang/studyfromGitHub/JavaForAndroid/JavaForAndroid/series10/src/main/java/com/example/Demo1.java";
            public static final String FILENAME = "copyDemo1.java";
    
            public static void main(String[] args) {
                // 1.          、     
                FileReader fileReader = null;
                FileWriter fileWriter = null;
    
                try {
                    // 2.         
                    fileReader = new FileReader(PATH);
                    fileWriter = new FileWriter(Config.PATH + FILENAME);//       ,      
                    char[] buffer = new char[6];
                    int len = 0;
                    while ((len = fileReader.read(buffer)) != -1) {//  
                        fileWriter.write(buffer, 0, len);//  ,                 
                    }
    
                } catch (Exception e) {
                    e.printStackTrace();
                }finally {
                    try {
                        //        
                        fileReader.close();
                        fileWriter.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    

    結果
    赤をつけるのは私のせいではありません.もともと赤をつけるべきでした.
    文字出力ストリームにはバッファ---FileWriterとBufferedWriterが使用されます
  • FileWriterファイル文字出力ストリーム
  • BufferedWriterバッファ文字出力ストリーム
  • BufferedWriterバッファ文字出力ストリーム、直接Writerから継承
    構築方法
    public BufferedWriter(Writer var1) {
            this(var1, defaultCharBufferSize);
        }
    
    public BufferedWriter(Writer var1, int var2) {
            super(var1);
            if(var2 <= 0) {
                throw new IllegalArgumentException("Buffer size <= 0");
            } else {
                this.out = var1;
                this.cb = new char[var2];
                this.nChars = var2;
                this.nextChar = 0;
                this.lineSeparator = (String)AccessController.doPrivileged(new GetPropertyAction("line.separator"));
            }
        }
    

    見間違えなければ2つですが、BufferedWriterインスタンスを得るには、Writerインスタンスを渡さなければなりません.
    運用例
    public class Demo{
        public static final String NAME = "testDemo5.txt";
    
        public static void main(String[] args) {
            //1.    
            FileWriter fileWriter = null;
            BufferedWriter bufferedWriter = null;
    
            try {
                //2.     
                fileWriter = new FileWriter(Config.PATH + NAME);
                bufferedWriter = new BufferedWriter(fileWriter);//     ,      (  ),    (     )          
                //                 
                bufferedWriter.write("  ,");
                bufferedWriter.newLine();//  
                bufferedWriter.write("         。");
                //              ,            
                bufferedWriter.append("    ")
                        .append("\r
    ").append(" 。"); // : , , flush() bufferedWriter.flush();// } catch (Exception e) { e.printStackTrace(); }finally { try { bufferedWriter.close();// , } catch (IOException e) { e.printStackTrace(); } } } }

    結果
    注意:バッファ・データは、メモリにデータを格納し、ファイルに書き込まれません.ストリームを閉じる前にflush()メソッドを実行する必要があります.皆さんはFileWriterがBufferedWriterに包装されていることに気づいたことがありますか.の次は、デコレーションモードについて少しご紹介します.