>  기사  >  Java  >  Java에서 IO 스트림을 분류하는 방법

Java에서 IO 스트림을 분류하는 방법

王林
王林앞으로
2019-11-23 18:14:162445검색

Java에서 IO 스트림을 분류하는 방법

1. IO: 업로드 및 다운로드, 쓰기 및 쓰기

스트림: 선입선출 방식으로 흐르는 일련의 데이터 흐름, 파이프라인, 프로그램 중심, 프로그램 및 네트워크 파일 | | 서버 | 어레이.. (추천 관련 강좌: java 비디오 튜토리얼)

분류

1) 흐름 방향에 따라:

입력 스트림

2) 운영 단위:

바이트 스트림 (유니버설 스트림): 모든 콘텐츠를 바이트로 변환할 수 있으며 텍스트, 그림 및 오디오를 전송할 수 있습니다. 문자 스트림: 일반 텍스트 데이터만 조작할 수 있습니다.

3) 기능에 따라:

노드 스트림: 소스를 래핑합니다. 기본 기능 구현: 예 노드 스트림은 성능을 향상시키고 효율성을 향상시킵니다

4) 각 카테고리는 서로 보완적입니다

바이트 스트림

(1) 바이트 입력 스트림: InputStream 이 추상 클래스는 슈퍼 클래스입니다. 바이트 입력 스트림을 나타내는 모든 클래스 중 FileInputStream은 파일 시스템의 파일에서 입력 바이트를 얻습니다.

//字节流输入 InputStream 
//导包	导包快捷键: ctrl+shift+o
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Demo01 {
	public static void main(String[] args) throws IOException {
		//FileInputStream(String name) 
		通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定
		//FileInputStream(File file) 
		通过打开一个到实际文件的连接来创建一个 FileInputStream,
		该文件通过文件系统中的 File 对象 file 指定
		InputStream is=new FileInputStream(new File("D:/test.txt"));//创建D盘符的根目录下的文件
		System.out.println(is);
		//方式1: int read() 读入数据 一个字节一个字节读入
		/*int num=is.read();
		System.out.println((char)num);
		num=is.read();
		System.out.println((char)num);
		System.out.println((char)(is.read()));*/
		//方式2:使用循环,循环读入,可以简化代码,重复代码只写一次,但还是一个字节一个字节的读入
		/*int num=-1;
		while((num=is.read())!=-1){
			System.out.println((char)num);
		}*/
		//方式3:int read(byte[] b) 一个字节数组一个字节数组的读入
		//返回值: 返回读入到字节数组中数据的个数,没有读到返回-1
		byte[] car=new byte[1];
		//int len=is.read(car); 
		int len=-1;
		while((len=is.read(car))!=-1){
			System.out.println(new String(car,0,len));
		}
		//关闭
		is.close();
	}
}

(2) 바이트 출력 스트림: OutputStream 이 추상 클래스는 출력 바이트 스트림을 나타내는 모든 클래스의 슈퍼 클래스입니다. 파일 출력 스트림은 File

//字节输出流 OutputStream
//导包	导包快捷键: ctrl+shift+o
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Demo02 {
	public static void main(String[] args) {
		//FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流
		//FileOutputStream(String name,boolean append)  
		创建一个向具有指定 name 的文件中写入数据的输出文件流
		//FileOutputStream(File file,boolean append) 
		创建一个向指定 File 对象表示的文件中写入数据的文件输出流
		//boolean append	返回值:true追加,false不追加(默认false)
		OutputStream os=null;
		//try...catch(){}	捕捉异常,处理异常
		try {
			//1.选择流
			os=new FileOutputStream("D:/hhh.txt",hhtrue); 
			//文件不存在,系统会自动帮我们创建,但文件夹不会
			//2.准备数据
			String str="要好好学习,天天向上..."; 
			byte[] c和=str.getBytes();
			//3.写出 void write(byte[] b)  
			os.write(ch);
			//4.刷出
			os.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			//5.关闭
			try {//预防空指针异常
				if(os!=null){
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Character stream

의 출력 스트림에 데이터를 쓰는 데 사용됩니다. 일반 텍스트에서만 작동할 수 있습니다

1) 노드 스트림:

(1) 문자 입력 스트림: Reader는 추상 클래스입니다. FileReader는 문자 파일을 읽기 위한 편리한 클래스

//字符输入流 Reader
//导包	导包快捷键: ctrl+shift+o
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Demo03 {
	public static void main(String[] args) {
		//FileReader(String fileName) 
		Reader rd=null;
		try {
			//1.选择流
			rd=new FileReader("D:/hehe.txt");//创建D盘符的根目录下的文件
			//2.读入
			//方法1:int read() 读取单个字符。 
			/*System.out.println((char)rd.read());
			System.out.println((char)rd.read());
			System.out.println((char)rd.read());
			System.out.println((char)rd.read());*/
			int len=-1;  //存储读到的数据  如果为-1,证明已达到末尾
			//方法2:
			/*while(-1!=(len=rd.read())){
				System.out.println((char)len);
			}*/
			//方法3:int read(char[] cbuf)  将字符读入数组。
			char[] car=new char[1024];
			while((len=rd.read(car))!=-1){
				System.out.println(new String(car,0,len));
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			if(rd!=null){
				try {
					//关闭功能
					rd.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
}

를 사용합니다. (2) 문자 출력 스트림: Writer는 문자 스트림을 쓰기 위한 추상 클래스입니다. FileWriter는 문자 파일 쓰기에 편리한 클래스입니다.

//字符输出流:Writer
//导包	导包快捷键: ctrl+shift+o
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
public class CharDemo02 {
	public static void main(String[] args) {
		//FileWriter(File file) 		//默认不追加
		//FileWriter(File file, boolean append)  	
		//FileWriter(String file)  
		//FileWriter(String file, boolean append)  
		Writer rt=null;
		try {
			//1.选择流
			rt=new FileWriter("D:/houhou.txt",true);
			//2.写出
			/*	void write(char[] cbuf)  写入字符数组 
				void write(char[] cbuf, int off, int len) 写入字符数组的某一部分
				void write(int c) 写入单个字符
				void write(String str)  写入字符串 
				void write(String str, int off, int len) 写入字符串的某一部分 
			*/
			rt.write(97);
			rt.write("\r\n");  		//换行
			rt.write("你真好看!!!!");
			rt.write("\r\n");
			rt.write("你真好看!!!!",2,2);
			rt.write("\r\n");
			char[] ch={'a','b','c','d','e'};
			rt.write(ch);
			rt.write("\r\n");
			rt.write(ch,2,3);
			//3.刷出
			rt.flush();		
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			//4.关闭
			if(null!=rt){
				try {
					rt.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

기능적 흐름

버퍼링된 스트림: 향상된 기능, 향상된 성능, 더 빠른 읽기 및 쓰기 효율성

1) 바이트 스트림:

BufferedInputStream 바이트 입력 스트림 버퍼링 스트림

BufferedOutputStream 바이트 출력 스트림 버퍼링 스트림

새로운 방법은 없습니다. 다형성 사용

//导包
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class BufferedInputStream01 {
	public static void main(String[] args) throws IOException {
		//1.选择流
		//BufferedInputStream(InputStream in) 
		InputStream is=new BufferedInputStream(new FileInputStream("D:/hehe.txt"));
		OutputStream os=new BufferedOutputStream(new FileOutputStream("E:/hengheng.txt") );
		//2.读写
		byte[] car=new byte[1024];
		int len=-1;
		while((len=is.read(car))!=-1){
			os.write(car,0,len);
		}
		//3.刷出
		os.flush();
		//4.关闭
		os.close();
		is.close();
	}
}

2) 문자 스트림:

BufferedReader 문자 입력 스트림 버퍼 스트림

새로운 메소드: String readLine() 텍스트 라인 읽기

BufferedWriter 문자 출력 스트림 버퍼 스트림

새로운 메소드: void newLine() 쓰기 줄 구분자

//导包
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedReader02 {
	public static void main(String[] args) throws IOException {
		//1.选择流  导包快捷键: ctrl+shift+o
		BufferedReader br=new BufferedReader(new FileReader("D:/hehe.txt"));
		BufferedWriter bw=new BufferedWriter(new FileWriter("D:/ccc.txt"));
		//2.读写
		String msg=null;
		while((msg=br.readLine())!=null){
			bw.write(msg);
			bw.newLine();
		}
		//3.刷出
		bw.flush();
		//4.关闭
		bw.close();
		br.close();
	}
}

데이터 스트림(바이트 노드 스트림)

데이터 스트림(바이트 노드 스트림):

기본 데이터 유형 + 바이트 스트림 함수 스트림의 일종인 문자열 유형 데이터 읽기 및 쓰기

DataInputStream 신규 메서드: readXxx()

DataOutputStream 새 메서드: writeXxx()

다형성이 불가능한 새 메서드가 있습니다. 먼저 쓴 다음 write

발생할 수 있는 예외: EOFException 파일이 있고 내용을 읽습니다. 아니요, 무엇을 읽어야 할 것은 작성된 소스 파일입니다

//导包
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Data01 {
	public static void main(String[] args) throws IOException {
		//调用方法
		write("D:/data.txt");
		read("D:/data1.txt");
	}
	//读入
	public static void read(String path) throws IOException{
		//1.输入流 数据类型+数据
		DataInputStream in=new DataInputStream(new  BufferedInputStream(new FileInputStream(path)));
		//2.读入
		int i=in.readInt();
		boolean b=in.readBoolean();
		String s=in.readUTF();
		System.out.println(i+"-->"+b+"-->"+s);
		//3.关闭
		in.close();
	}
	//写出
	public static void write(String path) throws IOException{
		//1.输出流
		DataOutputStream out=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path)));
		//2.准备数据
		int i=101;
		boolean f=false;
		String s="哈哈";
		//3.写出  写出和读入的顺序要保持一致
		out.writeInt(i);
		out.writeBoolean(f);
		out.writeUTF(s);
		//4.刷出
		out.flush();
		//5.关闭
		out.close();
	}
}

객체 스트림

객체 저장 데이터 유형 + 데이터

바이트 기능 스트림: | 읽기 및 쓰기 객체 유형 데이터를 전송하려는 경우 객체 스트림을 사용하여

직렬화: 객체 유형 데이터를 저장 가능한 | 전송 가능한 상태로 변환하는 프로세스

ObjectInputStream() 역직렬화된 입력 스트림 새 메서드: readObject()

ObjectOutputStream() 직렬화된 출력 스트림 새 메서드: writeObject()

참고:

1 ) 먼저 직렬화한 다음 역직렬화

2) 직렬화와 역직렬화는 동일한 순서로 읽고 씁니다

3) 모든 클래스를 직렬화할 수 있는 것은 아닙니다. java.io .직렬화 가능한 빈 인터페이스

4) 모든 속성을 직렬화할 필요는 없습니다 임시

5) 정적 콘텐츠는 직렬화되지 않습니다.

6) 상위 클래스가 직렬화 가능 인터페이스를 구현하는 경우 하위 클래스의 모든 콘텐츠를 직렬화할 수 있습니다.

하위 클래스가 직렬화 가능 인터페이스를 구현하지만 상위 클래스는 그렇지 않은 경우. 하위 클래스에 고유한 콘텐츠만 직렬화합니다

//导包
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;
public class ObjectDemo02 {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		write("D:/object.txt");
		read("D:/object.txt");
	}
	//反序列化输入
	public static void read(String path) throws IOException, ClassNotFoundException{
		//1.输入流
		ObjectInputStream is=new ObjectInputStream(new BufferedInputStream(new FileInputStream(path)));
		//2.读入
		Object p= is.readObject();
		int[] arr= (int[]) is.readObject();
		if(p instanceof Person){
			Person person=(Person)p;
			System.out.println(person.getName());
		}
		System.out.println(p);
		System.out.println(Arrays.toString(arr));
		//3,关闭
		is.close();
	}
	//序列化输出
	public static void write(String path) throws IOException{
		//1.输出对象信息
		ObjectOutputStream os=new ObjectOutputStream(new BufferedOutputStream(new 
		FileOutputStream(path)));
		//2.准备数据
		Person p=new Person("aaa",18);
		int[] arr={1,2,3,4};
		//3.输出
		os.writeObject(p);
		os.writeObject(arr);
		//4.刷出
		os.flush();
		//5.关闭
		os.close();
	}
}
//接口
class Person implements Serializable{
	private  String name;
	private static int age;
	public Person() {
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

2. 파일 클래스

파일 클래스: 파일 및 디렉터리 경로 이름의 추상 표현

제공 기능: 파일 외부에서 작동하는 기능이 있지만 파일 내부의 컨텐츠는 작동할 수 없습니다. file

실제 경로|file을 정의할 수 있고, 없으면 정의할 수도 있으므로 추상 표현식

생성자: File(File parent, String child) 상위 추상 경로명 및 하위 경로명 string에 따라 생성 새 File 인스턴스

File(String pathname) 주어진 경로명 문자열을 추상 경로명으로 변환하여 새 File 인스턴스를 생성합니다.

File(String parent, String child) 상위 경로명 문자열과 하위 경로명을 기반으로 새 File 인스턴스를 생성합니다. string

이 기사는 java 입문 튜토리얼 칼럼에서 가져온 것입니다. 배우신 것을 환영합니다!

위 내용은 Java에서 IO 스트림을 분류하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제