JAvaのI/O紹介


転載先:http://blog.csdn.net/qq_35101189/article/details/60574798
IOストリームは、入力ストリーム(InputStream)と出力ストリーム(OutputStream)の2種類に分けられ、ストリームによって処理されるデータ型はバイトストリームと文字ストリーム(Unicode文字データの処理に用いる)の2種類に分けられる
バイトストリームは主にInputStreamとOutputStreamをベースクラスとし,文字ストリームは主にReaderとWriterをベースクラスとする
ノードフロー(Low Flow)と処理フロー(Advanced Flow):JAVAは処理フローを使用してノードフローを包装する典型的なデザイナ設計モードで、処理フローを使用して異なるノードフローを包装することで、異なるノードフローの実装の違いを解消することができ、より便利な方法で入出力機能を完成することができ、Javaアプリケーションが同じコードを採用することを許可する.異なる入出力デバイスのデータストリームに透過的にアクセスします.処理フローはパッケージフローとも呼ばれます
次の図は、関連システムを示しています.
java的I/O介绍_第1张图片
java的I/O介绍_第2张图片
java的I/O介绍_第3张图片
 
ファイルクラス:(File):ファイル操作機能を提供します(Fileはファイルやディレクトリに対して作成、削除などの操作を行うことができますが、ファイルの内容にアクセスするには、入出力ストリームを使用する必要があります).
1.Fileクラスオブジェクトの作成:File f;f = new File("Test.java"); f = new File("E:\\ex\\","Test.java");
2.ディレクトリもファイル処理ファイルクラスとしてディレクトリ管理機能を実現する方法を提供する:File path=new File(「E:\ex\」);File f = new File(path, "Test.java");
メソッド:f.getName():ファイル名tempを返します.datf.getParent():ファイルが存在するディレクトリ名datafを返します.getPath():ファイルパスdatatempを返します.datf.getAbsolutePath():絶対パスを返します...datatemp.datf.exists()ファイルにf.canWrite()が存在するか、f.canRead()ファイルが書き込み可能か、読み取り可能かf.isFile()f.isDirectory()ファイルまたはディレクトリf.lastModified()f.length()f.delete()ファイルの最終変更日、長さ;ファイルf.mkdir()を削除し、f.list():ディレクトリを作成します.ディレクトリの下にあるすべてのファイルを一覧表示
いくつかの例を示します.
import java.io.*;
class FileTest{
    public static void main(String[] str){
        File f = new File("E:\\Workspace\\aaa.txt");
        //         
        if (!f.exists()){
            System.out.println("file is not exist");
            try {
                f.createNewFile();//          
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        File f1 = new File("E:\\Workspace\\aaa1\\sdfsdf\\asdf");
        if (f1.mkdir()){ //    
            System.out.println("yes");
        }
        else{
            System.out.println("errors ");
        }
    }
}


import java.io.*;

//               
class FileDirectory{
     public static void main( String[] args ) {
          try {
             File f1 = new File("");
             String ss = f1.getAbsolutePath();
             System.out.println("ss= " + ss);
             File f = new File(ss);

             if( f.isDirectory() ) {
                //            
                File[] files = f.listFiles();
                for( int i=0; i ) {
                   if( files[ i ].isDirectory() ) {
                      System.out.println( " " + files[ i ].getName() );
                   }
                   else {
                      System.out.println( files[ i ].getName() );
                   }
                }
             }
          }
          catch( Exception e ) {
             e.printStackTrace();
          }       
      }    
}


import java.io.*;

class SuperTest{
    public static void main(String args[]) {
        File dir = new File("E:\\Workspace\\Java\\test20111108"); //  File         
        Filter filter = new Filter("txt"); //       java    
        System.out.println("list java files in directory " + dir);
        
        String[] files = dir.list(filter); //     dir ,      txt     
                            
        for (int i = 0; i < files.length; i++) {
            File f = new File(dir, files[i]); //    dir            File   
            if (f.isFile()) //          java   ,      
                System.out.println("file: " + f);
            else
                System.out.println("sub directory " + f); //            
        }        
    }
}

class Filter implements FilenameFilter {
    String extent;
    Filter(String extent) {
        this.extent = extent;
    }
    
    public boolean accept(File dir, String name) {        
        return name.endsWith("." + extent); //        
    }
}


 
バイトファイルストリーム:FileInputStreamとFileOutputStream
import java.io.*;

/**
*                   
*/
class FileStreamTest{
    public static void main(String args[]) {
        try {
            File inFile=new File("test1.txt");
            File outFile=new File("test2.txt");
            FileInputStream fis=new FileInputStream(inFile);
            FileOutputStream fos=new  FileOutputStream(outFile);
            
            int c;
            while((c=fis.read())!=-1) //      
            {
                    fos.write(c);
            }
            
            fis.close();
            fos.close();
        }catch(FileNotFoundException e) {
              System.out.println("FileStreamsTest: "+e);
        }catch(IOException e) {
           System.err.println("FileStreamsTest: "+e);
        }
    }
}


import java.io.*;

class CopyFileTest{
    public static void main(String args[]) {
        CopyFileTest cf = new CopyFileTest ();
        cf.copyFile("test1.txt","test3.txt");
    }
    
    public boolean copyFile(String src,String des){    
        File srcFile,desFile;
        srcFile = new File(src);
        desFile = new File(des);
        FileInputStream fis = null;
        FileOutputStream fos = null;
    
        try{
              desFile.createNewFile();
              fis = new FileInputStream(srcFile);
              fos = new FileOutputStream(desFile);//  
            //  fos = new FileOutputStream(desFile,true);//  

              int bytesRead;
              byte[] buf = new byte[4 * 1024];  // 4K buffer
              while((bytesRead=fis.read(buf))!=-1){
                fos.write(buf,0,bytesRead);
              }
              fos.flush();
              fos.close();
              fis.close();
        }catch(IOException e){
          System.out.println(e);
          return false;
        }
          return true;    
    } 
}


上書きではなく末尾に追加する場合はFileOutputStream("file",true)を呼び出すだけでOkとなり、文字ストリームファイルに対してはFileWriter("file",true)でOKとなります.
 
親フィルタフロー:FilterInputStream(InputStreamin);FilterOutputStream(OutputStream out);
 
フィルタフロー-バッファフロー
クラスBufferedInputStreamとBufferedOutputStreamはFilterInputStreamとFilterOutputStreamを継承し、バッファ付きのフィルタフローを実現している.バッファメカニズムを提供し、任意のI/Oストリームをバッファフローに「バンドル」することで、このI/Oストリームの読み取り効率を向上させることができ、初期化時に接続するI/Oストリームを指定するほか、バッファのサイズを指定することもできる.読み書きと同時にデータをキャッシュすることで、読み書きのたびに実際の物理的読み書き操作が行われることを回避し、BufferdOutputStreamで出力する場合、データはバッファに入力され、バッファがいっぱいになったときに接続された出力ストリームに書き込まれ、flush()を呼び出してバッファをクリアすることができます.
import java.io.*;

class SuperTest{
    public static void main(String args[]) {
        try {
            File inFile = new File("test1.txt");
            File outFile = new File("test4.txt");
            
            BufferedInputStream bufFis=new BufferedInputStream(new FileInputStream(inFile),256);            
            BufferedOutputStream bufFos=new BufferedOutputStream(new FileOutputStream(outFile),256);            
            
            int len;
            byte bArray[]=new byte[256];
            
            do{
                System.out.println("while");
                len = bufFis.read(bArray);
                bufFos.write(bArray,0,len);
                System.out.println("len: " +len);
            }while (len==256);    
                        
            bufFis.close();
            bufFos.close();
        } catch (FileNotFoundException e) {
            System.out.println("FileStreamsTest: " + e);
        } catch (IOException e) {
            System.err.println("FileStreamsTest: " + e);
        }
    }
}


 
フィルタ・フロー-データ・フロー
DataInputStreamとDataOutputStreamは、FilterInputStreamとFilterOutputStreamを継承し、コンピュータに関係のないフォーマットでJAVAの基本データ型とStringオブジェクトを読み書きするために使用できます.readBoolean()は1バイト読み、ゼロ以外は真readByte()は8ビット読みバイトreadChar()はUnicode文字readInt()は整数値writeChar(int v)は出力ストリームwriteLong(long v)は出力ストリームwriteInt(int v)は整数を出力ストリームに書き込む
データ出力ストリームは、ネットワークの接続、ファイルなど、確立された入力データストリームオブジェクトであってもよい.データ・ストリームは、以下のようにして確立することができる.FileInputStream fis = new FileInputStream("file1.txt"); FileOutputStream fos = new FileOutputStream("file2.txt"); DataInputStream dis = new DataInputStream(fis); DataOutputStream dos = new DataOutputStream(fos);
import java.io.*;

class DataStreamIOTest{
    public static void main(String args[]) throws IOException 
    {
        FileOutputStream fos = new FileOutputStream("a.txt");
        DataOutputStream dos = new DataOutputStream(fos);
        try {
            dos.writeBoolean(true);
            dos.writeByte((byte) 123);
            dos.writeChar('J');
            dos.writeDouble(3.141592654);
            dos.writeFloat(2.7182f);
            dos.writeInt(1234567890);
            dos.writeLong(998877665544332211L);
            dos.writeShort((short) 11223);
        } finally {
            dos.close();
        }
        
        FileInputStream fis = new FileInputStream("a.txt");
        DataInputStream dis = new DataInputStream(fis);
        try {
            System.out.println("\t " + dis.readBoolean());
            System.out.println("\t " + dis.readByte());
            System.out.println("\t " + dis.readChar());
            System.out.println("\t " + dis.readDouble());
            System.out.println("\t " + dis.readFloat());
            System.out.println("\t " + dis.readInt());
            System.out.println("\t " + dis.readLong());
            System.out.println("\t " + dis.readShort());
        } finally {
            dis.close();
        }
    }
}//        throws IOException       。


 
 
文字ストリーム
  :  FileWriter    
    try
        {
            FileWriter fw = new FileWriter("mydata.txt");             
            PrintWriter out = new PrintWriter(fw); 
            out.print("    ,");
            out.println("    !");
            out.println("    !!");
            out.close();
            fw.close();
        }catch(IOException e)
        {
            e.printStackTrace();
        }


  :     BufferedReader
import java.io.*;
class SuperTest{
    public static void main(String args[]) throws IOException
    {
        File file = new File("mydata.txt");
        
        try {
            BufferedReader in = new BufferedReader(new FileReader(file));
            String s;
            s = in.readLine();
            while ( s != null ) {
                System.out.println("Read: " + s);
                s = in.readLine();
            }
            in.close();
        } catch (FileNotFoundException e1) {
            System.err.println("File not found: " + file);
        } catch (IOException e2) {
            e2.printStackTrace();
        }
    }
}


  :  (FileReader FileWriter)
            try {
                    FileReader input = new FileReader(args[0]);
                    FileWriter output = new FileWriter(args[1]);
                    
                    char[] buffer = new char[128];
                    int charsRead;
                    charsRead = input.read(buffer);
                    
                    while ( charsRead != -1 ) 
                    {
                        output.write(buffer, 0, charsRead);
                        charsRead = input.read(buffer);
                    }
                    
                    input.close();
                    output.close();
                } catch (IOException e) 
                {
                    e.printStackTrace();            
                }
            }


  :  (BufferedWriter)
try {
        FileReader input = new FileReader(args[0]);
        BufferedReader bufInput = new BufferedReader(input);
        FileWriter output = new FileWriter(args[1]);
        BufferedWriter bufOutput = new BufferedWriter(output);
        String line;
        
        line = bufInput.readLine();
        while ( line != null ) 
        {
            bufOutput.write(line, 0, line.length());
            bufOutput.newLine();
            line = bufInput.readLine();
        }
        
        bufInput.close();
        bufOutput.close();
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }


 
ランダムアクセスファイルストリーム--RandomAccessFile 1 RandomAccessFileは特殊なファイルストリームであり、ファイルのどこでもデータ2 RandomAccessFileを検索または挿入することができ、同時にDataInputとDataOutputインタフェースを実現することができる.ファイル3コンストラクタの読み取り/書き込みに使用できます:RandomAccessFile(java.io.File f,String mode)RandomAccessFile(String file,String mode)4 modeは「r」または「rw」です.
方法:1 readXXX()またはwriteXXX()のようにReadInt()、ReadLine()、WriteChar()、WriteDouble()などの2 int skipBytes(int n):ポインタを数バイト下に移動3 length():ファイル長4 long getFilePointer()を返す:ポインタの現在位置5 void seek(long pos):ポインタを所望の位置に移動する
import java.io.*;
import java.util.*;

class RandomAccessFileTest{
    public static void main(String args[])
    {
        try{
              File logfile=new File("mydata.txt");
              
              if(logfile.exists())
              {
    RandomAccessFile raf=new RandomAccessFile(logfile,"rw");
                  System.out.println("leghth = " + raf.length());
                  raf.seek(raf.length());
                  
                  for(int i=0;i<5;i++)
                  {
                      raf.writeBytes("Write "+new Date()+ "\r
"); } raf.seek(0); String x=raf.readLine(); while(x!=null) { System.out.println(x); x=raf.readLine(); } raf.close(); } }catch(IOException e){ e.printStackTrace(); } } }


 
JAVAストリームまとめ:1 Javaでデータ転送がある場所ではI/Oストリーム(通常はファイル,ネットワーク,メモリ,標準入出力など)が用いられる.2 InputStreamとOutputStreamはすべてのバイトストリームの祖先(RandomAccessFileクラスのみが例外)であり、readとwriteはそれらの最も基本的な方法であり、読み書き単位はバイト3 ReaderとWriterはすべての文字ストリームの祖先であり、readとwriteはそれらの最も基本的な方法であり、読み書き単位は文字である.4多くのストリームオブジェクトでは、それぞれが単独で使用されるわけではありません.フィルタリングされたストリームのサブクラスは、データが送信される前に5 File、File(Input/Output)Stream、RandomAccessFileがローカルファイルを処理するクラスです.6 Data(Input/Output)Streamは、ストリームをフィルタリングするサブクラスであり、様々な基本データを読み書きすることができ、ファイルやネットワークでよく使用されます.例:readByte,writeBooleanなど.7 Buffered(Input/Output)Streamの役割は、データが送信される前にキャッシュし、一定数に達したときに送信することであり、ブロック数を減らすことです.8 Piped(Input/Output)Streamは、ある処理の出力と別の処理の入力として適合する場合