어떻게 변환합니까 java.io.File
A를 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를 사용한 이후로 매우 빠르다고 생각합니다.