IO流体系

分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader writer 节点流
访问文件 FilelnputStream FileOutputStream FileReader FileWriter 节点流
转换流 InputStreamReader OutputStreamWriter 处理流
缓冲流 BufferedinputStream BufferedOuputStream BufferedReader BufferedWriter 处理流
对象流 ObjectinputStream ObjectinputStream 处理流
内存流 处理流
/*
* 	IO流的概念:
*		I: input,输入
* 		O: Output,输出
* 	输入输出流。
*
* 	Java针对输入输出提出两*抽象类:
* 		java.io.InputStream: 输入流
* 			根据数据源的不同,InputStream有可以分为众多的子类
* 			class FileInputStream extends InputStream (☆)
*
* 		java.io.OutputStream: 输出流
* 			根据数据源的不同,OutputStream也可以分为众多的子类:
* 			class FileOutputStream extends OutputStream
* */

输入(读取):read()方法

public class Demo01 {
	public static void main(String[] args) throws Exception {
		/*
		* 	FileInputStream: 将磁盘上的文件中的数据读取Java程序中。
		* 	构造方法: FileInputStream(String filePath)
		* */
		FileInputStream fis = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\123.txt"); // throws  FileNotFoundException
		/*
		* 	int read(): 获取文件中的一个字节的数据
		* 			如果数据源已经读完,那么这个方法返回为-1.
		* */
		int data = fis.read();// private native int read0() throws IOException; 调用是C/C++去操作。\
		System.out.println(data);

               /*
		* 	int read(byte [] bytes);
		* 		参数bytes: 一次性尝试读取bytes.length个字节,读取到的数据就放在byte数组中。
		* 		返回值: 实际读取到的字节数
		* */
		byte [] bytes = new byte[10];//一次读取10个字节的数据,数组容量本身不要刻意搞得太大, 因为创建数组本身就需要消耗时间,建议数组容量为1kb 或者 8kb
		int count = fis.read(bytes);
		System.out.println("实际读取到的个数:"+count);
		for (byte aByte : bytes) {
			System.out.println(aByte);
		}
                fis.close();//记得关闭流
	}
}

一次读不完需要多次读取

public class Demo02 {
	public static void main(String[] args) {
		FileInputStream fis = null;
		try {
			File file = new File("C:\\Users\\GzhAnkh\\Desktop\\test.txt");//1326个字节
			System.out.println("文件的大小:"+file.length()+"byte");
			fis = new FileInputStream(file);
			byte [] bytes = new byte[1024];
			int len;
			// 没有读完, 就一直读取数据
			while((len=fis.read(bytes))!=-1){
                       /*
			* 	会出现乱码, 乱码的原因是: 2.jpg本身不是文本文件不能转为字符串。
			*
			* 	操作系统分为两大文件:
			* 		1、文本文件: 可以直接通过记事本可以打开,而且能正常显示其中的内容(.txt、.java)。
			* 		2、二进制文件: 不可以直接通过记事本可以打开,就算打开了也是看不懂的乱码(图片文件、视频文件、音频文件、.class)。
			*
			* 	读取二进制文件获取到的数据, 把其转为字符串也没有太大意义。
			* */
				System.out.println(new String(bytes,0,len)); // 302
			} // len代表此次读取的实际数据量
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fis.close();//记得关流,释放资源,如果不去释放资源, 表示这个文件一直被Java程序占用, 无法进行删除等操作.
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
                /*
		 *	面试题下面三个有什么区别:
		 * 		finally
		 * 		final
		 * 		finalize
		 *
		 * 	三个完全不是同一个东西, 作用也不相同:
		 * 		finally: 和try一起使用, 表示最后执行的代码块
		 * 		final: 修饰符
		 *		finalize: 是一个Object中的方法, GC回收机制的使用会用到。
                 *    
                 * 	finally语句块:
                 * 		不管有没有出现异常都会执行的代码
		 * */
	}
}

简单完整例子

public class Demo03 {
    public static void main(String[] args){
        FileInputStream fileInputStream = null;
        
        try {
            fileInputStream = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo03\\Demo01\\Code04.java");
            byte[] bytes = new byte[1024];
            int len;
            while ((len = fileInputStream.read(bytes)) != -1) {
                System.out.println(new String(bytes, 0, len));
            }
        } catch (Exception e) {
            throw new RuntimeException("异常");
        } finally {//不管是否出现异常都会走下面的代码
            try {
                if(fileInputStream!=null)
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

输出数据到文件:write()方法

public class Demo04 {
    public static void main(String[] args) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream("C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo01.txt", true);
            //是否追加,最后的true意思是追加,默认是否,也就是会覆盖

            fileOutputStream.write(97);//0110 0001也就是 ‘a'

            //fileOutputStream.write(1);想输入'1',输入对应的字符串是的编码,’1‘的编码表上的值为49
            //字符表的映射,每个字符都有对应的值
            /*
             * gbk是采用2个字节存储一个汉字
             * utf-8采用3个字节存储汉字
             * */

            fileOutputStream.write(49);//'1'

            byte[] bytes = {1, 2, 3, 4, 5};//
            fileOutputStream.write(bytes);

            String s = "高智豪
上一篇:获取APK获取APK证书MD5、SHA1、SHA256等秘钥


下一篇:表格操作