Java之字节流(文件输入、输出流)

时间:2021-03-15 19:44:48
IO(输入流,输出流)
字节流
1.字节流
1)InputStream、OutputStream
  InputStream抽象的应用了程序读取数据的方式
  OutputStream抽象的应用了程序写出数据的方式
  
2)EOF = End 读到-1就表示读到了文件结尾
 
3)输入流基本方法
  int b = in.read();//读取一个字节无符号填充到int低八位.-1是EOF
  in.read(byte[] buf);//读取数据填充到字节数组buf
  in.read(byte[] buf,int start,int size);//读取数据填充到字节数组buf,从buf的start位置开始存放size长度数据
 
4)输出流基本方法
  out.write(int b);//写一个byte到流,b的低8位
  out.write(byte[] buf);//将buf字节数组写入流
  out.write(byte[] buf,int start,int size);//字节数组buf从start位置开始写size个长度的字节到流
 
5)FileInputStream----->具体实现在文件上的读取
6)FileOutputStream 实现了向文件中写出byte数据的方法


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

public class IOUtil {
	/**
	 * 读取指定文件内容,按16进制输出到控制台
	 * 并且每输出10个byte换行
	 * 单字节读取不适合大文件,大文件效率低
	 */
	public static void printHex(String FileName) throws IOException {
		//把文件作为字节流进行读操作
		FileInputStream in = new FileInputStream(FileName);
		int b;
		int i = 1;
		while((b = in.read()) != -1){
			if(b <= 0xf){
				//单位数前面补0
				System.out.print("0");
			}
			System.out.print(Integer.toHexString(b) + " ");
			if(i++%10 == 0)
				System.out.println();;
		}
		in.close();
	}
	
	public static void printHexByByteArray(String FileName) throws IOException {
		FileInputStream in = new FileInputStream(FileName);
	    byte[] buf= new byte[20 * 1024];
	    /* 从in中批量读取字节,放入到buf这个字节数组中,
	     * 从第0个位置开始放,最多放buf.length个
	     * 返回的是读到的字节个数
	     * 批量读取,对大文件而言效率高,也是我们最常用的读取文件方式
	     */
	    int bytes = in.read(buf,0,buf.length);//一次性读完,说明字节数组足够大
	    for(int i = 0;i < bytes;i++){
	    	//如果buf[i]>=0并且buf[i]<=15,前面添0
	    	if(buf[i] <=0xf &&buf[i] >=0)
	    		System.out.print("0");
	    	//&0xff,byte类型8位,int类型32位,为了避免数据转换错误,通过0xff将int的高24位清零
	    	System.out.print(Integer.toHexString(buf[i]&0xff)+" ");
	    	if((i+1)%10==0)
	    		System.out.println();
	    }
	    in.close();
	}
	public static void copyFile(File srcFile,File deskFile) throws IOException {
		if(!srcFile.exists())
			throw new IllegalArgumentException("文件"+srcFile+"不存在!");
		if(!srcFile.isFile())
			throw new IllegalArgumentException(srcFile+"不是文件!");
		FileInputStream in = new FileInputStream(srcFile);
		FileOutputStream out = new FileOutputStream(deskFile);
		byte[] buf = new byte[8 * 1024];
		int b;
		while((b = in.read(buf,0,buf.length))!=-1){
			out.write(buf, 0, b);
			out.flush();//最好加上
		}
		out.close();
		in.close();
	}
}
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutDemo {

	public static void main(String[] args) throws IOException {
		//如果文件不存在,则直接创建;如果文件存在,则删除后创建
		FileOutputStream out =new FileOutputStream("demo/out.dat");
		out.write('A');//写出了A的低8位
		out.write('B');//写出了B的低8位
		int b = 10;//write只能写8位,如果要写出一个整数,则需要写4次,每次8位
		out.write(b >>> 24);
		out.write(b >>> 16); 
		out.write(b >>> 8);
		out.write(b);
		byte[] gbk = "中国".getBytes("gbk");
		out.write(gbk);
		out.close();
		IOUtil.printHex("demo/out.dat");
		
	}

}

import java.io.File;
import java.io.IOException;

public class IOUtilTest {

	public static void main(String[] args) {
		try {
			long start = System.currentTimeMillis();
			//IOUtil.printHex("e:\\javaio\\日记.txt");
			//IOUtil.printHexByByteArray("e:\\javaio\\日记.txt");
			IOUtil.copyFile(new File("e:\\javaio\\日记.txt"), new File("e:\\javaio\\日记1.txt"));
			System.out.println();
			long end = System.currentTimeMillis();
			System.out.println(end-start);
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

}