Java中的IO流――FileInputStream

匿名 (未验证) 提交于 2019-12-02 21:53:52

Java中的IO流――FileInputStream


1、字节输入流:FileInputStream

 * 字节输入流操作步骤:
 * A:  创建字节输入流对象
 * B:  调用read( )方法读取数据,并把数据显示在控制台
 * C:  释放资源


 * 读取数据的方式:
 * A:  int read( )  :一次读取一个字节
 * B:  int read(byte[ ] b)  :一次读取一个字节数组

package cn.itcast_02;  import java.io.FileInputStream; import java.io.IOException;  /*  * 字节输入流操作步骤:  * A:创建字节输入流对象  * B:调用read()方法读取数据,并把数据显示在控制台  * C:释放资源  *   * 读取数据的方式:  * A:int read():一次读取一个字节  * B:int read(byte[] b):一次读取一个字节数组  */ public class FileInputStreamDemo { 	public static void main(String[] args) throws IOException { 		// FileInputStream(String name) 		// FileInputStream fis = new FileInputStream("fis.txt"); 		FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java");  		// 调用read()方法读取数据,并把数据显示在控制台 		int by = 0; 		// 读取,赋值,判断 		while ((by = fis.read()) != -1) { 			System.out.print((char) by); 		}  		// 释放资源 		fis.close(); 	} }

2、字节流复制文件案例

 * 复制文本文件。
 * 数据源:从哪里来
 * a.txt    --    读取数据    --    FileInputStream   
 * 目的地:到哪里去
 * b.txt    --    写数据        --    FileOutputStream

 *
 * java.io.FileNotFoundException: a.txt (系统找不到指定的文件。)
 *
 * 这一次复制中文没有出现任何问题,为什么呢?
 * 上一次我们出现问题的原因在于我们每次获取到一个字节数据,就把该字节数据转换为了字符数据,然后输出到控制台。
 * 而这一次呢? 确实通过IO流读取数据,写到文本文件,你读取一个字节,我就写入一个字节,你没有做任何的转换。 它会自己做转换。

package cn.itcast_03;  import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;    public class CopyFileDemo { 	public static void main(String[] args) throws IOException { 		// 封装数据源 		FileInputStream fis = new FileInputStream("a.txt"); 		// 封装目的地 		FileOutputStream fos = new FileOutputStream("b.txt");  		int by = 0; 		while ((by = fis.read()) != -1) { 			fos.write(by); 		}  		// 释放资源(先关谁都行) 		fos.close(); 		fis.close(); 	} }

3、计算机是如何识别什么时候该把两个字节转换为一个中文的呢?

 * 计算机是如何识别什么时候该把两个字节转换为一个中文呢?
 * 在计算机中,中文的存储分两个字节:
 *         第一个字节对应的码值 肯定是负数。
 *         第二个字节对应的码值 常见的是负数,可能有正数,但是没影响。

计算机只要看到第一个码值是负数,立马就明白了这是个中文,要和该码值之后紧接着的第二个码值做拼接处理,然后转换为中文字符。

计算机只要看到第一个码值是正数,立马就明白了这是个单字节的英文,直接转换为英文字符即可。

package cn.itcast_03;  import java.util.Arrays;  /*  * 计算机是如何识别什么时候该把两个字节转换为一个中文呢?  * 在计算机中中文的存储分两个字节:  * 		第一个字节肯定是负数。  * 		第二个字节常见的是负数,可能有正数。但是没影响。  */ public class StringDemo { 	public static void main(String[] args) { 		// String s = "abcde"; 		// // [97, 98, 99, 100, 101]  		String s = "我爱你中国"; 		// [-50, -46, -80, -82, -60, -29, -42, -48, -71, -6]  		byte[] bys = s.getBytes(); 		System.out.println(Arrays.toString(bys)); 	} }


4、需求1:把c盘下的a.txt的内容复制到d盘下的b.txt中

 * 需求:把c盘下的a.txt的内容复制到d盘下的b.txt中
 *
 * 数据源:
 *         c:\\a.txt    --    读取数据--    FileInputStream
 * 目的地:
 *         d:\\b.txt    --    写出数据    --    FileOutputStream

package cn.itcast_03;  import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;  /*  * 需求:把c盘下的a.txt的内容复制到d盘下的b.txt中  *   * 数据源:  * 		c:\\a.txt	--	读取数据--	FileInputStream  * 目的地:  * 		d:\\b.txt	--	写出数据	--	FileOutputStream  */ public class CopyFileDemo2 { 	public static void main(String[] args) throws IOException { 		// 封装数据源 		FileInputStream fis = new FileInputStream("c:\\a.txt"); 		// 封装目的地 		FileOutputStream fos = new FileOutputStream("d:\\b.txt");  		// 复制数据 		int by = 0; 		while ((by = fis.read()) != -1) { 			fos.write(by); 		}  		// 释放资源 		fos.close(); 		fis.close(); 	} }


5、需求2:把e:\\林青霞.jpg内容复制到当前项目目录下的mn.jpg中

 * 需求:把e:\\林青霞.jpg内容复制到当前项目目录下的mn.jpg中
 *
 * 数据源:
 *         e:\\林青霞.jpg    --读取数据--FileInputStream
 * 目的地:
 *         mn.jpg--写出数据--FileOutputStream

package cn.itcast_03;  import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;  /*  * 需求:把e:\\林青霞.jpg内容复制到当前项目目录下的mn.jpg中  *   * 数据源:  * 		e:\\林青霞.jpg	--读取数据--FileInputStream  * 目的地:  * 		mn.jpg--写出数据--FileOutputStream  */ public class CopyImageDemo { 	public static void main(String[] args) throws IOException { 		// 封装数据源 		FileInputStream fis = new FileInputStream("e:\\林青霞.jpg"); 		// 封装目的地 		FileOutputStream fos = new FileOutputStream("mn.jpg");  		// 复制数据 		int by = 0; 		while ((by = fis.read()) != -1) { 			fos.write(by); 		}  		// 释放资源 		fos.close(); 		fis.close(); 	} }

6、需求:一次读取一个字节数组(速度很快!)

 * 一次读取一个字节数组:int read(byte[ ] b)
 * 返回值其实是实际读取的字节个数。

package cn.itcast_02;  import java.io.FileInputStream; import java.io.IOException;  /*  * 一次读取一个字节数组:int read(byte[] b)  * 返回值其实是实际读取的字节个数。  */ public class FileInputStreamDemo2 { 	public static void main(String[] args) throws IOException { 		// 创建字节输入流对象 		// FileInputStream fis = new FileInputStream("fis2.txt"); 		FileInputStream fis = new FileInputStream("FileOutputStreamDemo.java");  		// 读取数据 		// 定义一个字节数组 		// 数组的长度一般是1024或者1024的整数倍 		byte[] bys = new byte[1024]; 		int len = 0; 		while ((len = fis.read(bys)) != -1) { 			System.out.print(new String(bys, 0, len));	//千万要带上len的使用 		}  		// 释放资源 		fis.close(); 	} }





标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!