작업 후 기술은 프로젝트 변경에 따른 변경 사항을 사용했으며 때로는 C#, 때로는 Java, 물론 다른 단편적인 기술도 사용했습니다. 전반적으로 C#은 시간이 더 오래 걸리고 Java가 그 뒤를 따릅니다. 나는 언어에 대한 선호도가 없습니다. 일을 할 수 있는 언어가 좋은 언어입니다. 그리고 객체 지향 관점에서 보면 C#과 Java 사이에는 차이가 없다고 생각합니다.
이 기사에서는 주로 Java의 I/O 작업과 관련된 내용을 검토합니다. I/O는 프로그래밍 언어의 기본 기능이기도 합니다. Java의 I/O는 순차 읽기와 무작위 읽기로 구분됩니다.
먼저 순차 읽기를 살펴보겠습니다. 순차 읽기를 수행하는 방법에는 두 가지가 있습니다. 하나는 바이트로 작동하는 입력 및 출력 스트림이고, 다른 하나는 입력 및 출력으로 작동하는 리더/라이터입니다. 작업의 흐름.
아래에는 InputStream의 구조가 그려져 있습니다.
FileInputStream: 파일을 작동하며 종종 BufferedInputStream과 함께 사용됩니다.
PipedInputStream: 스레드 간 통신에 사용할 수 있습니다.
ObjectInputStream: 객체 직렬화에 사용할 수 있습니다.
ByteArrayInputStream: 바이트 배열의 입력을 처리하는 데 사용됩니다.
LineNumberInputStream: 현재 라인 번호를 출력할 수 있으며 프로그램에서 수정 가능
다음은 OutputStream의 구조입니다.
PrintStream: 출력 데이터에 print 및 println과 유사한 인터페이스를 제공합니다.
Stream을 사용하여 입력과 출력을 연산하는 방법을 살펴보겠습니다.
InputStream을 사용하여 파일 읽기
다음과 같이 코드 코드를 복사합니다 .
FileInputStream을 사용하여 파일 정보 읽기
public static byte[] readFileByFileInputStream(파일 파일)이 IOException을 발생시킵니다.
{
ByteArrayOutputStream 출력 = 새로운 ByteArrayOutputStream();
FileInputStream fis = null;
노력하다
{
fis = new FileInputStream(파일);
바이트[] 버퍼 = 새 바이트[1024];
int bytesRead = 0;
while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1)
{
출력.쓰기(버퍼, 0, 바이트읽기);
}
}
catch(예외예외)
{
System.out.println("읽는 동안 오류가 발생했습니다. " + file.getAbsoluteFile());
}
마지막으로
{
if (fis !=null) fis.close();
if (출력 !=null) output.close();
}
return output.toByteArray();
}
BufferedInputStream을 사용하여 파일 읽기
다음과 같이 코드 코드를 복사합니다 .
public static byte[] readFileByBufferedInputStream(파일 파일)이 예외를 발생시킵니다.
{
FileInputStream fis = null;
BufferedInputStream bis = null;
ByteArrayOutputStream 출력 = 새로운 ByteArrayOutputStream();
노력하다
{
fis = new FileInputStream(파일);
bis = 새로운 BufferedInputStream(fis);
바이트[] 버퍼 = 새 바이트[1024];
int bytesRead = 0;
while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)
{
출력.쓰기(버퍼, 0, 바이트읽기);
}
}
catch(예외예외)
{
System.out.println("읽는 동안 오류가 발생했습니다. " + file.getAbsoluteFile());
}
마지막으로
{
if (fis != null) fis.close();
if (bis != null) bis.close();
if (출력 != null) output.close();
}
return output.toByteArray();
}
OutputStream을 사용하여 파일 복사
다음과 같이 코드 코드를 복사합니다 .
FileOutputStream을 사용하여 파일 복사
public static void copyFileByFileOutputStream(파일 파일)이 IOException을 발생시킵니다.
{
FileInputStream fis = null;
FileOutputStream fos = null;
노력하다
{
fis = new FileInputStream(파일);
fos = new FileOutputStream(file.getName() + ".bak");
바이트[] 버퍼 = 새 바이트[1024];
int bytesRead = 0;
while((bytesRead = fis.read(buffer,0,buffer.length)) != -1)
{
fos.write(buffer, 0, bytesRead);
}
fos.flush();
}
catch(예외예외)
{
System.out.println("복사 중 오류가 발생했습니다. " + file.getAbsoluteFile());
}
마지막으로
{
if (fis != null) fis.close();
if (fos != null) fos.close();
}
}
다음과 같이 코드 코드를 복사합니다 .
BufferedOutputStream을 사용하여 파일 복사
public static void copyFilebyBufferedOutputStream(파일 파일)이 IOException을 발생시킵니다.
{
FileInputStream fis = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
노력하다
{
fis = new FileInputStream(파일);
bis = 새로운 BufferedInputStream(fis);
fos = new FileOutputStream(file.getName() + ".bak");
bos = 새로운 BufferedOutputStream(fos);
바이트[] 버퍼 = 새 바이트[1024];
int bytesRead = 0;
while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)
{
bos.write(버퍼, 0, bytesRead);
}
bos.flush();
}
catch(예외예외)
{
System.out.println("복사 중 오류가 발생했습니다. " + file.getAbsoluteFile());
}
마지막으로
{
if (fis != null) fis.close();
if (bis != null) bis.close();
if (fos != null) fos.close();
if (bos != null) bos.close();
}
}
여기의 코드는 예외를 매우 불완전하게 처리합니다. 나중에 완전하고 엄격한 코드를 제공할 것입니다.
Reader의 구조를 살펴보겠습니다.
여기의 Reader는 기본적으로 InputStream에 해당합니다.
Writer의 구조는 다음과 같습니다.
Reader 또는 Writer를 사용하는 몇 가지 예를 살펴보겠습니다.
Reader를 사용하여 파일 내용 읽기
다음과 같이 코드 코드를 복사합니다 .
BufferedReader를 사용하여 파일 내용 읽기
공개 정적 문자열 readFile(문자열 파일)이 IOException을 발생시킵니다.
{
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
노력하다
{
br = new BufferedReader(새 FileReader(파일));
문자열 라인 = null;
while((line = br.readLine()) != null)
{
sb.append(라인);
}
}
catch(예외예외)
{
System.out.println("파일을 읽는 중 오류가 발생했습니다. " + 파일);
}
마지막으로
{
if (br != null) br.close();
}
sb.toString()을 반환합니다.
}
Writer를 사용하여 파일 복사
다음과 같이 코드 코드를 복사합니다 .
BufferedWriter를 사용하여 파일 복사
public static void copyFile(String file)이 IOException을 발생시킵니다.
{
BufferedReader br = null;
BufferedWriter bw = null;
노력하다
{
br = new BufferedReader(새 FileReader(파일));
bw = new BufferedWriter(new FileWriter(file + ".bak"));
문자열 라인 = null;
while((line = br.readLine())!= null)
{
bw.write(라인);
}
}
catch(예외예외)
{
System.out.println("복사 중 오류가 발생했습니다. " + 파일);
}
마지막으로
{
if (br != null) br.close();
if (bw != null) bw.close();
}
}
파일에 대한 임의 액세스를 수행하는 방법을 살펴보겠습니다. RandomAccessFile은 주로 Java에서 파일에 대한 임의 작업을 수행하는 데 사용됩니다.
고정된 크기의 파일 만들기
다음과 같이 코드 코드를 복사합니다 .
고정 크기 파일 만들기
public static void createFile(String file, int size)이 IOException을 발생시킵니다.
{
파일 임시 = 새 파일(파일);
RandomAccessFile raf = new RandomAccessFile(temp, "rw");
raf.setLength(크기);
raf.close();
}
파일에 임의의 데이터 쓰기
다음과 같이 코드 코드를 복사합니다 .
파일에 임의의 데이터 삽입
public static void writeFile(String file, byte[] content, int startPos, int contentLength)에서 IOException이 발생합니다.
{
RandomAccessFile raf = new RandomAccessFile(new File(file), "rw");
raf.seek(startPos);
raf.write(content, 0, contentLength);
raf.close();
}
다음으로 다른 일반적인 작업을 살펴보겠습니다.
파일 이동
다음과 같이 코드 코드를 복사합니다 .
파일 이동
공개 정적 부울 moveFile(String sourceFile, String destFile)
{
파일 소스 = new File(sourceFile);
if (!source.exists()) throw new RuntimeException("소스 파일이 존재하지 않습니다.");
파일 대상 = 새 파일(destFile);
if (!(new File(dest.getPath()).exists())) new File(dest.getParent()).mkdirs();
return source.renameTo(dest);
}
파일 복사
다음과 같이 코드 코드를 복사합니다 .
파일 복사
public static void copyFile(String sourceFile, String destFile)이 IOException을 발생시킵니다.
{
파일 소스 = new File(sourceFile);
if (!source.exists()) throw new RuntimeException("파일이 존재하지 않습니다.");
if (!source.isFile()) throw new RuntimeException("파일이 아닙니다.");
if (!source.canRead()) throw new RuntimeException("파일을 읽을 수 없습니다.");
파일 대상 = 새 파일(destFile);
if (dest.exists())
{
if (dest.isDirectory()) throw new RuntimeException("대상은 폴더입니다.");
또 다른
{
dest.delete();
}
}
또 다른
{
파일 parentFolder = new File(dest.getParent());
if (!parentFolder.exists()) parentFolder.mkdirs();
if (!parentFolder.canWrite()) throw new RuntimeException("대상을 쓸 수 없습니다.");
}
FileInputStream fis = null;
FileOutputStream fos = null;
노력하다
{
fis = new FileInputStream(소스);
fos = 새로운 FileOutputStream(dest);
바이트[] 버퍼 = 새 바이트[1024];
int bytesRead = 0;
while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1)
{
fos.write(buffer, 0, bytesRead);
}
fos.flush();
}
catch(IOException ex)
{
System.out.println("복사 중 오류가 발생했습니다. " + sourceFile);
}
마지막으로
{
if (fis != null) fis.close();
if (fos != null) fos.close();
}
}
폴더 복사
다음과 같이 코드 코드를 복사합니다 .
폴더 복사
public static void copyDir(String sourceDir, String destDir)에서 IOException이 발생합니다.
{
파일 소스 = new File(sourceDir);
if (!source.exists()) throw new RuntimeException("소스가 존재하지 않습니다.");
if (!source.canRead()) throw new RuntimeException("소스를 읽을 수 없습니다.");
파일 대상 = 새 파일(destDir);
if (!dest.exists()) dest.mkdirs();
파일[] arrFiles = source.listFiles();
for(int i = 0; i < arrFiles.length; i++)
{
if (arrFiles[i].isFile())
{
BufferedReader 리더 = new BufferedReader(new FileReader(arrFiles[i]));
BufferedWriter 작가 = new BufferedWriter(new FileWriter(destDir + "/" + arrFiles[i].getName()));
문자열 라인 = null;
while((line = reader.readLine()) != null)writer.write(line);
작가.플러시();
reader.close();
작가.닫기();
}
또 다른
{
copyDir(sourceDir + "/" + arrFiles[i].getName(), destDir + "/" + arrFiles[i].getName());
}
}
}
폴더 삭제
다음과 같이 코드 코드를 복사합니다 .
폴더 삭제
공개 정적 무효 델(문자열 파일 경로)
{
파일 파일 = 새 파일(filePath);
if (file == null || !file.exists()) return;
if (file.is파일())
{
파일.삭제();
}
또 다른
{
파일[] arrFiles = file.listFiles();
if (arrFiles.length > 0)
{
for(int i = 0; i < arrFiles.length; i++)
{
del(arrFiles[i].getAbsolutePath());
}
}
파일.삭제();
}
}
폴더 크기 가져오기
다음과 같이 코드 코드를 복사합니다 .
폴더 크기 가져오기
공개 정적 긴 getFolderSize(문자열 디렉토리)
{
긴 크기 = 0;
파일 파일 = 새 파일(dir);
if (!file.exists()) throw new RuntimeException("디렉토리가 존재하지 않습니다.");
if (file.isFile()) return file.length();
또 다른
{
String[] arrFileName = 파일.목록();
for (int i = 0; i < arrFileName.length; i++)
{
size += getFolderSize(dir + "/" + arrFileName[i]);
}
}
반품 크기;
}
큰 파일을 여러 개의 작은 파일로 분할
다음과 같이 코드 코드를 복사합니다 .
큰 파일을 여러 개의 작은 파일로 분할
공개 정적 무효 분할 파일(문자열 파일 경로, 긴 단위)이 IOException을 발생시킵니다.
{
파일 파일 = 새 파일(filePath);
if (!file.exists()) throw new RuntimeException("파일이 존재하지 않습니다.");
긴 크기 = file.length();
if (단위 >= 크기) return;
int 개수 = 크기 % 단위 == 0 ? (int)(크기/단위) : (int)(크기/단위) + 1;
문자열 newFile = null;
FileOutputStream fos = null;
FileInputStream fis =null;
바이트[] 버퍼 = 새 바이트[(int)단위];
fis = new FileInputStream(파일);
긴 startPos = 0;
문자열 countFile = filePath + "_Count";
PrintWriter 작가 = new PrintWriter(new FileWriter( new File(countFile)));
writer.println(filePath + "/t" + 크기);
for (int i = 1; i <= count; i++)
{
newFile = 파일 경로 + "_" + i;
startPos = (i - 1) * 단위;
System.out.println("만드는 중 " + newFile);
fos = new FileOutputStream(new File(newFile));
int bytesRead = fis.read(buffer, 0, buffer.length);
if (bytesRead != -1)
{
fos.write(buffer, 0, bytesRead);
writer.println(newFile + "/t" + startPos + "/t" + bytesRead);
}
fos.flush();
fos.close();
System.out.println("StartPos:" + i*unit + "; EndPos:" + (i*unit + bytesRead));
}
작가.플러시();
작가.닫기();
fis.close();
}
여러 개의 작은 파일을 하나의 큰 파일로 병합
다음과 같이 코드 코드를 복사합니다 .
여러 개의 작은 파일을 하나의 큰 파일로 병합
public static void linkFiles(String countFile)가 IOException을 발생시킵니다.
{
파일 파일 = new File(countFile);
if (!file.exists()) throw new RuntimeException("개개의 파일이 존재하지 않습니다.");
BufferedReader 리더 = new BufferedReader(new FileReader(파일));
문자열 라인 = reader.readLine();
String newFile = line.split("/t")[0];
긴 크기 = Long.parseLong(line.split("/t")[1]);
RandomAccessFile raf = new RandomAccessFile(newFile, "rw");
raf.setLength(크기);
FileInputStream fis = null;
바이트[] 버퍼 = null;
while((line = reader.readLine()) != null)
{
String[] arrInfo = line.split("/t");
fis = new FileInputStream(new File(arrInfo[0]));
버퍼 = 새 바이트[Integer.parseInt(arrInfo[2])];
long startPos = Long.parseLong(arrInfo[1]);
fis.read(buffer, 0, Integer.parseInt(arrInfo[2]));
raf.seek(startPos);
raf.write(buffer, 0, Integer.parseInt(arrInfo[2]));
fis.close();
}
raf.close();
}
외부 명령 실행
다음과 같이 코드 코드를 복사합니다 .
외부 명령 실행
public static void execExternalCommand(문자열 명령, 문자열 인수)
{
프로세스 프로세스 = null;
노력하다
{
process = Runtime.getRuntime().exec(명령어 + " " + 인수);
InputStream은 = process.getInputStream()입니다.
BufferedReader br = new BufferedReader(new InputStreamReader(is));
문자열 라인 = null;
while((line = br.readLine()) != null)
{
System.out.println(line);
}
}
catch(예외예외)
{
System.err.println(ex.getMessage());
}
마지막으로
{
if (프로세스 != null) process.destroy();
}
}