Java Io 流(输入输出流)

IO流,也就是输入和输出流,可分为字节流和字符流。


1. 字节流

(1). InputStream 输入流,用于读取文件

输入流常用API:

inputStream.read()  读取一个字节

inputStream.read(byte[] buffer) 读取数据填充字节数组

inputStream.read(byte[] buffer, int start, int size) 读取数据到字节数组buffer中,从buffer的start位置开始,到size长度的数据

(2). OutputStream 输出流, 用于写入文件

输出流常用API:

outputStream.write(int b) 写一个字节到流中

outputStream.write(byte[] buffer) 写一个字节的数据到流中

outputStream.write(byte[] buffer, int start, int size) 写字节数据buffer从start位置开始到size长度的字节到流中

(3). 常用实现类

<1>. FileInputStream 文件输入流,封装了从磁盘读取文件到流中的操作,事例代码如下:

package com.dcz.io;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class IOUtil {
	
	/**
	 * 文件输入流的DEMO-1
	 * 读取指定文件内容,按照16进制输出到控制台
	 * 输出10个byte换行
	 * @param fileName
	 * @throws IOException 
	 */
	public static void printHex(String fileName) throws IOException{
		
		InputStream ins = new FileInputStream(fileName);
		
		int b;
		int i = 1;
		// 读取到-1说明读取结束
		while((b = ins.read()) != -1){
			// 读取每一个字节转换成16进制显示
			System.out.print(Integer.toHexString(b) + " ");
			if(i++ % 10 == 0){
				System.out.println();
			}
		}
		
		ins.close();
	}
	
	/**
	 * 文件输入流的DEMO-2
	 * 读取指定文件内容,按照16进制输出到控制台
	 * 输出10个byte换行
	 * @param fileName
	 * @throws IOException 
	 */
	public static void printHexByByteArray(String fileName) throws IOException{
		
		InputStream ins = new FileInputStream(fileName);
		
		// 第一种写法,因为有可能这个字节数组放不下。 一次性读取
/*		byte[] buffer = new byte[20 * 1024];
		int byteSize = ins.read(buffer, 0, buffer.length);
		int j=1;
		for(int i=0; i<byteSize; i++){
			System.out.print(Integer.toHexString(buffer[i]) + " ");
			if(j++ % 10 == 0){
				System.out.println();
			}
		}*/
		
		// 第二种写法,循环读取
		int j = 1;
		int b;
		byte[] buffer = new byte[10];
		while((b = ins.read(buffer, 0, buffer.length)) != -1){
			for(int i=0; i<b; i++){
				System.out.print(Integer.toHexString(buffer[i]) + " ");
				if(j++ % 10 == 0){
					System.out.println();
				}
			}
		}
		
		ins.close();
	}
	
	public static void main(String[] args) {
		
		try {
			IOUtil.printHexByByteArray("E:\\demo.txt");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


 

<2>. FillOutputStream 文件输出流。封装了从输入流中写入文件到磁盘操作。事例代码如下:

package com.dcz.io;

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

public class IOUtil {
	
	
	/**
	 * 将内容写到指定文件中
	 * @param fileName
	 * @throws IOException
	 */
	public static void writeToFile(String fileName) throws IOException{
		
		OutputStream os = new FileOutputStream(fileName);
		os.write('a');
		os.write('b');
		int i = 10;
		os.write(i >>> 24);
		os.write(i >>> 16);
		os.write(i >>> 8);
		os.write(i);
		String str = "中国人";
		byte[] b = str.getBytes("gbk");
		os.write(b);
		
		os.close();
	}
	
	/**
	 * 简单的文件拷贝操作
	 * @param src
	 * @param desc
	 * @throws Exception 
	 */
	public static void copyFile(File src, File dest) throws Exception{
		
		if(!src.exists()){
			throw new IllegalAccessException("文件不存在!");
		}
		
		// 创建文件输入流对象
		InputStream inputstream = new FileInputStream(src);
		// 创建文件输出流对象
		OutputStream outputStream = new FileOutputStream(dest);
		
		int b;
		byte[] buffer = new byte[2048];
		// 循环读取文件内容到字节序列中,直到读取结束
		while((b = inputstream.read(buffer, 0, buffer.length)) != -1){
			// 写入一个缓冲字节序列到磁盘中
			outputStream.write(buffer);
			outputStream.flush();
		}
		outputStream.close();
		inputstream.close();
	}
	
	public static void main(String[] args) {
		
		File scrFile = new File("D:\\cglib-3.1.jar");
		File destFile = new File("E:\\abc.jar");
		
		try {
			//IOUtil.writeToFile(fileName);
			//IOUtil.printHex(fileName);
			IOUtil.copyFile(scrFile, destFile);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


 



 

posted @ 2015-09-05 22:22  dcz1001  阅读(242)  评论(0编辑  收藏  举报