Java基础之四 IO流

  1. 流是一组有序的数据序列,根据操作的类型,分为输入流、输出流。所有输入流类都是抽象类InputStream(字节输入流)、Reader(字符输入流)的子类;所有输出流类都是OutputStream(字节输出流)、Writer(字符输出流)的子类。
  2. InputStream类常用方法与子类
//从输入流中读取数据的下一个字节。返回0-255内的int字节值。如果流已经到达末尾,返回-1
read()
//从输入流中读入一定长度的字节,并以整数的形式返回字节数
read(byte[] b)
//关闭此输入流并释放与该流关联的所有系统资源
close()
//返回此输入流在不受阻塞情况下能读取的字节数
available()

在这里插入图片描述
3. Reader子类
在这里插入图片描述
4. OutputStream类常用方法与子类

//将指定的字节写入此输出流
write(int b)
//将b个字节从指定的byte数组写入此输出流
write(byte[] b)
//彻底完成输出并清空缓存区
flush()
//关闭输出流
close()

在这里插入图片描述

  1. Writer子类
    在这里插入图片描述

  2. 创建与删除文件

File file = new File(strFileFullPath);
if(file.exists()){//判断文件是否存在
	file.delete();//删除文件
} else {
	file.createNewFile();//创建文件
}
  1. File类常用方法
    在这里插入图片描述

  2. FileInputStream与 FileOutputStream

File file = new File("word.txt");//创建文件对象
        //文件字节输入流
        try {
            FileOutputStream out = new FileOutputStream(file);//创建FileOutputStream对象
            byte[] b = "我有一只小毛驴,我从来也不骑。".getBytes();//创建byte数组
            out.write(b);//将byte数组中的信息写入文件中
            out.close();//关闭流
        } catch (Exception e) {
            e.printStackTrace();//输出异常信息
        }
        //文件字节输出流
        try {
            FileInputStream in = new FileInputStream(file);
            byte[] bye = new byte[1024];//创建byte数组
            int len = in.read(bye);//从文件中读取信息
            System.out.println(new String(bye,0,len));
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
  1. BufferedInputStream与 BufferedOutputStream
//构造方法,默认创建一个32字节的缓存区
BufferedInputStream(InputStream in);
//构造方法,创建一个指定字节的缓存区
BufferedInputStream(InputStream in,int size);
//BufferedOutputStream构造方法与BufferedInputStream类似,Buffered流关闭前要调用流的flush()方法
//下载文件接口获取OutputStream用response.getOutputStream()
//excel文件写入输出流用wb.write(BufferedOutputStream)

12.BufferedReader与 BufferedWriter

//BufferedReader常用方法
read()//读取单个字符
readLine()//读取一行字符

//BufferedWriter常用方法
write(String s,int offset,int len)//写入字符串的一部分
flush()//刷新该流的缓存
newLine()//写入一个行分隔符
// BufferedReader代码示例:
/**
 1. 获取widnows网卡的mac地址.
 2. @return mac地址
 */
public static String getWindowsMACAddress(String ip) {
    String mac = null;
    BufferedReader bufferedReader = null;
    Process process = null;
    try {
        /**
         * windows下的命令,显示信息中包含有mac地址信息
         */
        process = Runtime.getRuntime().exec("nbtstat -A " + ip);
        bufferedReader = new BufferedReader(new InputStreamReader(
                process.getInputStream(), "GBK")); // windows系统都是GBK编码,不加GBK读出的中文是乱码
        String line = null;
        int index = -1;
        while ((line = bufferedReader.readLine()) != null) {
            /**
             * 寻找标示字符串[physical address]
             */
             index = line.toLowerCase().indexOf("mac 地址 =");
             
            if (index != -1) {
                index = line.indexOf("=");
                if (index != -1) {
                    /**
                     * 取出mac地址并去除2边空格
                     */
                    mac = line.substring(index + 1).trim();
                }
                break;
            }
        }
    } catch (IOException e) {
        e.getMessage();
    } finally {
        try {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        bufferedReader = null;
        process = null;
    }
    return mac;
}
  1. ZIP压缩输入输出流
    在这里插入图片描述
//代码示例
/**
	 * 功能:压缩多个文件成一个zip文件	 * 
	 * @param srcfile:源文件列表
	 * @param zipfile:压缩后的文件
	 */
	public static void zipFiles(List<File> srcfile, File zipfile) {
		byte[] buf = new byte[1024];
		try {
			// ZipOutputStream类:完成文件或文件夹的压缩
			ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
			for (int i = 0; i < srcfile.size(); i++) {
				FileInputStream in = new FileInputStream(srcfile.get(i));
				out.putNextEntry(new ZipEntry(srcfile.get(i).getName()));
				int len;
				while ((len = in.read(buf)) > 0) {
					out.write(buf, 0, len);
				}
				out.closeEntry();
				in.close();
			}
			out.close();
			System.out.println("压缩完成.");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 功能:解压缩
	 * @param zipfile:需要解压缩的文件
	 * @param descDir:解压后的目标目录
	 */
	public static void unZipFiles(File zipfile, String descDir) {
		try {
			ZipFile zf = new ZipFile(zipfile);
			for (Enumeration entries = zf.entries(); entries.hasMoreElements();) {
				ZipEntry entry = (ZipEntry) entries.nextElement();
				String zipEntryName = entry.getName();
				InputStream in = zf.getInputStream(entry);
				OutputStream out = new FileOutputStream(descDir + zipEntryName);
				byte[] buf1 = new byte[1024];
				int len;
				while ((len = in.read(buf1)) > 0) {
					out.write(buf1, 0, len);
				}
				in.close();
				out.close();
				System.out.println("解压缩完成.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
  1. 下载文件,返回文件流
    org.apache.commons.io的maven如下:
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>
  /**
     * @param response 响应
     * @Description: 文件下载
     */
    public static void downFile(String filePath, HttpServletResponse response, HttpServletRequest request) throws Exception{
        //文件名
        File file = new File(filePath);
        String fileName = file.getName();
        // 设置response的Header 防止文件名乱码;Content-disposition: attachment表示浏览器默认下载文件;
        response.addHeader("Content-Disposition","attachment;filename="
                            + new String((fileName).getBytes("utf-8"), "ISO-8859-1"));
        //告知浏览器这是一个字节流,浏览器处理字节流的默认方式就是下载。
        response.setContentType("application/octet-stream");
        InputStream in = new FileInputStream(file);
        OutputStream out = response.getOutputStream();
    	IOUtils.copy(in, out);
        out.flush();
        in.close();    
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值