English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
파일 분할 및 결합은 일반적인 요구 사항입니다. 예를 들어: 큰 파일을 업로드할 때, 먼저 작은 부분으로 분할하고, 서버에 전송한 후 결합할 수 있습니다. 많은 고급 분산 파일 시스템(예: google의 GFS, taobao의 TFS)에서도 블록 단위로 파일을 분할하거나 결합합니다.
기본적인 방법을 보여드립니다:
빅 파일이 하나 있다면, 지정된 분할 크기 후(예를 들어:1M切开
단계 1:
원본 파일 크기와 분할 크기에 따라 최종 분할된 작은 파일 수 N을 계산합니다
단계 2:
디스크에 이 N개의 작은 파일을 생성합니다
단계 3:
여러 스레드(스레드 수=파일 분할 수)를 열고, 각 스레드에서 RandomAccessFile의 seek 기능을 사용하여 원본 파일의 각 단계의 단계之首 위치를 정의하고, 그 다음 지정된 크기(즉: 분할 블록 크기)를 읽고, 결국 해당 분할 파일에 쓰면 됩니다. 다중 스레드 병행 처리로 각 작은 파일을 별도로 쓰기 때문에, 속도는 상대적으로 매우 빠르다는 점이 특징입니다.
아래 코드는 파일을 여러个子 파일로 분할하는 코드입니다. 각 파일의 크기는}}100K
package testIO; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Arrays; public class subStream { public static void main(String[] args) { //먼저 원본 파일을 메모리에 읽어들입니다 int eachSize=100*1024; File srcFile =new File("F:",/test/test.txt"); //파일 객체를 생성합니다 splitFile(srcFile,eachSize); } public static void splitFile(File srcFile,int eachSize){ //파일이 분할 요구에 맞는지 확인합니다 if(srcFile.length()==0){ throw new RuntimeException("파일 분할 요구에 맞지 않습니다"); } byte[] fileContent= new byte[(int) srcFile.length()]; try { //파일 내용을 메모리에 읽어들입니다 FileInputStream fis=new FileInputStream(srcFile); fis.read(fileContent); fis.close(); } catch (Exception e) { e.printStackTrace(); } //계산해야 할 주어진 파일을 얼마나 많은 부분으로 분할해야 할지 int fileNumber; if(fileContent.length%eachSize==0){ fileNumber = fileContent.length/eachSize; } else{ fileNumber = fileContent.length/eachSize+1; } for (int i=0;i<fileNumber;i++){ String fileName = srcFile.getName()+"-"+i+".txt"; File fi = new File(srcFile.getParent(), fileName); //현재 파일 경로 아래에 분할된 파일을 생성합니다 byte[] eachContent; //원본 파일 내용을 분할된 파일에 복사합니다 if(i!=fileNumber-1){ eachContent = Arrays.copyOfRange(fileContent, eachSize*i, eachSize*(i+1)); } else{ eachContent = Arrays.copyOfRange(fileContent, eachSize*i, fileContent.length); } try { FileOutputStream fos = new FileOutputStream(fi); fos.write(eachContent); fos.close(); System.out.printf("출력된 서브 파일 %s, 그 크기는 %d, 각각의 크기는 %d\n", fi.getAbsoluteFile(), fi.length(), eachContent.length); } catch (Exception e) { // TODO: 예외 처리 e.printStackTrace(); } } } }
결론
이것이 java IO 스트림을 하나의 파일을 여러个子 파일로 분할하는 코드 예제의 전체 내용입니다. 많은 도움이 되었기를 바랍니다. 관심이 있는 분은 이 사이트의 다른 관련 주제를 참고할 수 있으며, 부족한 점이 있으면 의견을 남겨 주시기 바랍니다. 친구들의 이 사이트에 대한 지지에 감사합니다!
선언: 이 문서의 내용은 인터넷에서 가져왔으며, 원저자에게 속합니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반 내용을 발견하면, 메일을 notice#w로 보내 주시기 바랍니다.3codebox.com(메일을 보내면, #을 @으로 변경하십시오. 신고를 해 주시고, 관련 증거를 제공하십시오. 확인되면, 이 사이트는 즉시 위반 내용을 삭제합니다.)