자바 회고 기반 I/O 사용 상세 설명
이 글 은 주로 자바 와 I/O 작업 과 관련 된 내용 을 되 돌아 본다.I/O 도 프로 그래 밍 언어의 기본 적 인 특성 이다.자바 의 I/O 는 두 가지 유형 으로 나 뉘 는데 하 나 는 순서대로 읽 는 것 이 고 하 나 는 무 작위 로 읽 는 것 이다.
우 리 는 먼저 순 서 를 보고 읽 을 수 있 습 니 다.두 가지 방식 으로 순서대로 읽 을 수 있 습 니 다.하 나 는 InputStream/OutputStream 입 니 다.이것 은 바이트 에 대한 입 출력 흐름 입 니 다.다른 하 나 는 Reader/Writer 입 니 다.문 자 를 위 한 입 출력 흐름 입 니 다.
다음은 InputStream 의 구 조 를 그 려 보도 록 하 겠 습 니 다.
FileInputStream:파일 조작,BufferedInputStream 과 함께 자주 사용 PipedInputStream:스 레 드 간 통신 에 사용 가능 ObjectInputStream:대상 서열 화 에 사용 가능 ByteArray InputStream:바이트 배열 의 입력 을 처리 하 는 데 사용 합 니 다. LineNumberInputStream:현재 줄 수 를 출력 할 수 있 으 며 프로그램 에서 수정 할 수 있 습 니 다.
다음은 OutputStream 의 구조
PrintStream:print 와 println 과 같은 인 터 페 이 스 를 제공 하여 데 이 터 를 출력 합 니 다.
입 출력 을 어떻게 스 트림 으로 조작 하 는 지 살 펴 보 겠 습 니 다.
InputStream 으로 파일 읽 기
FileInputStream
public static byte[] readFileByFileInputStream(File file) throws IOException
{
ByteArrayOutputStream output = new ByteArrayOutputStream();
FileInputStream fis = null;
try
{
fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1)
{
output.write(buffer, 0, bytesRead);
}
}
catch(Exception ex)
{
System.out.println("Error occurs during reading " + file.getAbsoluteFile());
}
finally
{
if (fis !=null) fis.close();
if (output !=null) output.close();
}
return output.toByteArray();
}
BufferedInputStream 으로 파일 읽 기
public static byte[] readFileByBufferedInputStream(File file) throws Exception
{
FileInputStream fis = null;
BufferedInputStream bis = null;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try
{
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)
{
output.write(buffer, 0, bytesRead);
}
}
catch(Exception ex)
{
System.out.println("Error occurs during reading " + file.getAbsoluteFile());
}
finally
{
if (fis != null) fis.close();
if (bis != null) bis.close();
if (output != null) output.close();
}
return output.toByteArray();
}
OutputStream 으로 파일 복사
FileOutputStream
public static void copyFileByFileOutputStream(File file) throws IOException
{
FileInputStream fis = null;
FileOutputStream fos = null;
try
{
fis = new FileInputStream(file);
fos = new FileOutputStream(file.getName() + ".bak");
byte[] buffer = new byte[1024];
int bytesRead = 0;
while((bytesRead = fis.read(buffer,0,buffer.length)) != -1)
{
fos.write(buffer, 0, bytesRead);
}
fos.flush();
}
catch(Exception ex)
{
System.out.println("Error occurs during copying " + file.getAbsoluteFile());
}
finally
{
if (fis != null) fis.close();
if (fos != null) fos.close();
}
}
BufferedOutputStream
public static void copyFilebyBufferedOutputStream(File file)throws IOException
{
FileInputStream fis = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try
{
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
fos = new FileOutputStream(file.getName() + ".bak");
bos = new BufferedOutputStream(fos);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)
{
bos.write(buffer, 0, bytesRead);
}
bos.flush();
}
catch(Exception ex)
{
System.out.println("Error occurs during copying " + file.getAbsoluteFile());
}
finally
{
if (fis != null) fis.close();
if (bis != null) bis.close();
if (fos != null) fos.close();
if (bos != null) bos.close();
}
}
이곳 의 코드 는 이상 에 대한 처리 가 매우 불완전 합 니 다.잠시 후에 우 리 는 완전 하고 엄밀 한 코드 를 제시 할 것 입 니 다.다음은 리더 의 구조를 살 펴 보 겠 습 니 다.
Writer 의 구 조 는 다음 과 같다.다음은 Reader 나 Writer 를 사용 하 는 예 를 살 펴 보 자.
Reader 를 사용 하여 파일 내용 읽 기
BufferedReader
public static String readFile(String file)throws IOException
{
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
try
{
br = new BufferedReader(new FileReader(file));
String line = null;
while((line = br.readLine()) != null)
{
sb.append(line);
}
}
catch(Exception ex)
{
System.out.println("Error occurs during reading " + file);
}
finally
{
if (br != null) br.close();
}
return sb.toString();
}
Writer 로 파일 복사
BufferedWriter
public static void copyFile(String file) throws IOException
{
BufferedReader br = null;
BufferedWriter bw = null;
try
{
br = new BufferedReader(new FileReader(file));
bw = new BufferedWriter(new FileWriter(file + ".bak"));
String line = null;
while((line = br.readLine())!= null)
{
bw.write(line);
}
}
catch(Exception ex)
{
System.out.println("Error occurs during copying " + file);
}
finally
{
if (br != null) br.close();
if (bw != null) bw.close();
}
}
를 사용 합 니 다.다음은 파일 에 무 작위 로 접근 하 는 방법 을 보 겠 습 니 다.자바 에 서 는 주로 RandomAccessFile 을 사용 하여 파일 을 무 작위 로 조작 합 니 다.크기 가 고정 되 어 있 는 파일
public static void createFile(String file, int size) throws IOException
{
File temp = new File(file);
RandomAccessFile raf = new RandomAccessFile(temp, "rw");
raf.setLength(size);
raf.close();
}
을 만 들 고 파일 에 무 작위 로 데 이 터 를 기록 합 니 다
public static void writeFile(String file, byte[] content, int startPos, int contentLength) throws IOException
{
RandomAccessFile raf = new RandomAccessFile(new File(file), "rw");
raf.seek(startPos);
raf.write(content, 0, contentLength);
raf.close();
}
.이동 파일
public static boolean moveFile(String sourceFile, String destFile)
{
File source = new File(sourceFile);
if (!source.exists()) throw new RuntimeException("source file does not exist.");
File dest = new File(destFile);
if (!(new File(dest.getPath()).exists())) new File(dest.getParent()).mkdirs();
return source.renameTo(dest);
}
복사 파일
public static void copyFile(String sourceFile, String destFile) throws IOException
{
File source = new File(sourceFile);
if (!source.exists()) throw new RuntimeException("File does not exist.");
if (!source.isFile()) throw new RuntimeException("It is not file.");
if (!source.canRead()) throw new RuntimeException("File cound not be read.");
File dest = new File(destFile);
if (dest.exists())
{
if (dest.isDirectory()) throw new RuntimeException("Destination is a folder.");
else
{
dest.delete();
}
}
else
{
File parentFolder = new File(dest.getParent());
if (!parentFolder.exists()) parentFolder.mkdirs();
if (!parentFolder.canWrite()) throw new RuntimeException("Destination can not be written.");
}
FileInputStream fis = null;
FileOutputStream fos = null;
try
{
fis = new FileInputStream(source);
fos = new FileOutputStream(dest);
byte[] buffer = new byte[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("Error occurs during copying " + sourceFile);
}
finally
{
if (fis != null) fis.close();
if (fos != null) fos.close();
}
}
복사 폴 더
public static void copyDir(String sourceDir, String destDir) throws IOException
{
File source = new File(sourceDir);
if (!source.exists()) throw new RuntimeException("Source does not exist.");
if (!source.canRead()) throw new RuntimeException("Source could not be read.");
File dest = new File(destDir);
if (!dest.exists()) dest.mkdirs();
File[] arrFiles = source.listFiles();
for(int i = 0; i < arrFiles.length; i++)
{
if (arrFiles[i].isFile())
{
BufferedReader reader = new BufferedReader(new FileReader(arrFiles[i]));
BufferedWriter writer = new BufferedWriter(new FileWriter(destDir + "/" + arrFiles[i].getName()));
String line = null;
while((line = reader.readLine()) != null) writer.write(line);
writer.flush();
reader.close();
writer.close();
}
else
{
copyDir(sourceDir + "/" + arrFiles[i].getName(), destDir + "/" + arrFiles[i].getName());
}
}
}
삭제 폴 더
public static void del(String filePath)
{
File file = new File(filePath);
if (file == null || !file.exists()) return;
if (file.isFile())
{
file.delete();
}
else
{
File[] arrFiles = file.listFiles();
if (arrFiles.length > 0)
{
for(int i = 0; i < arrFiles.length; i++)
{
del(arrFiles[i].getAbsolutePath());
}
}
file.delete();
}
}
가 져 오기 폴 더 크기
public static long getFolderSize(String dir)
{
long size = 0;
File file = new File(dir);
if (!file.exists()) throw new RuntimeException("dir does not exist.");
if (file.isFile()) return file.length();
else
{
String[] arrFileName = file.list();
for (int i = 0; i < arrFileName.length; i++)
{
size += getFolderSize(dir + "/" + arrFileName[i]);
}
}
return size;
}
큰 파일 을 여러 개의 작은 파일
public static void splitFile(String filePath, long unit) throws IOException
{
File file = new File(filePath);
if (!file.exists()) throw new RuntimeException("file does not exist.");
long size = file.length();
if (unit >= size) return;
int count = size % unit == 0 ? (int)(size/unit) : (int)(size/unit) + 1;
String newFile = null;
FileOutputStream fos = null;
FileInputStream fis =null;
byte[] buffer = new byte[(int)unit];
fis = new FileInputStream(file);
long startPos = 0;
String countFile = filePath + "_Count";
PrintWriter writer = new PrintWriter(new FileWriter( new File(countFile)));
writer.println(filePath + "\t" + size);
for (int i = 1; i <= count; i++)
{
newFile = filePath + "_" + i;
startPos = (i - 1) * unit;
System.out.println("Creating " + 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));
}
writer.flush();
writer.close();
fis.close();
}
로 나 누 어 여러 개의 작은 파일 을 하나의 큰 파일
public static void linkFiles(String countFile) throws IOException
{
File file = new File(countFile);
if (!file.exists()) throw new RuntimeException("Count file does not exist.");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = reader.readLine();
String newFile = line.split("\t")[0];
long size = Long.parseLong(line.split("\t")[1]);
RandomAccessFile raf = new RandomAccessFile(newFile, "rw");
raf.setLength(size);
FileInputStream fis = null;
byte[] buffer = null;
while((line = reader.readLine()) != null)
{
String[] arrInfo = line.split("\t");
fis = new FileInputStream(new File(arrInfo[0]));
buffer = new byte[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(String command, String argument)
{
Process process = null;
try
{
process = Runtime.getRuntime().exec(command + " " + argument);
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
while((line = br.readLine()) != null)
{
System.out.println(line);
}
}
catch(Exception ex)
{
System.err.println(ex.getMessage());
}
finally
{
if (process != null) process.destroy();
}
}
을 수행 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.