[java] Java에서 파일을 바이트로 []

어떻게 변환합니까 java.io.FileA를 byte[]?



답변

그것은 당신에게 가장 좋은 방법에 달려 있습니다. 생산성면에서는 휠을 재발 명하지 말고 Apache Commons를 사용하십시오. 어느 것이 여기에 있습니다 IOUtils.toByteArray(InputStream input).


답변

JDK 7 부터 사용할 수 있습니다 Files.readAllBytes(Path).

예:

import java.io.File;
import java.nio.file.Files;

File file;
// ...(file is initialised)...
byte[] fileContent = Files.readAllBytes(file.toPath());


답변

JDK 7부터-하나의 라이너 :

byte[] array = Files.readAllBytes(Paths.get("/path/to/file"));

외부 의존성이 필요하지 않습니다.


답변

import java.io.RandomAccessFile;
RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);

Java 8에 대한 설명서 : http://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html


답변

기본적으로 메모리에서 읽어야합니다. 파일을 열고 배열을 할당 한 후 파일에서 배열로 내용을 읽습니다.

가장 간단한 방법은 다음과 유사합니다.

public byte[] read(File file) throws IOException, FileTooBigException {
    if (file.length() > MAX_FILE_SIZE) {
        throw new FileTooBigException(file);
    }
    ByteArrayOutputStream ous = null;
    InputStream ios = null;
    try {
        byte[] buffer = new byte[4096];
        ous = new ByteArrayOutputStream();
        ios = new FileInputStream(file);
        int read = 0;
        while ((read = ios.read(buffer)) != -1) {
            ous.write(buffer, 0, read);
        }
    }finally {
        try {
            if (ous != null)
                ous.close();
        } catch (IOException e) {
        }

        try {
            if (ios != null)
                ios.close();
        } catch (IOException e) {
        }
    }
    return ous.toByteArray();
}

파일 내용을 불필요하게 복사하는 경우가 있습니다 (실제로 데이터를 파일에서 buffer,에서 buffer으로 ByteArrayOutputStream, ByteArrayOutputStream실제 결과 배열로 세 번 복사 함 ).

또한 메모리에서 특정 크기의 파일 만 읽도록해야합니다 (일반적으로 응용 프로그램에 따라 다름) :-).

또한 IOException함수 외부 를 처리해야 합니다.

다른 방법은 다음과 같습니다.

public byte[] read(File file) throws IOException, FileTooBigException {
    if (file.length() > MAX_FILE_SIZE) {
        throw new FileTooBigException(file);
    }

    byte[] buffer = new byte[(int) file.length()];
    InputStream ios = null;
    try {
        ios = new FileInputStream(file);
        if (ios.read(buffer) == -1) {
            throw new IOException(
                    "EOF reached while trying to read the whole file");
        }
    } finally {
        try {
            if (ios != null)
                ios.close();
        } catch (IOException e) {
        }
    }
    return buffer;
}

불필요한 복사는 없습니다.

FileTooBigException사용자 지정 응용 프로그램 예외입니다. MAX_FILE_SIZE상수는 어플리케이션 파라미터이다.

큰 파일의 경우 스트림 처리 알고리즘을 생각하거나 메모리 매핑을 사용해야합니다 (참조 java.nio).


답변

누군가가 말했듯이 Apache Commons File Utils 에는 원하는 것이있을 수 있습니다.

public static byte[] readFileToByteArray(File file) throws IOException

사용 예 ( Program.java) :

import org.apache.commons.io.FileUtils;
public class Program {
    public static void main(String[] args) throws IOException {
        File file = new File(args[0]);  // assume args[0] is the path to file
        byte[] data = FileUtils.readFileToByteArray(file);
        ...
    }
}


답변

NIO API를 사용할 수도 있습니다. 총 파일 크기 (바이트)가 int에 맞는 한이 코드 로이 작업을 수행 할 수 있습니다.

File f = new File("c:\\wscp.script");
FileInputStream fin = null;
FileChannel ch = null;
try {
    fin = new FileInputStream(f);
    ch = fin.getChannel();
    int size = (int) ch.size();
    MappedByteBuffer buf = ch.map(MapMode.READ_ONLY, 0, size);
    byte[] bytes = new byte[size];
    buf.get(bytes);

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    try {
        if (fin != null) {
            fin.close();
        }
        if (ch != null) {
            ch.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

MappedByteBuffer를 사용한 이후로 매우 빠르다고 생각합니다.