자바 의 IO 시스템 을 철저히 이해 하 다.
16779 단어 자바
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 클래스 를 통 해 파일 을 조작 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.