IO流_字节数组流_基本数据类型流_day27

1.字节数组流(用于操作其他电脑的内存数数据)

我在这里写的程序是操作自己的字节数组所以看着有些别扭:

package othersIO;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import byteIO.InputStream;

/**
 * 
 * 这里我们介绍字节数组流
 * 字节数组流一般适用于两台电脑之间(两个不同的内存)的操作
 * 
 * @author Wang
 *
 */

public class ByteArrayIO01 {
	public static void main(String[] args) throws IOException {
		ByteArrayRead();
		ByteArrayWrite();
	}
	
	public static void ByteArrayRead() throws IOException {
		//建立源
		String str = "我的老家就住在这里 只想遇到最好的自己";
		byte[] src = str.getBytes();
		//src = str.getBytes();
		//选择流
		BufferedInputStream is = new BufferedInputStream(
				new ByteArrayInputStream(
						src));
		byte[] buffer = new byte[1024];
		int length = 0;
		while((length = is.read(buffer)) != -1) {//把src读到buffer里面然后输出buffer
			System.out.println(new String(buffer,0,length));
		}
		//释放资源关闭文件
		is.close();
	}
	
	
	
	public static void ByteArrayWrite() throws IOException {
		//建立目的地
		byte[] target = new byte[1024];
		//选择流
		ByteArrayOutputStream bos = new ByteArrayOutputStream();//这里有不同点  这里有新增方法不适用多态  还有就是他不与目的地建立连接
		//操作输出
		String src = "操作方法基本与文件输入流一样  但是也有不同的地方";
		byte[] srcByte = src.getBytes();
		bos.write(srcByte,0,srcByte.length);
		//读取数据
		target = bos.toByteArray();
		//释放资源
		bos.close();
		System.out.println(new String(target));
	}
}

我们使用字节数组流,实现文件的copy

package othersIO;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 
 * 在这里我们使用字节数组流来实现文件的Copy
 * 
 *1、文件  --程序-> 字节数组
 * 文件输入流     
 * 字节数组输出流
 *
 *2、字节数组  --程序-> 文件
 * 字节数组输入流
 * 文件输出流
 * 
 * @author Wang
 *
 */

public class ByteArrayIO02 {
	public static void main(String[] args) throws IOException {
		//File src = new File("F:/testIO/java.png");
		byte[] srcByteArray = fileToByteArray("F:/testIO/java.png");
		byteArrayToFile(srcByteArray,"F:/testIO/java1.png");
		
	}
	
	/**
	 * 1、文件  --程序-> 字节数组
	 * 文件输入流     
	 * 字节数组输出流
	 * @throws IOException 
	 */
	public static byte[] fileToByteArray(String srcPath) throws IOException {
		File srcFile = new File(srcPath);
		byte[] srcByteArray = null;
		BufferedInputStream is = new BufferedInputStream(new FileInputStream(srcFile));
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		
		byte[] buffer = new byte[1024];
		int length = 0;
		while((length = is.read(buffer)) != -1) {
			bos.write(buffer,0,length);
		}
		bos.flush();// 写文件的时候要强制刷出
		srcByteArray = bos.toByteArray();   //先接收一下写入的byte文件
		
		bos.close();//然后在进行关闭
		is.close();
		
		return srcByteArray;
	}
	
	
	
	/**
	 * 2、字节数组  --程序-> 文件
	 * 字节数组输入流
	 * 文件输出流
	 * @throws IOException 
     */	
	
	public static void byteArrayToFile(byte[] srcByteArray,String targetPath) throws IOException {
		File target = new File(targetPath);
		BufferedOutputStream bos = new BufferedOutputStream(//文件流的输出
				new FileOutputStream(
						target));
		BufferedInputStream bis = new BufferedInputStream(//字节数组的读取
				new ByteArrayInputStream(
						srcByteArray));
		
		byte[] buffer = new byte[1024];
		int length = 0;
		while((length = bis.read(buffer)) != -1) {
			bos.write(buffer,0,length);
			
		}
		bos.flush();
		
		bos.close();
		bis.close();
		
	}
}

2.处理流(基本数据类型流)


package othersIO;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 数据类型(基本+String)处理流
 * 特点就是可以保留数据的类型(只能处理数据的基本类型)   处理的时候不用在考率数据类型的转换
 * 
 * 1、输入流 DataInputStream  readXxx()
 * 2、输出流 DataOutputStream writeXxx()
 * 新增方法不能使用多态
 * 
 * java.io.EOFException :读取到文档末尾也没有读取到相关的内容
 * 
 * @author Wang 
 *
 */

public class DateIO01 {
	public static void main(String[] args) {
		//File src = new File("F:/testIO/4.txt");
		try {
			write("F:/testIO/4.txt");
			read("F:/testIO/4.txt");
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
		
		
		
	}
	
	public static void write(String targetPath) throws IOException {
		
		double a = 3.1415926;
		int b = 4;
		String str = "其实我并不喜欢打代码,我就是想整点钱";
		
		File target = new File(targetPath);//创建源
		DataOutputStream dos = new DataOutputStream(
				new BufferedOutputStream(
						new FileOutputStream(
								target)));//选择流
		
		//写入数据     写入数据的顺序要与读取的时候一直不然会抛出异常java.io.EOFException :读取到文档末尾也没有读取到相关的内容
		dos.writeDouble(a);
		dos.writeInt(b);
		dos.writeUTF(str);	
		
		dos.flush();    //记住只要是输出流也就是写东西的时候就一定要刷出
		
		//释放资源
		dos.close();
	}
	
	
	public static void read(String srcPath) throws IOException {
		File src = new File(srcPath);  //创建源
		
		DataInputStream dis = new DataInputStream(   //选择流
				new BufferedInputStream(
						new FileInputStream(
								src)));
		
		//操作 读取的顺序与写出一致   必须存在才能读取
		//不一致,数据存在问题
		
		double num1 =dis.readDouble();
		int num2 =dis.readInt();
		String str =dis.readUTF();
				
		dis.close();
		System.out.println(num1+"-->"+str);
		
	}
	
	
	
	
	
	
	
}
package othersIO;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 我们用字节数组流来操作
 * 
 * @author Wang
 *
 */

public class DataIO02 {
	
	public static void main(String[] args) throws IOException {
		read(write());
	}

	
	
	
        public static byte[] write() throws IOException {
		
        byte[] targetByte = null;//目标数组
		double a = 3.1415926;
		int b = 4;
		String str = "其实我并不喜欢打代码,我就是想整点钱";
		
		
		
		ByteArrayOutputStream bos =new ByteArrayOutputStream();//这个选择流的过程有点特殊
		DataOutputStream dos = new DataOutputStream(
				new BufferedOutputStream(
								bos));//选择流    //注意这个再写的时候没有指定地点
		
		
		//写入数据     写入数据的顺序要与读取的时候一直不然会抛出异常java.io.EOFException :读取到文档末尾也没有读取到相关的内容
		dos.writeDouble(a);
		dos.writeInt(b);
		dos.writeUTF(str);	
		
		dos.flush();    //记住只要是输出流也就是写东西的时候就一定要刷出
		
		targetByte = bos.toByteArray();
		
		//释放资源
		dos.close();
		
		return targetByte;
	}
	
	
	public static void read(byte[] srcByte) throws IOException {
		//File src = new File(srcPath);  //创建源
		
		ByteArrayInputStream bais = new ByteArrayInputStream(srcByte);
		DataInputStream dis = new DataInputStream(   //选择流
				new BufferedInputStream(
								bais));
		
		//操作 读取的顺序与写出一致   必须存在才能读取
		//不一致,数据存在问题
		
		double num1 =dis.readDouble();
		int num2 =dis.readInt();
		String str =dis.readUTF();
				
		dis.close();
		System.out.println(num1+"-->"+str);
		
	}
	
}



我们在用基本数据流的时候  写入文件里面的东西我们是看不懂的;是下面这个样子  这是给机器看的





注意:

写文件的时候要强制刷出   flush();

在ByteArray中关闭不关闭文件其实都一样 ,因为你读写的一般都是别人的电脑或别的内存上的(他们会自动回收),但是我们统一关闭一下没有什么坏处;

基本数据类型的处理流,保留了数据加类型,因为是处理流所以还要套节点流;

字节数组流的写入字节数组时    也就是Output的时候  是不关联写入地点的(特别注意这一点)

ByteArrayOutputStream bos = new ByteArrayOutputStream();//这里有不同点  这里有新增方法不适用多态  还有就是他不与目的地建立连接

他在使用DateOutputStream()流的时候也很特殊     他要这样写

ByteArrayOutputStream bos =new ByteArrayOutputStream();//这个选择流的过程有点特殊
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(

bos));//选择流    //注意这个再写的时候没有指定地点

因为   他没有建立写入地点  归根结底是因为这个方法     targetByte = bos.toByteArray();    所以必须保证有这一句ByteArrayOutputStream bos =new ByteArrayOutputStream();

猜你喜欢

转载自blog.csdn.net/qq_38053395/article/details/80556533
今日推荐