Java IO流

简介:

Java中的I/O流主要定义在java.io包中,该包下定义了很多类,其中有4个类为流的顶级类,分别为InputStream和OutputStream,Reader和Writer。
在这里插入图片描述
InputStream是一个抽象类,是所有输入字节流的父类。
OutputStream 是所有的输出字节流的父类,它是一个抽象类。
字节流和字符流的区别:

  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
  • 字节流一次读入或读出是8位二进制。
  • 字符流一次读入或读出是16位二进制。

字节流

定义: 在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流。
说明:
字节流是程序中最常用的流。
在JDK中,所有的字节输入流都继承自InputStream,所有的字节输出流都继承自OutputStream。
用字节流copy文件

FileInputStream in = new FileInputStream("source/src.jpg");
    FileOutputStream out = new FileOutputStream("target/dest.jpg");
    int len = 0;
    while ((len = in.read()) != -1) {			
            out.write(len);
    }
    System.out.println("花费时间为:"+(endTime-beginTime) +"毫秒");
    in.close();
    out.close();
    
//使用字节缓冲区copy文件
FileInputStream in = new FileInputStream("source/src.jpg");
    FileOutputStream out = new FileOutputStream("target/dest.jpg");
    int len = 0;
    byte[] buff = new byte[1024];
    while ((len = in.read(buff)) != -1) {
          out.write(buff,0,len);
    
    System.out.println("花费时间为:"+(endTime-beginTime) +"毫秒");
    in.close();
    out.close();

字节缓冲流
说明: 除了定义字节缓冲区来提高文件拷贝效率外,IO中还提供了两个字节缓冲流来提高文件拷贝效率 BufferedInputStream和BufferedOutputStream 它们的构造方法中分别接收InputStream和OutputStream类型的参数作为对象,在读写数据时提供缓冲功能。
在这里插入图片描述

BufferedInputStream bis = new BufferedInputStream(
				new FileInputStream("source/src.jpg"));
    BufferedOutputStream bos = new BufferedOutputStream(
			                new FileOutputStream("target/dest.jpg"));
    int len = 0;
    long beginTime = System.currentTimeMillis();
    while ((bis.read()) != -1) {
            bos.write(len);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("花费时间为:"+(endTime-beginTime) +"毫秒");
    bis.close();
    bos.close();

在用字节流写入字符串时,需要用到getbytes()方法。

public class Demo1 
{
public static void main(String[] args) throws IOException
{
	FileOutputStream fos=new FileOutputStream("d:\\java\\test.txt",true);
	FileInputStream fis=new FileInputStream("d:\\java\\test.txt");
	try{
		
	fos.write("Hello".getBytes());
	
	int len=0;
	while((len=fis.read())!=-1)
		{
		System.out.print((char)len);
		}
	}catch(IOException e)
	{
		e.printStackTrace();
	}
	finally
	{
		fos.close();
		fis.close();
	}
}
}

字符流

说明: 除了字节流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader和Writer。

字符流 操作文件

FileReader fileReader = new FileReader("reader.txt");
    int len = 0;
    while ((len = fileReader.read()) != -1) {
          System.out.print((char)len);
    }
    fileReader.close();

字符缓冲区

public static void main(String [] args) throws IOException
{
	FileReader reader=new FileReader("E:\\纸牌.txt");
	FileWriter writer=new FileWriter("D:\\java.txt");
	 int len = 0;
	    char[] b = new char[1024];
	    while ((len = reader.read(b)) != -1) {
	          writer.write(b, 0, len);
	    }
reader.close();
writer.close();
}

字符缓冲流
字符缓冲流需要使用 BufferedReader和BufferedWriter,其中BufferedReader用于对字符输入流进行操作,BufferedWriter用于对字符输出流进行操作。在BufferedReader中有一个 readLine() 方法,用于一次读取一行文本。

BufferedReader br = new BufferedReader(new FileReader("reader.txt "));
    BufferedWriter bw = new BufferedWriter(new FileWriter("writer.txt"));
    String str = null;
    while ((str = br.readLine()) != null) {
          bw.write(str);
          bw.newLine();
    }
    br.close();
    bw.close();

转换流
说明: 在JDK中,提供了两个类用于实现将字节流转换为字符流,它们分别是 InputStreamReader和OutputStreamWriter。
InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符输入流,方便直接读取字符。
OutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。
在这里插入图片描述

 FileInputStream in = new FileInputStream("reader.txt");
    InputStreamReader isr = new InputStreamReader(in);//将字节流转换为字符流
    BufferedReader br = new BufferedReader(isr); //再将字符流加到缓冲区  
   FileOutputStream out = new FileOutputStream("writer.txt");//输出流同理
    OutputStreamWriter osw = new OutputStreamWriter(out);
    BufferedWriter bw = new BufferedWriter(osw); 
    String line = null;
    while ((line = br.readLine()) != null) {
          bw.write(line); 
          bw.newLine();
    }
    br.close();
    bw.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值