学习心得------java学习笔记IO流(1)之字节流

参考自https://blog.csdn.net/qq_36962144/article/details/79815457
(初次写博客,如有不对的地方请指出,我一定吸取教训)

java之输入输出流(IO)之的原理

IO流是用来处理设备之间的数据传输,是以流的方式来处理。可以想象成数据就是管道里的水,而要让水从一个地方流到另一个地方,就需要用到水管了、也就是这里的IO
JDK中相关的包和类都集中在java.io包中。

流的分类

java中按单位可分为 字节流(Byte Stream)字符流(Char Stream)
流按方向分为 输入流(InputStream / Reader)输出流(OutputStream / Writer)
输入输出流示意图
(注意:判断输入流还是输出流以程序为参照物

字节流

部分字节流对应图
各种输入类的基本描述

下面是各个方法的基本代码

文件字节流(FileInputStream 和 FileInputStream)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileByteCopy {
	public static void main(String[] args) {
		
		try {
			FileInputStream fis = new FileInputStream("src\\练习\\IO\\FileByteCopy.java");
			//FileInputStream fis = new FileInputStream("String name , boolean append");   //append默认false(覆盖)
			FileOutputStream fos = new FileOutputStream("c:\\FileCopy.txt");
			System.out.println("文件大小:"+fis.available());
			
			int b = 0;
			//1、一个字节一个字节地读、写,直到文件结尾-1,效率低
			while((b=fis.read())!=-1) {
				fos.write(b);
			}
			
//			//2、一次读取一个数组的数据,效率高
//			byte[] ba = new byte[1024];
//			while((b=fis.read(ba))!=-1) {
//				fos.write(ba , 0 ,ba.length-1);
//			}
			
			fos.close();
			fis.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.out.println("文件找不到");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

基本数据流(DataInputStream 和 DataInputStream)

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 演示了通过DataOutputStream向文件流写8种基本数据类型和String类型的数据
 * 然后通过DataInputStream从文件读取前面写入的数据
 * @author Administrator
 *
 */
public class DataStreamTest {
	public static void main(String[] args) {
		try {
			//将8种基本类型写入文件
			FileOutputStream fos = new FileOutputStream("c:\\copy.txt");
			DataOutputStream dos = new DataOutputStream(fos);
			dos.writeByte((byte)123);
			dos.writeShort((short)12345);
			dos.writeInt(1234566789);
			dos.writeLong(65415641314L);
			dos.writeFloat(2.984f);
			dos.writeDouble(3.1415926);
			dos.writeChar('W');
			dos.writeBoolean(true);
			dos.writeUTF("我的博客");
			
			//读取
			FileInputStream fis = new FileInputStream("c:\\copy.txt");
			DataInputStream dis = new DataInputStream(fis);
			System.out.println(dis.readByte());
			System.out.println(dis.readShort());
			System.out.println(dis.readInt());
			System.out.println(dis.readLong());
			System.out.println(dis.readFloat());
			System.out.println(dis.readDouble());
			System.out.println(dis.readChar());
			System.out.println(dis.readBoolean());
			System.out.println(dis.readUTF());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

对象流(ObjectInputStream 和 ObjectOutputStream)
Student类必须实现Serializable接口,并重写toString()方法)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Student implements Serializable{
	private static final long serialVersionUID = 1L;
	transient int id;
	static int age;
	private String name;
	String dept;
	public Student(int id, String name,int age,String dept) {
		this.id = id;
		this.name = name;
		this.age = age;
		this.dept = dept;
	}
	@Override
	public String toString() {
		return "Student [id = "+id+" ,name=" + name + ", dept=" + dept + " ,age = "+age+"]";
	}
	
	
}
public class ObjectStream {
	//存储对象
	public void saveObj() {
		Student stu = new Student(2017564,"猪鸭",18,"CSD");
		try {
			FileOutputStream fos = new FileOutputStream("c:\\stu.ser");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(stu);
			oos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//读取对象
	public void readObj() {
		Student stu;
		try {
			FileInputStream fis = new FileInputStream("c:\\stu.ser");
			ObjectInputStream ois = new ObjectInputStream(fis);
			stu = (Student)ois.readObject();
			System.out.println(stu);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		ObjectStream os = new ObjectStream();
		os.saveObj();
		os.readObj();
	}
}

管道流(PipedInputStream 和 PipedOutputStream)
//管道流一般实现线程之间的通信(上图忘记加了,请谅解)

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * 本程序定义了发送线程Sender、接收线程Receive,然后Sender通过建立好的管道向
 * Receive发送一个String
 * @author Administrator
 *
 */
class Sender implements Runnable{
	private PipedOutputStream out = null;
	
	public Sender(PipedOutputStream out) {
		this.out = out;
	}
	
	@Override
	public void run() {
		String str = "天王盖地虎";
		try {
			out.write(str.getBytes());
			out.close();
			System.out.println("发送线程已经发送:"+str+"到管道!");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

class Receive implements Runnable{
	private PipedInputStream in = new PipedInputStream();

	public PipedInputStream getInputStream() {
		return in;
	}
	
	@Override
	public void run() {
		byte[] b = new byte[1024];
		try {
			int num = in.read(b);
			in.close();
			if(-1 == num) {
				System.out.println("接收线程:什么都没收到");
			}else {
				System.out.println("接收线程收到:"+new String(b,0,num)+"!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

public class PipeStreamDemo {
	public static void main(String[] args) throws IOException {
		PipedOutputStream out = new PipedOutputStream();
		PipedInputStream in = new PipedInputStream();
		
		Sender sender = new Sender(out);
		Receive receive = new Receive();
		
		in = receive.getInputStream();
		out.connect(in);
		
		new Thread(sender).start();;
		new Thread(receive).start();;
	}
}
发布了9 篇原创文章 · 获赞 2 · 访问量 73

猜你喜欢

转载自blog.csdn.net/pig_is_duck/article/details/99904500