JavaIO流学习之路(一)字节流

第一部分:字节流概述

概念:

  • IO流用于处理设备之间的数据传输
  • Java对数据操作是通过流的方式
  • Java用于操作流的类都在IO包中
  • 流按流向分为两种:输入流,输出流。
  • 按操作类型分为两种:
    字节流:字符流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
    字符流:字符流只能操作纯字符的数据,比较方便
  • IO流常用的父类:
    字节流的抽象父类:
    InputStream
    OutputStream
    字符流的抽象父类:
    Reader
    Writer
  • IO程序书写
    使用前:导入IO包中的类
    使用时:进行IO异常处理
    使用后:释放资源

在这里插入图片描述

第二部分:InputStream 读取数据

Read()一次读取一个字节。
代码案例:
创建目录
在这里插入图片描述
创建一个Test1.txt文件,内容如下。
在这里插入图片描述

package io;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamTest {
public static void main(String[] args) throws IOException {
	InputStream is = new FileInputStream("test1.txt");  创建字节流,文件放入
	int b; //创建b来 存放读取文件的内容
	while((b=is.read())!=-1) {
	/*b按字节读取某个文件里面的内容(这种情况是是一个字节一个字节的读取,所以当读到最后的时候,就会返回-1。*/
		System.out.println(b);
	}
	is.close();  //关闭字节流
}
}

输出结果

119
101
99
108
111
109
101
32
116
111
32
105
111
84
101
115
116

提问:为什么Read()方法返回值为int 而不是Byte类型?

1.返回值为数字的因为这里Read()方法,读取到的是每一个字母所对应的ASCII码。
2.因为字节流可以操作任意类型的文件,这些文件底层都是以二进制形式存储的,如果每次读取都返回byte的话,那么又可能遇到11111111
这个11111111是byte类型中的-1,我们的程序是遇到-1就会停止,不继续往后面读取了,所以这个应该用int,如果发现有11111111会在其前面补上24个0,凑足4个字节,那么byte的-1就会编程int 类型的255了,这样就可以保证数据读完,而结束标记-1 就是int的类型的

第三部分:OutPutStream 写入数据

代码案例:

package io;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class InputStreamTest {
public static void main(String[] args) throws IOException {
	OutputStream os = new FileOutputStream("test2.txt"); 
	os.write(111);
	os.close();
}
}

实例1:用inputStream和outputStream实现图片的拷贝

在这里插入图片描述

package io;

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

public class InputStreamTest {
public static void main(String[] args) throws IOException {
	InputStream is = new FileInputStream("img.jpg"); //原图片输入流
	OutputStream os = new FileOutputStream("copy.jpg"); //复制图片输出流
	
	int b;
	while((b=is.read())!=-1) {
		os.write(b);
	}
	is.close();
	os.close();
}
}

方法二:

这里我们会出现这样一个问题,当我们拷贝一个音频文件或者其他较大的文件的时候,我们用上述方法就显得比较缓慢,这个时候我们需要用到一个新的方法。

package io;

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

public class InputStreamTest {
public static void main(String[] args) throws IOException {
	InputStream is = new FileInputStream("img.jpg"); //原图片输入流
	OutputStream os = new FileOutputStream("copy.jpg"); //复制图片输出流
	int b =is.available(); //先读取到原文件。
	byte[] bytes = new byte[1024*8]; //标准格式。
	is.read(bytes);
	os.write(bytes);
	
	is.close();
	os.close();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值