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(); } } }