Java中的IO流-字节输入流——FileInputStream

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();
	}
}





猜你喜欢

转载自blog.csdn.net/cmm0401/article/details/80464395
今日推荐