자바 의 IO 시스템 을 철저히 이해 하 다.

16779 단어 자바
1.Input 과 Output
1.stream 은 데 이 터 를 생산 할 수 있 는 모든 데이터 소스 또는 데 이 터 를 받 을 수 있 는 모든 수신 원 을 대표 합 니 다.자바 의 IO 에 서 는 모든 stream(Input 과 Out stream 포함)이 두 가지 유형 을 포함 합 니 다.
1.1 바 이 트 를 중심 으로 하 는 stream 은 바 이 트 를 중심 으로 하 는 stream 으로 바이트 단위 로 stream 에서 정 보 를 읽 거나 stream 에 쓰 는 것 을 나타 낸다.바이트 를 중심 으로 하 는 stream 은 다음 과 같은 몇 가지 유형 을 포함한다.
-input stream:1)ByteArray InputStream:메모리 의 버퍼 하 나 를 InputStream 으로 사용 2)StringBufferInputStream:하나의 String 대상 을 InputStream 3)FileInputStream:하나의 파일 을 InputStream 으로 하여 파일 에 대한 읽 기 동작 을 실현 4)PipedInputStream:pipe 의 개념 을 실현 하고,주로 스 레 드 에서 5)Sequence InputStream 사용:여러 개의 InputStream 을 하나의 InputStream 으로 합 칩 니 다.
-Out stream 1)ByteArray OutputStream:메모리 에 정 보 를 저장 하 는 버퍼 중 2)FileOutputStream:파일 에 정 보 를 저장 하 는 3)Piped OutputStream:pipe 의 개념 을 실현 하고 주로 스 레 드 에서 4)Sequence OutputStream:여러 개의 OutStream 을 하나의 OutStream 으로 통합 합 니 다.
1.2 유 니 코드 문 자 를 중심 으로 하 는 stream 은 유 니 코드 문 자 를 중심 으로 하 는 stream 으로 유 니 코드 문 자 를 단위 로 stream 에서 정 보 를 읽 거나 stream 에 쓰 는 것 을 나타 낸다.유 니 코드 문 자 를 중심 으로 하 는 stream 은 다음 과 같은 몇 가지 유형 을 포함 합 니 다.
-Input Stream 1)CharArrayReader:ByteArray InputStream 대응 2)StringReader:StringBufferInputStream 대응 3)FileReader:FileInputStream 대응 4)PipedReader:PipedInputStream 대응
-Out Stream 1)CharArray Write:ByteArray OutputStream 과 대응 하 는 2)StringWrite:이에 대응 하지 않 는 바이트 지향 stream 3)FileWrite:FileOutputStream 과 대응 하 는 4)PipedWrite:PipedOutputStream 과 대응 하 는 문 자 를 지향 하 는 stream 은 기본적으로 이에 대응 하 는 바이트 지향 적 stream 에 대응 합 니 다.두 대응 류 가 실현 하 는 기능 이 같 고 글 자 는 조종 할 때의 가이드 가 다르다.예 를 들 어 CharArray Reader:ByteArray InputStream 과 같은 역할 은 메모리 에 있 는 버퍼 를 InputStream 으로 사용 합 니 다.다른 것 은 전 자 는 메모리 에서 한 바이트 의 정 보 를 읽 을 때마다 후 자 는 메모리 에서 한 문 자 를 읽 습 니 다.
1.3 두 가지 보이 지 않 는 스 트림 간 의 변환 InputStreamReader 와 OutputStreamReader:바이트 지향 스 트림 을 문자 지향 스 트림 으로 변환 합 니 다.
2.stream 속성 추가
2.1"stream 에 속성 추가"의 역할 은 위 에 선 용 된 자바 에서 IO 를 조작 하 는 API 를 활용 하면 우리 가 완성 하고 자 하 는 모든 조작 을 완성 할 수 있 습 니 다.그러나 FilterInputStream 과 FilterOutStream 의 하위 클래스 를 통 해 stream 에 속성 을 추가 할 수 있 습 니 다.다음은 하나의 예 로 이런 기능 의 작용 을 설명 한다.만약 우리 가 한 파일 에 데 이 터 를 쓰 려 고 한다 면,우 리 는 이렇게 조종 할 수 있다.FileOutStream fs=new FileOutStream("test.txt");그리고 fs 대상 을 통 해 write()함 수 를 호출 하여 test.txt 파일 에 데 이 터 를 쓸 수 있 습 니 다.그러나 만약 에 우리 가'먼저 파일 에 쓸 데 이 터 를 메모리 에 저장 한 다음 에 캐 시 에 있 는 데 이 터 를 파일 에 쓴다'는 기능 을 실현 하고 싶다 면 위의 API 는 우리 의 수 요 를 만족 시 킬 수 있 는 것 이 하나 도 없다.그러나 FilterInputStream 과 FilterOutStream 의 하위 클래스 를 통 해 FileOutStream 에 필요 한 기능 을 추가 합 니 다.
2.2 FilterInputStream 의 다양한 유형
2.2.1 바 이 트 를 중심 으로 하 는 InputStream 1)DataInputStream:stream 에서 기본 형식(int,char 등)데 이 터 를 읽 습 니 다.2)BufferedInputStream:버퍼 3 사용)LineNumberInputStream:input stream 의 줄 수 를 기록 한 다음 getLineNumber()와 setLineNumber(int)4 를 호출 할 수 있 습 니 다.PushbackInputStream:거의 사용 되 지 않 습 니 다.일반적으로 컴 파일 러 개발 에 사 용 됩 니 다.
2.2.2 문 자 를 중심 으로 하 는 InputStream 1)은 DataInputStream 과 대응 하 는 클래스 가 없습니다.readLine()을 사용 할 때 BufferedReader 를 사용 하지 않 는 한 DataInputStream 2)BufferedReader:BufferedInputStream 과 대응 3)LineNumberReader:LineNumberInputStream 과 대응 4)PushBackReader:PushbackInputStream 과 대응
2.3 FilterOutStream 의 다양한 유형
2.2.3 바 이 트 를 중심 으로 하 는 Output Stream 1)DataIOutStream:stream 에 기본 형식(int,char 등)데 이 터 를 출력 합 니 다.2)BufferedOutStream:버퍼 사용 3)PrintStream:포맷 출력 생 성
2.2.4 문 자 를 중심 으로 하 는 Output Stream 1)Buffered Write:대응 하 는 2)PrintWrite:대응 하 는
3.RandomAccessFile 1)RandomAccessFile 대상 을 통 해 파일 에 대한 읽 기와 쓰기 조작 을 완성 할 수 있 습 니 다.2)대상 이 생 겼 을 때 열 파일 의 성질 을 가리 킬 수 있 습 니 다.r,읽 기만 합 니 다.w,쓰기 만 한다.rw 읽 기 및 쓰기 3)파일 에서 지정 한 위치 로 바로 이동 할 수 있 습 니 다.
4.I/O 응용의 한 예
 1     public static void main(String[] args) throws IOException {

 2         // 1.              

 3         BufferedReader in = new BufferedReader(new FileReader(

 4                 "F:\
epalon\\TestIO.java")); 5 String s, s2 = new String(); 6 while ((s = in.readLine()) != null) 7 s2 += s + "
"; 8 in.close(); 9 10 // 1b. 11 BufferedReader stdin = new BufferedReader(new InputStreamReader( 12 System.in)); 13 System.out.println("Enter a line:"); 14 System.out.println(stdin.readLine()); 15 16 // 2. String 17 StringReader in2 = new StringReader(s2); 18 int c; 19 while ((c = in2.read()) != -1) 20 System.out.println((char) c); 21 in2.close(); 22 23 // 3. 24 try { 25 DataInputStream in3 = new DataInputStream(new ByteArrayInputStream( 26 s2.getBytes())); 27 while (true) 28 System.out.println((char) in3.readByte()); 29 } catch (EOFException e) { 30 System.out.println("End of stream"); 31 } 32 33 // 4. 34 try { 35 BufferedReader in4 = new BufferedReader(new StringReader(s2)); 36 PrintWriter out1 = new PrintWriter(new BufferedWriter( 37 new FileWriter("F:\
epalon\\ TestIO.out"))); 38 int lineCount = 1; 39 while ((s = in4.readLine()) != null) 40 out1.println(lineCount++ + ":" + s); 41 out1.close(); 42 in4.close(); 43 } catch (EOFException ex) { 44 System.out.println("End of stream"); 45 } 46 47 // 5. 48 try { 49 DataOutputStream out2 = new DataOutputStream( 50 new BufferedOutputStream(new FileOutputStream( 51 "F:\
epalon\\ Data.txt"))); 52 out2.writeDouble(3.1415926); 53 out2.writeChars("
Thas was pi:writeChars
"); 54 out2.writeBytes("Thas was pi:writeByte
"); 55 out2.close(); 56 DataInputStream in5 = new DataInputStream(new BufferedInputStream( 57 new FileInputStream("F:\
epalon\\ Data.txt"))); 58 BufferedReader in5br = new BufferedReader( 59 new InputStreamReader(in5)); 60 System.out.println(in5.readDouble()); 61 System.out.println(in5br.readLine()); 62 System.out.println(in5br.readLine()); 63 } 64 65 catch (EOFException e) { 66 System.out.println("End of stream"); 67 } 68 69 // 6. RandomAccessFile 70 RandomAccessFile rf = new RandomAccessFile("F:\
epalon\\ rtest.dat", 71 "rw"); 72 for (int i = 0; i < 10; i++) 73 rf.writeDouble(i * 1.414); 74 rf.close(); 75 76 rf = new RandomAccessFile("F:\
epalon\\ rtest.dat", "r"); 77 for (int i = 0; i < 10; i++) 78 System.out.println("Value " + i + ":" + rf.readDouble()); 79 rf.close(); 80 81 rf = new RandomAccessFile("F:\
epalon\\ rtest.dat", "rw"); 82 rf.seek(5 * 8); 83 rf.writeDouble(47.0001); 84 rf.close(); 85 86 rf = new RandomAccessFile("F:\
epalon\\ rtest.dat", "r"); 87 for (int i = 0; i < 10; i++) 88 System.out.println("Value " + i + ":" + rf.readDouble()); 89 rf.close(); 90 }

코드 에 대한 설명(구역 단위):
1 구역 에서 파일 을 읽 을 때 먼저 파일 내용 을 캐 시 에 읽 고 in.readLine()을 호출 할 때 캐 시 에서 문자 로 데 이 터 를 읽 습 니 다(이하'캐 시 바이트 읽 기 방식'이 라 고 약칭).
1b 구역 에 서 는 표준 IO(키보드)에서 캐 시 바이트 읽 기 방식 으로 데 이 터 를 읽 으 려 면 표준 IO(System.in)를 문자 지향 stream 으로 변환 한 다음 Buffered Reader 패 키 징 을 해 야 합 니 다.
2 구역 에 서 는 String 대상 에서 문자 로 데 이 터 를 읽 으 려 면 StringReader 형식의 stream 을 만들어 야 합 니 다.
4 구역 에서 String 대상 s2 에 대해 데 이 터 를 읽 을 때 대상 의 데 이 터 를 캐 시 에 저장 한 다음 버퍼 에서 읽 습 니 다.TestIO.out 파일 을 조작 할 때 포맷 된 정 보 를 캐 시 에 출력 한 다음 캐 시 에 있 는 정 보 를 파일 에 출력 합 니 다.
5 구역 에서 Data.txt 파일 을 출력 할 때 기본 형식의 데이터 출력 하우스 캐 시 에서 캐 시 에 있 는 데 이 터 를 파일 에 출력 합 니 다.파일 을 읽 기 조작 할 때 먼저 파일 의 데 이 터 를 캐 시 에 읽 은 다음 캐 시 에서 기본 형식 으로 읽 습 니 다.in5.readDouble()줄 을 유의 하 세 요.첫 번 째 writeDouble()에 쓰기 때문에 정확하게 표시 하기 위해 서 입 니 다.기본 형식 으로 읽 어야 합 니 다.
6 구역 은 RandomAccessFile 클래스 를 통 해 파일 을 조작 합 니 다.

좋은 웹페이지 즐겨찾기