파일 전송 기초 자바 IO 흐름

질문
아주 유명한 이상 한 현상:windows 수첩 에 파일 을 새로 만 들 고'연결'이라는 두 글 자 를 입력 한 후에 저장 하고 닫 은 다음 에 다시 열 면 이 두 글자 가 이미 사 라 졌 다 는 것 을 알 게 될 것 입 니 다.대신 몇 개의 어 지 러 운 코드 입 니 다!하하,연합 이 이동 을 못 하 는 이유 라 는 말 이 있다.사실 GB 2312 인 코딩 과 UTF 8 인 코딩 이 인 코딩 충돌 을 일 으 킨 이유 다.GB 계열 에서'연결'의 바 이 너 리 인 코딩 은 1100001 10101010 11001110101000 입 니 다.
눈치 채 셨 나 요?첫 번 째 바이트,세 번 째 바이트 의 시작 부분 은 모두'110'과'10'입 니 다.마침 UTF 8 규칙 에 있 는 두 바이트 템 플 릿 과 일치 합 니 다.그래서 다시 수첩 을 열 었 을 때 수첩 은 이것 이 UTF 8 인 코딩 파일 이 라 고 오 해 했 습 니 다.첫 번 째 바이트 의 110 과 두 번 째 바이트 의 10 을 제거 하면 우 리 는'00001 101010'을 얻 고 여러분 을 정렬 합 니 다.선도 적 인 0 을 추가 하면'0000 0000 0110 1010'을 얻 을 수 있 습 니 다.죄송합니다.이것 은 유 니 코드 의 006 A,즉 소문 자'j'입 니 다.그 다음 두 바이트 가 UTF 8 로 디 코딩 한 후에 0368 입 니 다.이 문 자 는 아무것도 아 닙 니 다.이것 이 바로'연결'이라는 두 글자 만 있 는 파일 이 수첩 에 정상적으로 표시 되 지 못 하 는 이유 이다.
만약 에'연결'후에 몇 글 자 를 더 입력 하면 다른 글자 의 인 코딩 이 꼭 110 과 10 으로 시 작 된 바이트 가 아니 라 다시 열 때 수첩 은 utf 8 인 코딩 된 파일 이 라 고 주장 하지 않 고 ANSI 방식 으로 해석 할 것 이다.이때 난 코드 는 나타 나 지 않 는 다.
package com.imooc.io;

import java.io.UnsupportedEncodingException;

/**
 * Created by N3verL4nd on 2017/3/8.
 */
public class EncodeDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "  ABC";
        byte[] bytes = str.getBytes("GBK");
        //gbk          ,    1   
        for (byte b : bytes) {
            //   (    int) 16       
            System.out.print(Integer.toHexString(b & 0xff) + " ");
        }
        /**
         *               ,          
         *    ,            ,      
         */
        System.out.println(new String(bytes));//          
        System.out.println("
" + new String(bytes, "UTF-8")); System.out.println(new String(bytes, "GBK")); bytes = str.getBytes("UTF-8"); //UTF-8 , 1 for (byte b : bytes) { System.out.print(Integer.toHexString(b & 0xff) + " "); } System.out.println("
" + new String(bytes)); //java UTF-16BE bytes = str.getBytes("UTF-16BE"); //utf-16be 2 , for (byte b : bytes) { System.out.print(Integer.toHexString(b & 0xff) + " "); } System.out.println("
" + new String(bytes, "UTF-16BE")); /** * * * ANSI */ } }

c4 bd bf ce 41 42 43
Ľ��ABC
Ľ��ABC
ABC
e6 85 95 e8 af be 41 42 43
ABC
61 55 8b fe 0 41 0 42 0 43
ABC
참고:
http://www.iteedu.com/topic/charset/utf8.php
http://oznyang.iteye.com/blog/30692
https://www.zhihu.com/question/25367290
File 클래스 사용
역할:파일(디 렉 터 리)을 표시 하 는 데 사용 되 며,파일(디 렉 터 리)의 정보 만 표시 할 수 있 으 며,파일 접근 에 사용 할 수 없습니다.
package com.imooc.io;

import java.io.File;
import java.io.IOException;

/**
 * Created by N3verL4nd on 2017/3/9.
 */
public class FileDemo {
    public static void main(String[] args) {
        File file = new File("D:/Java/IdeaProjects/JavaProj/JTest/src/com/imooc/io/doc");
        //System.out.println(file.isDirectory());
        if (!file.exists()) {
            file.mkdir();
            System.out.println("   " + file.getAbsolutePath() + "    !");
        } else {
            file.delete();
            System.out.println("   " + file.getAbsolutePath() + "    !");
        }

        file = new File("D:/Java/IdeaProjects/JavaProj/JTest/src/com/imooc/io/doc.txt");
        //file = new File("D:/Java/IdeaProjects/JavaProj/JTest/src/com/imooc/io/", "doc.txt");
        //System.out.println(file.isFile());
        if (!file.exists()) {
            try {
                //    
                file.createNewFile();
                System.out.println("   " + file.getName() + "    !");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            //    
            file.delete();
            System.out.println("   " + file.getName() + "    !");

        }

    }
}
package com.imooc.io;

import java.io.File;

/**
 * Created by N3verL4nd on 2017/3/9.
 *   File        ,    、   
 */
public class FileUtils {
    /**
     *        (      )     
     * @param file
     */
    public static void listDirectory(File file) throws IllegalArgumentException {
        if (!file.exists()) {
            throw new IllegalArgumentException("   " + file + "    !");
        }
        if (!file.isDirectory()) {
            throw new IllegalArgumentException(file + "     !");
        }

        /*//       ,              ,      
        for (String patName : file.list()) {
            System.out.println(file + "\\" + patName);
        }*/

        for (File f : file.listFiles()) {
            if (f.isFile()) {
                System.out.println("[  ]:" + f);
            } else if (f.isDirectory()) {
                System.out.println("[  ]:" + f.getAbsolutePath());
                listDirectory(f);
            }
        }

    }
}

RandomAccessFile 사용
자바 가 제공 하 는 파일 내용 에 대한 접근 은 파일 을 읽 을 수도 있 고 파일 을 쓸 수도 있 습 니 다.
RandomAccessFile 은 임의의 위치 에 접근 할 수 있 는 무 작위 접근 파일 을 지원 합 니 다.
1.자바 파일 모델
하 드 디스크 에 있 는 파일 은 byte byte 에 저 장 된 것 으로 데이터 의 집합 입 니 다.
2.파일 열기
"rw"(읽 기와 쓰기)"r"(읽 기)
RandomAccessFile raf = newRandomAccessFile(file, "rw");
파일 포인터
3.쓰 는 법
raf.write(int)-->한 바이트(후 8 자리)만 쓰 고 파일 포인터 가 다음 위 치 를 가리 키 고 있 습 니 다.
4.읽 는 법
int b=raf.read()---한 바이트 읽 기
5.파일 읽 기와 쓰기 완료 후 반드시 닫 기
raf.close();
package com.imooc.io;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;

/**
 * Created by N3verL4nd on 2017/3/9.
 */
public class rafDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("JTest/doc.txt");
        if (!file.exists())
            file.createNewFile();
        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");

        //     
        System.out.println(randomAccessFile.getFilePointer());
        randomAccessFile.write('A');//   1    'A'-->65-->01000001
        System.out.println(randomAccessFile.getFilePointer());
        randomAccessFile.write('B');
        System.out.println(randomAccessFile.getFilePointer());

        int x = 0x7fffffff;
        randomAccessFile.write(x >>> 24);// 8 
        randomAccessFile.write(x >>> 16);
        randomAccessFile.write(x >>> 8);
        randomAccessFile.write(x);
        System.out.println(randomAccessFile.getFilePointer());

        //randomAccessFile.writeInt(x);
        randomAccessFile.write("   ".getBytes());
        System.out.println("" + randomAccessFile.length());


        //        randomAccessFile.seek(0);
        byte[] buf = new byte[(int) randomAccessFile.length()];
        randomAccessFile.read(buf);
        System.out.println(Arrays.toString(buf));
        for (byte b : buf) {
            System.out.print(Integer.toHexString(b & 0xff) + " ");
        }
        System.out.println();
        System.out.println(new String(buf, "UTF-8"));

        randomAccessFile.close();
    }
}

바이트 흐름 사용
InputStream:응용 프로그램 이 데 이 터 를 읽 는 방식 을 추상 화 했 습 니 다.
Output Stream:프로그램 이 데 이 터 를 쓰 는 방식 을 추상 화 했 습 니 다.
EOF end of file:1 까지 읽 고 끝 까지 읽 었 습 니 다.
입력 흐름 의 기본 방법:
int b = in.read();int 낮은 8 자리 에 기호 없 이 바이트 읽 기
in.read(byte[] buf);바이트 배열 buf 에 데 이 터 를 읽 고 채 웁 니 다.
in.read(byte[] buf, int start, int size);바이트 배열 buf 에 데 이 터 를 읽 고 buf 의 start 위치 부터 size 길이 의 데 이 터 를 저장 합 니 다.
출력 흐름:
out.write(int b);byte 에서 흐름 까지,b 의 낮은 8 자 를 쓰 십시오.
out.write(byte[]buf)는 buf 바이트 배열 을 흐름 에 기록 합 니 다.
out.write(byte[] buf, int start, int size);
FileInputStream-->파일 에 입력 동작 이 구체 적 으로 구현 되 었 습 니 다.
package com.imooc.io;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * Created by N3verL4nd on 2017/3/10.
 */
public class IOUtil {
    /**
     * 16        
     *      10 byte  
     * @param fileName
     */
    public static void printHex(String fileName) throws IOException {
        //             
        FileInputStream in = new FileInputStream(fileName);
        int b;
        int i = 1;
        while ((b = in.read()) != -1) {
            i++;
            if (b <= 0xf) {
                //      0
                System.out.print("0");
            }
            System.out.print(Integer.toHexString(b) + " ");
            if (i % 10 == 0) {
                System.out.println();
            }
        }
        in.close();
    }

    public static void printHexByByteArray(String fileName) throws IOException{
        FileInputStream in = new FileInputStream(fileName);
        byte[] buf = new byte[20 * 1024];
        /**
         *  inbuf       
         *   0buf.length   
         *             
         */
        /*int bytes = in.read(buf, 0, buf.length);
        int j = 1;
        for (int i = 0; i < bytes; i++) {
            j++;
            if (buf[i] <= 0xf) {
                System.out.print("0");
            }
            System.out.print(Integer.toHexString(buf[i]) + " ");
            if (j % 10 == 0) {
                System.out.println();
            }
        }*/

        int bytes;
        while ((bytes = in.read(buf, 0, buf.length)) != -1) {
            int j = 1;
            for (int i = 0; i < bytes; i++) {
                j++;
                if (buf[i] <= 0xf) {
                    System.out.print("0");
                }
                System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
                if (j % 10 == 0) {
                    System.out.println();
                }
            }
        }
    }
}
FileOutputStream 은 파일 에 byte 데 이 터 를 쓰 는 방법 을 실현 했다.
package com.imooc.io;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Created by N3verL4nd on 2017/3/10.
 */
public class FileOutDemo {
    public static void main(String[] args) throws IOException {
        //        ,     ,     ,      
        FileOutputStream out = new FileOutputStream("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt");
        //out.write('A');
        //out.write('B');

        int x = 3389;
        out.write(x >>> 24);
        out.write(x >>> 16);
        out.write(x >>> 8);
        out.write(x);

        //out.write("  ".getBytes());
        IOUtil.printHex("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt");

        out.close();
    }
}
package com.imooc.io;

import java.io.*;

/**
 * Created by N3verL4nd on 2017/3/10.
 */

public class FileCopy {

    public static void Copy(File src, File dst) throws IOException {
        if (!src.exists()) {
            throw new IllegalArgumentException(src + "");
        }
        if (!src.isFile()) {
            throw new IllegalArgumentException(src + "");
        }
        FileInputStream in = new FileInputStream(src);
        FileOutputStream out = new FileOutputStream(dst);

        int len;
        byte[] buf = new byte[1024];
        while ((len = in.read(buf, 0, 1024)) != -1) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    }

    public static void main(String[] args) {
        try {
            Copy(new File("D:\\N3verL4nd\\Desktop\\Pro.txt"), new File("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

DataOutputStream/DataInputStream
대류 기능 의 확장 은 int,long,문자 등 유형의 데 이 터 를 더욱 편리 하 게 읽 을 수 있 습 니 다.
DataOutputStream
writeInt(),writeDouble(),writeUTF()
package com.imooc.io;

import java.io.*;

/**
 * Created by N3verL4nd on 2017/3/11.
 */
public class DosDemo {
    public static void main(String[] args) throws IOException {
        String filename = "D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt";
        DataOutputStream out = new DataOutputStream(new FileOutputStream(filename));
        out.writeInt(100);
        out.writeDouble(1.1);
        //  UTF-8    
        out.writeUTF("  ");

        //  UTF-16BE    
        out.writeChars("  ");
        out.close();

//        IOUtil.printHex(filename);

        DataInputStream in = new DataInputStream(new FileInputStream(filename));
        System.out.println(in.readInt());
        System.out.println(in.readDouble());
        System.out.println(in.readUTF());
        System.out.println(in.readChar());
        System.out.println(in.readChar());
        in.close();
    }
}
BufferedInputStream/BufferedOutputStream
이 두 흐름 은 IO 에 버퍼 가 있 는 동작 을 제공 합 니 다.일반적으로 파일 을 열 어 읽 기와 쓰 기 를 할 때 버퍼 를 추가 하여 IO 성능 을 향상 시 킵 니 다.
문자 흐름 사용
텍스트 와 텍스트 파일:
자바 의 텍스트(char)는 16 비트 부호 없 는 정수 로 문자 의 유 니 코드 인 코딩(두 바이트 인 코딩)입 니 다.
파일 은 byte byte 의 데이터 시퀀스 입 니 다.
텍스트 파일 은 텍스트 시퀀스 가 어떤 인 코딩 방안(UTF-8/UTF-16BE,GBK)에 따라 byte 로 정렬 된 저장 파일 입 니 다.
문자 흐름(Reader 와 Writer)
문자 처리
문자 의 밑바닥 은 여전히 기본 적 인 바이트 서열 이다
문자 흐름 의 기본 실현
InputStreamReader 는 byte 흐름 을 char 흐름 으로 해석 하고 인 코딩 에 따라 해석 합 니 다.
Output Stream Writer 는 char 를 byte 흐름 으로 제공 하고 인 코딩 에 따라 처리 합 니 다.
package com.imooc.io;

import java.io.*;

/**
 * Created by N3verL4nd on 2017/3/12.
 */
public class OSWDemo {
    public static void main(String[] args) {
        String fileName = "D:\\N3verL4nd\\Desktop\\Pro.txt";

        InputStreamReader isr = null;//      
        try {
            isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
        } catch (UnsupportedEncodingException | FileNotFoundException e) {
            e.printStackTrace();
        }

        /*try {
            int c;
            while ((c = isr.read()) != -1) {
                System.out.print((char)c);
            }
            isr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }*/

        char[] buf = new char[1024];
        int len;
        try {
            //    ,  buffer      ,  0     ,   1024 
            //         
            while ((len = isr.read(buf, 0, 1024)) != -1) {
                System.out.print(new String(buf, 0, len));
            }
            isr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
FileReder/FileWriter 는 InputStreamReader/OutputStreamWriter 에서 계승 하여 파일 읽 기와 쓰기 에 더욱 편리 하도록 한다.
문자 흐름 필터
Buffered Reader-->readLine 한 줄 씩 읽 기 Buffered Writer-->writeLine 한 줄 씩 쓰기
package com.imooc.io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * Created by N3verL4nd on 2017/3/12.
 */
public class FRFW {
    public static void main(String[] args) throws IOException {
        FileReader reader = new FileReader("D:\\N3verL4nd\\Desktop\\Pro.txt");
        int c;
        while ((c = reader.read()) != -1) {
            System.out.println(c);
        }
        reader.close();
    }
} 
package com.imooc.io;

import java.io.*;

/**
 * Created by N3verL4nd on 2017/3/10.
 */

public class FileCopy {

    public static void Copy(File src, File dst) throws IOException {
        if (!src.exists()) {
            throw new IllegalArgumentException(src + "   !");
        }
        if (!src.isFile()) {
            throw new IllegalArgumentException(src + "    !");
        }
        FileInputStream in = new FileInputStream(src);
        FileOutputStream out = new FileOutputStream(dst);

        int len;
        byte[] buf = new byte[1024];
        while ((len = in.read(buf, 0, 1024)) != -1) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    }

    public static void CopyFileByBuffer(File src, File dst) throws IOException {
        if (!src.exists()) {
            throw new IllegalArgumentException(src + "   !");
        }
        if (!src.isFile()) {
            throw new IllegalArgumentException(src + "    !");
        }

        BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dst));

        int len;
        byte[] buf = new byte[1024];
        while ((len = in.read(buf, 0, 1024)) != -1) {
            out.write(buf, 0, len);
//            out.flush();//     
        }
        in.close();
        out.close();
    }

    public static void main(String[] args) {
        try {
            long start = System.currentTimeMillis();
            CopyFileByBuffer(new File("F:\\H4ck\\bjut\\db.html"), new File("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt"));
            //Copy(new File("F:\\H4ck\\bjut\\db.html"), new File("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt"));
            long end = System.currentTimeMillis();
            System.out.println(end - start);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

대상 의 직렬 화 와 반 직렬 화
대상 의 서열 화 는 Objext 를 byte 서열 로 바 꾸 는 것 이 고,반대로 반 서열 화 라 고 한다.
직렬 화 흐름:ObjextOutputStream--->writeObject
역 직렬 화:ObjectInputStream--->readObject
직렬 화 인터페이스(Serializable)
대상 은 반드시 직렬 화 인 터 페 이 스 를 실현 해 야 직렬 화 를 할 수 있 으 며,그렇지 않 으 면 이상 이 생 길 것 이다.
이 인 터 페 이 스 는 아무런 방법 도 없고 단지 하나의 표준 일 뿐이다.
package com.imooc.io;

import java.io.*;

/**
 * Created by N3verL4nd on 2017/3/12.
 */
public class BRBW {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream("D:\\N3verL4nd\\Desktop\\Pro.txt")
                ));

        while (reader.ready()) {
            System.out.println(reader.readLine());
        }
        reader.close();
    }
}
package com.imooc.io;

import java.io.Serializable;

/**
 * Created by N3verL4nd on 2017/3/12.
 */
public class Student implements Serializable{
    private String stuNO;
    private String name;
    private int age;

    public Student() {
    }

    public Student(String stuNO, String name, int age) {
        this.stuNO = stuNO;
        this.name = name;
        this.age = age;
    }

    public String getStuNO() {
        return stuNO;
    }

    public void setStuNO(String stuNO) {
        this.stuNO = stuNO;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuNO='" + stuNO + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.imooc.io;

import java.io.*;

/**
 * Created by N3verL4nd on 2017/3/12.
 */
public class ObjectSerializable {
    public static void main(String[] args) {
        String fileName = "D:\\Java\\IdeaProjects\\JavaProj\\JTest\\src\\com\\imooc\\io\\doc\\data.dat";
        Student student = new Student("10010", "lgh", 24);
        try {
            //      
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));
            // student      
            out.writeObject(student);
            out.close();
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
            Student stu = (Student) in.readObject();
            System.out.println(stu);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

이 요 소 는 가상 컴퓨터 의 기본 직렬 화 작업 을 하지 않 고 이 요소 의 직렬 화 를 스스로 완성 할 수 있 습 니 다.
Array List 와 관련 된 동작 을 참고 할 수 있 습 니 다.
private transient int age;//                  
private void readObject(java.io.ObjectInputStream s)
    throws java.io.IOException, ClassNotFoundException {
    elementData = EMPTY_ELEMENTDATA;

    // Read in size, and any hidden stuff
    s.defaultReadObject();

    // Read in capacity
    s.readInt(); // ignored

    if (size > 0) {
        // be like clone(), allocate array based upon size not capacity
        ensureCapacityInternal(size);

        Object[] a = elementData;
        // Read in all elements in the proper order.
        for (int i=0; i<size; i++) {
            a[i] = s.readObject();
        }
    }
}
private void writeObject(java.io.ObjectOutputStream s)
    throws java.io.IOException{
    // Write out element count, and any hidden stuff
    int expectedModCount = modCount;
    s.defaultWriteObject();

    // Write out size as capacity for behavioural compatibility with clone()
    s.writeInt(size);

    // Write out all elements in the proper order.
    for (int i=0; i<size; i++) {
        s.writeObject(elementData[i]);
    }

    if (modCount != expectedModCount) {
        throw new ConcurrentModificationException();
    }
}
package com.imooc.io;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

/**
 * Created by N3verL4nd on 2017/3/12.
 */
public class Student implements Serializable{
    private String stuNO;
    private String name;
    private transient int age;//                  

    public Student() {
    }

    public Student(String stuNO, String name, int age) {
        this.stuNO = stuNO;
        this.name = name;
        this.age = age;
    }

    public String getStuNO() {
        return stuNO;
    }

    public void setStuNO(String stuNO) {
        this.stuNO = stuNO;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuNO='" + stuNO + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    private void writeObject(java.io.ObjectOutputStream s)
            throws java.io.IOException{
        //  jvm               
        s.defaultWriteObject();
        //    age      
        s.writeInt(age);
    }

    private void readObject(java.io.ObjectInputStream s)
            throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();
        this.age = s.readInt();
    }
}

ArrayList 는 배열 의 유효 데이터 요소 의 직렬 화 작업 을 합 니 다.
하나의 클래스 가 직렬 화 인 터 페 이 스 를 실현 하면 그 하위 클래스 는 모두 직렬 화 작업 을 할 수 있다.
서열 화 중성자 류 와 부류 구조 함수 의 호출 문제:
하위 클래스 대상 에 대해 역 직렬 화 작업 을 할 때,
부모 클래스 가 직렬 화 인 터 페 이 스 를 실현 하지 않 으 면 부모 클래스 의 구조 함수 가 호출 된다.
transient Object[] elementData; // non-private to simplify nested class access

좋은 웹페이지 즐겨찾기