JAVA IO API 사용 설명
흐름 은 추상 적 인 개념 으로 입 출력 장치 에 대한 추상 이다.자바 프로그램 에서 데이터 에 대한 입 출력 작업 은 모두'흐름'방식 으로 진행 되 고 장 치 는 파일,네트워크,메모리 등 이 될 수 있다.흐름 은 방향 성 을 가지 고 입력 흐름 인지 출력 흐름 인지 에 대해 상대 적 인 개념 이다.보통 프로그램(작은 말 형 이 말 하 는 기계)을 참고 로 데이터 의 흐름 이 프로그램 에서 장치 까지 라면 우 리 는 수출 흐름 이 되 고 반대로 우 리 는 입력 흐름 이 라 고 부 르 며 흐름 을'수류 관'(많은 자료 가 이렇게 말 하 는 것)이 라 고 상상 할 수 있 으 며 자 연 스 럽 게 방향 개념 이 나 타 났 다.
흐름 은 I/O 장치 내부 의 구체 적 인 조작 을 숨 겼 다.모든 InputStream 과 Reader 의 파생 류 는 하나의 기본 적 인 것 이 있 습 니 다.계 승 된 것 은 하나의 또는 byte 배열 의 read()방법 을 읽 을 수 있 습 니 다.
자바 는 바이트 흐름(Stream 끝)과 문자 흐름(Reader,Write 끝)으로 나 뉘 고 입력 흐름(InputStream,Reader)과 출력 흐름(OutputStream,Write)으로 나 뉘 며 입력 출력 은 메모리 에 비해 나 뉜 다.문 자 를 읽 을 때 텍스트 파일,XML 등 문자 흐름 을 사용 합 니 다.기다리다바 이 너 리 파일 을 읽 을 때 RAR,EXE 등 텍스트 이외 의 파일(그림)이 아 닌 바이트 흐름 을 사용 합 니 다.버 프 레 드 의 시작 흐름 은 읽 기와 쓰기 의 효율 을 높이 기 위해 버퍼 만 추가 되 었 다.문자 흐름 은 직접 출력 할 수 없습니다.바이트 흐름 으로 변환 해 야 출력 할 수 있 습 니 다.(이것 은 확실히 방금 알 았 습 니 다)!
자바 2 SDK 에는 세 가지 기본 유형의 노드 가 있 습 니 다.파일(file),메모리(memory),파이프(pipe)입 니 다.
다음은 정 리 교재 에 있 는 IO 장절 의 그 고전 사진 을 살 펴 보 자.
InputStream/OutputStream 에서 계승 하 는 흐름 은 모두 프로그램 에 데 이 터 를 입력/출력 하 는 데 사용 되 고 데이터 의 단 위 는 바이트(byte=8bit)입 니 다.그림 과 같이 짙 은 색 은 노드 흐름 이 고 옅 은 색 은 처리 흐름 입 니 다.
Reader/Writer 에서 계승 하 는 흐름 은 모두 프로그램 에 데 이 터 를 입력/출력 하 는 데 사용 되 고 데이터 의 단 위 는 모두 문자(2byte=16bit)입 니 다.그림 과 같이 짙 은 색 은 노드 흐름 이 고 옅 은 색 은 처리 흐름 입 니 다.
용법 분석
자바 IO 의 일반 사용 원칙(부분 은 바 이 두 라 이브 러 리 에서):
(1)데이터 원본(행방)에 따라 분류:
파일:FileInputStream,FileOutputStream,FileReader,FileWriter
byte[]:ByteArray InputStream,ByteArray OutputStream 입 니 다.
Char[]:CharArray Reader,CharArray Writer 입 니 다.
String:StringBufferInputStream,StringReader,StringWriter 입 니 다.
네트워크 데이터 흐름:InputStream,OutputStream,Reader,Writer
(2)출력 을 포맷 할 지 여부 에 따라:
출력 포맷 하기:PrintStream,PrintWriter
(3)버퍼 링 할 지 여 부 를 누 르 십시오.
버퍼 링:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter.
(4)데이터 형식 으로 나 누 기:
바 이 너 리 형식(일반 텍스트 가 확실 하지 않 으 면):InputStream,OutputStream 및 모든 스 트림 이 끝 난 하위 클래스
순수한 텍스트 형식(순수한 영어 와 한자 또는 기타 인 코딩 방식 포함);Reader,Writer 및 모든 Reader,Writer 가 있 는 하위 클래스
(5)입 출력 에 따라:
입력:Reader,InputStream 형식의 하위 클래스;출력:Writer,Output Stream 형식의 하위 클래스
(6)특수 수요:
Stream 에서 Reader,Writer 로 의 전환 클래스:InputStreamReader,OutputStreamWriter
대상 입 출력:ObjectInputStream,ObjectOutputStream
프로 세 스 간 통신:PipeInputStream,PipeOutputStream,PipeReader,PipeWriter
병합 입력:SequenceInputStream
더 특별한 필요:PushbackInputStream,PushbackReader,LineNumberInputStream,LineNumberReader
(7)어떤 종류 와 그 구조 프로 세 스 를 사용 할 것 인 지 를 결정 하 는 일반적인 준칙 은 다음 과 같다(특수 수 요 를 고려 하지 않 음).
가장 원시 적 인 데이터 형식 이 무엇 인지 고려 하 십시오.텍스트 입 니까?입 출력 입 니까?스 트림 변환 이 필요 합 니까:InputStreamReader,OutputStreamWriter?데이터 원본(행방)이 무엇 입 니까:파일?메모리네트워크버퍼 링 할 지 여부:bufferedReader(특별 설명:readLine()이 정의 되 어 있 는 지,read,write 보다 더 특별한 입력 이나 출력 방법 이 있 는 지 주의해 야 합 니 다)출력 을 포맷 할 지 여부:print.
실례
아니면 겨울방학 때 쓴 거 예요?권 은 복습 을 해 야 돼 요.코드 를 접 는 플러그 인 을 찾 을 수 없어 요.먼저 보 세 요.
1.System.in
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
* System.in InputStream static final , ,
* ASCII ( ), ASCII ( )。
*/
public class TestSystemIn {
public static void main(String[] args) {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);// readline
String s = null;
try {
s = br.readLine();
while(s!=null) {
if(s.equalsIgnoreCase("exit")) {
break;
}
System.out.println(s.toUpperCase());
s = br.readLine();
}
br.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
2.buffer
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestBuffer {
public static void main(String[] args) {
try {
//
BufferedWriter bw = new BufferedWriter(new FileWriter("d:/java.txt"));
BufferedReader br = new BufferedReader(new FileReader("d:/java.txt"));
String s = null;
for(int i=1; i<100; i++) {
s = String.valueOf(Math.random());
bw.write(s);
bw.newLine();//
}
// ,br
bw.flush();
while((s=br.readLine())!=null) {
System.out.println(s);
}
bw.close();
br.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
3.FileInputStream
import java.io.*;
public class TestFileInputStream {
public static void main(String[] args) {
FileInputStream in = null;
try {
in = new FileInputStream("e:/1.txt");
}catch(FileNotFoundException e) {
System.out.println(" ");
System.exit(-1);
}
//
int tag = 0;
try {
long num = 0;
while((tag = in.read())!=-1) {
//read , , reader
System.out.print((char)tag);
num++;
}
in.close();
System.out.println();
System.out.println(" " + num + " ");
}catch(IOException e1) {//read close IOException
System.out.println(" ");
System.exit(-1);
}
}
}
4.FileOutputStream 복사 기능 구현
import java.io.*;
/*
*
*/
public class TestFileOutputStream {
public static void main(String[] args) {
int b = 0;
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("d:/java.txt");
//
out = new FileOutputStream("d:/my_java.txt");
while((b=in.read())!=-1) {
out.write(b);
}
in.close();
out.close();
}catch(FileNotFoundException e) {
System.out.println(" ");
System.exit(-1);
}catch(IOException e1) {
System.out.println(" ");
System.exit(-1);
}
System.out.println(" ");
}
}
5.ObjectOutputStream 과 Serializable
import java.io.*;
/*
* transient( ), ,
* , int ,
* 0
*/
public class TestObjectIO {
public static void main(String[] args) throws Exception {
T t = new T();
t.k = 8;
FileOutputStream fos = new FileOutputStream("d:/1.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(t);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream("d:/1.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
T tRead = (T)ois.readObject();
System.out.println(tRead.i + " " + tRead.j + " " + tRead.k);
}
}
class T implements Serializable {
int i = 10;
int j = 9;
double d = 2.3;
int k = 15;
}
6.인 코딩 방식 전환
import java.io.*;
/*
* windows GBK
* ,
*/
public class TestTransForm {
public static void main(String[] args) {
try {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d:/java.txt"));
osw.write(" 123");// , ,
System.out.println(" :" + osw.getEncoding());//ISO8859_1 , latin-1, , (ISO) Unicode
osw.close();
osw = new OutputStreamWriter(new FileOutputStream("d:/java.txt",true),"ISO8859_1");//true
osw.write(" ");
System.out.println(" :" + osw.getEncoding());
osw.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
7.출력 방향 변경
import java.io.*;
/*
* Print , ,
* PrintWriter PrintStream , ,
* flush , , jsp ,
* 。
*/
public class TestPrintStream {
public static void main(String[] args) {
PrintStream ps = null;
try {
FileOutputStream fos = new FileOutputStream("d:/java.txt");
ps = new PrintStream(fos);
}catch (IOException e) {
e.printStackTrace();
}
if(ps!=null) {
System.setOut(ps);//
}
int ln = 0;
for(char c=0; c<65535; c++) {
System.out.print(c + " ");
if(ln++>100) {
System.out.println();
ln = 0;
}
}
}
}
8.DataStream
import java.io.*;
public class TestDataStream {
public static void main(String[] args) {
// , OutputStream,
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
try {//
dos.writeDouble(Math.random());
dos.writeBoolean(true);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
System.out.println(bais.available());//
DataInputStream dis = new DataInputStream(bais);
//// ( ), , double
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
dos.close();
dis.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
사소한 문제왜 Writer/Reader 는 자체 Stream 을 계승 하지 않 습 니까?문자 도 결국 바 이 너 리 로 바 꿔 야 지.Writer/Readre 는 OutputStream/InputStream 을 계승 합 니 다.이러한 계승 차원 이 더 좋 지 않 습 니 다.왜 단독으로 하 나 를 만들어 야 합 니까?그리고 Stream 도 문자열 의 읽 기와 쓰 기 를 실현 할 수 있 는 하위 클래스 가 있 습 니 다.대신 대답:단일 직책.너무 억지 야.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.