zoukankan      html  css  js  c++  java
  • JAVA_IO

    1 File

    • File可以将程序和电脑的文件夹或者文件关联起来

    相对路径

    绝对路径

    2 基本概念

    分类

    image

    • 流向

    输入流,输出流

    • 数据

    字节流:二进制,可以使一切文件包括文件,文本音视频

    字符流:文本文件,只可以处理纯文本

    • 功能

    节点流:包裹源头

    处理流:增强功能,提供性能

    字节流和字符流

    1. 字节流
    • 输入流
    InputStream;
    read(byte[] b)
    read(byte[] b,int off,int len);
    close();
    
    • 输出流
    OutputStream;
    write(byte[] b) + flush() + close()
    
    
    1. 字符流
    • 输入流:Reader
    read(char[] buffer)
    
    • 输出流:Writer
    write(byte[] buffer)+flush()+close()
    

    2 字节流

    步骤

    • 建立与文件的联系
    • 选择对应流
    • 读取|写出
    • 数组大小读取或者写出
    • 释放资源

    读取文件与写出文件与拷贝

    • 读取
    // 建立联系
    		File file = new File("F://zhao.txt");
    		// 选择流
    		InputStream inputStream = new FileInputStream(file);
    		// 读取的大小每次
    		byte[] b = new byte[10];
    		
    		int len = 0;// 实际读取的字节数
    		while((len = inputStream.read(b)) != -1){
    			System.out.println(len);
    		}
    		inputStream.close();
    
    • 写入文件
    FileOutputStream(File file) // 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
    
    FileOutputStream(File file, boolean append) //创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
    
    FileOutputStream(String name) //   创建一个向具有指定名称的文件中写入数据的输出文件流。
    
    FileOutputStream(String name, boolean append) // 创建一个向具有指定 name 的文件中写入数据的输出文件流。
    
    
    
    
    // f://zhaodi.txt在写的时候自动创建这个文件
    		OutputStream os = new FileOutputStream(new File("f://zhaodi.txt"),true);
    		String info ="zhaodi  is 赵迪";
    		// 字符串转字节
    		byte[] data = info.getBytes();
    		os.write(data);
    		os.flush();
    
    
    • 拷贝文件

    就是先读取一个文件,然后写到另一个文件

    InputStream is = null;
    		OutputStream os = null;
    		os = new FileOutputStream("f://zhaodiishao.txt",true);
    		is = new FileInputStream(new File("f://zhao.txt"));
    		
    		byte[] car = new byte[1024];
    		int len = 0;
    		while((len = is.read(car)) != -1){
    			os.write(car);
    		}
    		os.flush();
    		is.close();
    		os.close();
    
    • 拷贝文件夹

    3 字符流

    只可以操作纯文本

    步骤:

    • 建立联系
    • 选择流 Writer、Reader
    • 读取|写出 char[] data = new char[10] 注意这里是字符数组!!
    • 关闭

    原理同字节流,此处省略

    4 处理流

    • 节点流处于io操作的第一线,所有操作必须通过他们进行;处理流可以对其它流进行处理(提高效率或者操作灵活性)
    • 记住处理流是对其它流的处理哦
    • 提高性能,增强功能

    字节缓冲流

    • 字节缓冲流

    没有加入新的方法

    InputStream is = null;
    		OutputStream os = null;
    		os = new BufferedOutputStream(new FileOutputStream("f://zhaodiishao.txt",true));
    		is = new BufferedInputStream(new FileInputStream(new File("f://zhao.txt")));
    		
    		byte[] car = new byte[1024];
    		int len = 0;
    		while((len = is.read(car)) != -1){
    			os.write(car);
    		}
    		os.flush();
    		is.close();
    		os.close();
    

    字符缓冲流

    加入新的重要的方法

    readLine() //读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
    newLine() // 写入一个行分隔符
    
    
    // 选择流
    		BufferedReader bufferedReader = null;// 多态是不可以访问新增加的方法的所以这里不可以使用多态
    		BufferedWriter bufferedWriter = null;
    		
    		try {
    			// 包装节点流
    			bufferedReader = new BufferedReader(new FileReader(new File("f://zhao.txt")));
    			bufferedWriter = new BufferedWriter(new FileWriter(new File("f://zhaozhao.txt")));
    			
    			
    			String line_info = null;
    			// 读取  写入
    			while((line_info=bufferedReader.readLine())!=null){
    				bufferedWriter.write(line_info);
    				bufferedWriter.newLine();
    			}
    			bufferedWriter.flush();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			try {
    				// 关闭
    				bufferedReader.close();
    				bufferedWriter.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		
    

    转换流

    作用

    • 字节流转换为字符流
    • 处理乱码编码集
    • 解码

    编码

    graph LR
    字符-->二进制
    

    解码

    graph LR
    二进制-->字符
    

    乱码出现原因

    • 编码与解码的字符集不统一
    String user_name = "zhaodi 赵迪";
    		// 编码
    		byte[] data = user_name.getBytes("utf-8");
    		// 解码
    		String user_name1 = new String(data,"utf-8");
    		System.out.println(user_name1);
    
    • 字节缺少,长度丢失

    5 序列化,反序列化

    程序运行时,只要需要,对象可以一直存在,并且我们可以随时访问对象的一些状态信息,如果程序终止,那么对象是肯定不会存在的,但是有时候,我们需要再程序终止时保存对象的状态信息,之后程序再次运行时可以重新恢复到之前的状态,如,玩家玩游戏退出时,需要保存玩家的状态信息(如等级、装备等等),之后玩家再此登入时,必须要恢复这些状态信息。我们可以通过数据库手段来达到这个保存状态的目的,在Java中,我们有更简便的方法进行处理,那就是序列化与反序列化。序列化是一种对象持久化的手段,反序列化与序列化相反,其是通过序列化后的信息重新组装成对象。

    -序列化 需要实现Serializable 接口,反序列化不需要

    一个小小的程序员
  • 相关阅读:
    django之数据库orm
    Python的迭代器和生成器
    xhprof 安装使用
    http_load
    sysbench
    LINUX系统下MySQL 压力测试工具super smack
    apache ab工具
    关于流量升高导致TIME_WAIT增加,MySQL连接大量失败的问题
    mysql5.6优化
    php-fpm超时时间设置request_terminate_timeout分析
  • 原文地址:https://www.cnblogs.com/zhaod/p/8351693.html
Copyright © 2011-2022 走看看