黑马程序员——Java基础——IO(二)

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


一、字节流

1.读取和输出字节

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class StreamDemo {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		output();
		System.out.println("第一种读取方法————");
		input_1();
		System.out.println("第二种读取方法————");
		input_2();
		System.out.println("第三种读取方法————");
		input_3();
	}
	
	
	public static void output() throws IOException
	{
		//创建字节输出流对象,并指定目的文件
		FileOutputStream fos = new FileOutputStream("demo.txt");
		//写数据到文件中
		fos.write("output01".getBytes());
		fos.close();
	}
	public static void input_1() throws IOException
	{
		//创建字节读取流对象,并与要读取的文件关联
		FileInputStream fis = new FileInputStream("demo.txt");
		//第一种读取方式,一次从输入流中读取一个字节数据
		int num = 0 ;
		while((num = fis.read()) != -1)
		{
			System.out.println((char)num);
		}
		fis.close();
		
	}
	public static void input_2() throws IOException
	{
		//创建字节读取流对象,并与要读取的文件关联
		FileInputStream fis = new FileInputStream("demo.txt");
		//第二种读取方式,创建一个字节数组,将读取到的字节存储到数组中
		byte[] b = new byte[1024];
		int len = 0 ;
		while((len = fis.read(b)) != -1)
		{
			System.out.println(new String(b,0,len));
		}
		fis.close();
		
	}
	public static void input_3() throws IOException
	{
		//创建字节读取流对象,并与要读取的文件关联
		FileInputStream fis = new FileInputStream("demo.txt");
		//第三种读取方式,与第二种基本相同,只是不用自定义数组长度,使用available()方法
		//返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
		//如果要读取的文件太大,不建议使用此方法,因为会使内存溢出
		byte[] b = new byte[fis.available()];
		fis.read(b);
		System.out.println(new String(b));
		fis.close();
		
	}
}



2.字节流缓冲区

通过字节流的缓冲区复制一个图像文件

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferStreamDemo {

	public static void main(String[] args)  {

		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try
		{
			bis = new BufferedInputStream(new FileInputStream("1.gif"));
			bos = new BufferedOutputStream(new FileOutputStream("2.gif"));
			byte[] b = new byte[1024];
			int num = 0 ;
			while((num = bis.read(b)) != -1)
			{
				bos.write(b,0,num);
			}
			
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(bis != null)
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			if(bos != null)
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		
	}

}


3.转换流

字节流中的数据都是字符时,转成字符流操作更高效;或者操作文本涉及到具体的指定编码表时,这就需要转换流。转换流是字符流与字节流之间的桥梁, 方便了字符流与字节流之间的操作。

InputStreamReader:字节到字符的桥梁,解码。

OutputStreamWriter:字符到字节的桥梁,编码。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public abstract class TransCodeDemo {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		write();
		read();
	}

	private static void write() throws IOException {
		
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("code.txt"),"GBK");
		osw.write("转换流编码");
		osw.close();
	}

	private static void read() throws IOException  {
		
		InputStreamReader isr = new InputStreamReader(new FileInputStream("code.txt"),"utf-8");
		char[] ch = new char[1024];
		int len = 0 ;
		while((len = isr.read(ch))!= -1)
		{
			System.out.println(new String(ch,0,len));
		}
		isr.close();
	}

}

从上面这个例子可以看出,编码表是指定在转换流的构造函数中,而且编码和解码使用的码表不同会出现错误

4.流操作规律

1)明确源和目的

源:InputStream Reader

目的:OutputStream Writer

2)明确数据是否是纯文本数据

源:是纯文本:Reader 否:InputStream

目的:是纯文本:Writer 否:OutputStream 

到这里,就可以明确需求中具体要使用哪个体系。

3)明确具体的设备

源设备:

硬盘:File

键盘:System.in

内存:数组

网络:Socket流

目的设备:

硬盘:File

控制台:System.out

内存:数组

网络:Socket流

4)是否需要其他额外功能

是否需要高效(缓冲区):是,就加上buffer

通过一个示例运用这些规律完成需求

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
/**
 * 将控制台输入的数据存入到一个txt文件中
 * 1.明确源和目的
 * 源:键盘
 * 目的:文件
 * 2.明确数据是否为纯文本文件
 * 是,使用Reader和Writer
 * 3.明确具体设备
 * 源:键盘,System.in,使用转换流
 * 目的:硬盘文件,File
 * 4.是否需要其他额外功能
 * 需要高效缓冲区:buffer
 * 
 */
public class TransStreamDemo {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new FileWriter("demo.txt"));
		
		String str = null ;
		while((str = br.readLine())!= null)
		{
			if(str.equals("over"))
				break;
			bw.write(str);
			bw.newLine();
			bw.flush();
		}

		br.close();
		bw.close();
	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值