ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IO流体系

2021-07-23 20:33:48  阅读:169  来源: 互联网

标签:体系 bytes fileInputStream fileOutputStream IO FileInputStream new byte


分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 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 = "高智豪

标签:体系,bytes,fileInputStream,fileOutputStream,IO,FileInputStream,new,byte
来源: https://www.cnblogs.com/Gzh001007/p/15050532.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有