IOストリーム(二)変換ストリーム、シーケンス化、commons-IOフレームワーク


きりかえりゅう


文字ストリームとバイトストリームの間のストリーム
バイトストリームとバイトストリームの相互変換

OutputStreamWriter


出力ストリームは、指定された文字セットに従って符号化され、文字ストリームをバイトデータに変換する
符号化:文字データをバイトデータに変換する;
復号化:バイトデータを文字データバイナリデータに変換->文字データ
  • 構築方法:
  • OutputStreamWriter(OutputStream out)は、デフォルト文字(コンピュータシステムの符号化)で符号化されたOutputStreamWriterを作成します.
  • OutputStreamWriter(OutputStream out,String charsetName)指定した文字セットを使用したOutputStreamWriter
  • の作成
  • メソッド
  • void write(char[]cbuf,int off,int len)文字配列の一部をファイルに
  • に書き込む
  • void write(int c)単一文字をファイルに
  • に書き込む
  • void write(String str,int off,int len)文字列の一部をファイルに書き込む

  • InputStreamReader


    入力ストリーム、バイトデータを文字データに変換する
  • 構造方法
  • メソッド
    public class Demo {
    
    public static void main(String[] args) throws Exception {
        method("UTF-8");
    }
    
    public static void method(String encoding) throws UnsupportedEncodingException, FileNotFoundException, IOException {
        InputStreamReader isr=new InputStreamReader(new FileInputStream("a.txt"),encoding);
        char [] cArray=new char[1024];
        int len = isr.read(cArray);
        System.out.println(new String(cArray, 0,len));
        isr.close();
    }
    
    private static void method02() throws UnsupportedEncodingException, FileNotFoundException, IOException {
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8");
        osw.write(" ");
        System.out.println(" ");
        osw.close();
    }
    
    private static void method01() throws FileNotFoundException, IOException {
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("a.txt"));
        osw.write(" ");
        System.out.println(" ");
        osw.close();
    }
    
    }
  • シーケンス化と逆シーケンス化


    シーケンス化(ObjectOutputStream):javaオブジェクトに対応するバイナリデータをファイルに格納する
    逆シーケンス化(ObjectInputStream):ファイル検索中のオブジェクトのバイナリデータをオブジェクトに変換する

    逆シーケンス化タイプ無効な例外の解決方法


    Exception in thread “main” **java.io.InvalidClassException.**com.day12.text.Student; local class incompatible: stream classdesc serialVersionUID = 5347324120869492511, local class serialVersionUID = 6670513660087444604
    理由:当初のシーケンス化では、使用クラスと現在の逆シーケンス化で使用されているクラスは同じバージョンではありません.
    解決方法:シーケンス化で使用されるクラスが、現在逆シーケンス化で使用されているクラスと同じバージョンであることを保証します.

    バージョン番号によるタグ付け

    private static final long serialVersionUID = 6670513660087444604L;
    

    同じバージョン番号のもののみを逆シーケンス化できます

    過渡キーワードtransient


    タグ付けされたプロパティは非表示になり、ファイルに保存されません.

    複数のオブジェクトの書き込みと読み取り方法


    オブジェクトを書き込むには、オブジェクトのプロパティまたはメソッドを変更するたびに、ファイルに再書き込む必要があります.そうしないと、バージョンが一致しない例外が報告されます.
    オブジェクトの読み取り:オブジェクトの読み取り時に、ファイルの読み取りのようにすべてを読み取ることはできません.読み込みは、オブジェクトファイルの最初の要素のみを読み込むことができます.複数の要素を読み込むには、配列または集合を使用してオブジェクトを格納し、配列またはオブジェクトをファイルに書き込むことができます.そして読み取っています.

    ファイルへのオブジェクトコードの書き込み

    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    
    public class DemoObjectOutputStream {
    
        public static void main(String[] args) throws Exception {
            // 
            ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("student1.txt"));
            // 
            ArrayListlist=new ArrayList();
    
            //   
    //      Student[] stu=new Student[3];
    //      stu[0]=new Student(" ",87);
    //      stu[1]=new Student(" ",67);
    //      stu[2]=new Student(" ",77);
            Student stu=new Student(" ",77);
            Student stu1=new Student(" 1",77);
            list.add(stu);
            list.add(stu1);
            // 
        /*  for(int i=0;i

    オブジェクトをコンソールに読み込む(メモリ)

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.ObjectInputStream;
    import java.util.ArrayList;
    
    public class DemoObjectInputStream {
    
        public static void main(String[] args) throws Exception {
            // 
            ObjectInputStream ois=new ObjectInputStream(new FileInputStream("student1.txt"));
            //Student []stu=(Student[])ois.readObject();
            ArrayList list = (ArrayList) ois.readObject();
            System.out.println(list.get(0).getName());
            ois.close();
        }
    
    
    }
    

    学生オブジェクトコード

    import java.io.Serializable;
    
    public class Student implements Serializable{
    
        private String name;
        private int grade;
    
    
        public Student(String name, int grade) {
            super();
            this.name = name;
            this.grade = grade;
        }
        @Override
        public String toString() {
            return "Student [name=" + name + ", grade=" + grade + "]";
        }
        public Student() {
            super();
            // TODO Auto-generated constructor stub
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getGrade() {
            return grade;
        }
        public void setGrade(int grade) {
            this.grade = grade;
        }
    }
    

    commons-IOフレームワーク


    サードパーティ製フレームワークには、ファイルを操作するツールクラスがあります.