1.前言:
又开始投放博客了,堆积了大半年的笔记又要开始整理整理发博客了!刺激
还有CSDN的代码模块真的让我很不爽,请复制到文本里面观看。。。。。
2.本文的主要内容是:
- 2.0 IO流体系图
- 2.1 IO流的概念,分类,父类
- 2.2 IO流的读取-FileInputsileInputStream
- 2.3 IO流的读取返回值为int的原因
- 2.4 IO流的写-FileOutputStream
- 2.5 文本的拷贝-FileInputStrem,FileOutputStream
- 2.6 IO流的高效读取和高效写
- 2.7 IO流的BufferedInputStream,BufferedOutputStream
- 2.8 close和flush方法的区别
- 2.9 1.7版本的IO流异常处理
3.正文开始咯~~~~~~~~~
3.0 IO流的体系图(用的别人的):
3.1 IO流的概念,分类,父类
* 1.概念
* IO流用来处理设备之间的数据传输
* Java对数据的操作是通过流的方式
* Java用于操作流的类都在IO包中
* 流按流向分为两种:输入流,输出流。
* 流按操作类型分为两种:
* 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
* 字符流 : 字符流只能操作纯字符数据,比较方便。(对于纯文本只读或者只写操作)
* 2.IO流常用父类
* 字节流的抽象父类:
* InputStream
* OutputStream
* 字符流的抽象父类:
* Reader
* Writer
* 3.IO程序书写
* 使用前,导入IO包中的类
* 使用时,进行IO异常处理
* 使用后,释放资源
* 遵循晚开早关的好习惯(关于流)
3.2 IO流的读取-FileInputStream
- 首先你要在项目里面创建一个aaa.txt文本,在里面写入随意的非中文信息。如 I love you ,my mather!
- 然后代码如下(使用read方法为一个字节一个字节的读):
public static void fileinputTest() throws IOException {
FileInputStream fis = new FileInputStream("aaa.txt");//此处有文件找不到异常
int b ;
while((b=fis.read())!=-1){ //此处有文件不能读异常
System.out.print((char)b);
}
fis.close();
}
值得注意的是:
* 需要抛出异常,但单纯的将异常抛给别人是一个不怎么道德的行为,所以下面会写如何自己处理异常。
* 这里的aaa.txt是可读的,且在本项目下,所有不需要加其他盘路径。如果不是在本项目下,请加上全路径。
如"E:\\project\\java\\SE\\aaa.txt"。windows的文件都是可读可写的,所以不需要担心,但是linux下就有所不同。
3.3 FileInputStream的read方法的返回值为int的原因:
如果你注意到了fis.read()方法我用的是 int b 接收的。你需要想想文本的读取是如何结束的?以及为何要求aaa.txt里面是非中文?
* 因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111。那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类。
* 非中文是因为,中文在java中代表两个字节。就算是两个字节连着读,你中文总有空格吧,总有标点符号吧。稍微一点点移位,后面可能就全变样了。因为编码表里面,不同的二进制可是代表不同的字母或者中文。中文是由字符流来处理的。
3.4 IO流的写- FileOutputStream
public static void fileTest() throws FileNotFoundException, IOException {
//1.创建文件:
FileOutputStream fos = new FileOutputStream("bbb.txt");//如果bbb没有则创建文件,有bbb.txt则清空存入
Scanner scanner = new Scanner(System.in);
System.out.println("请输入英文:");
//2.写入文件
while(true){
String line = scanner.nextLine();
if("quit".equals(line)) //遇到quit就停止写入
break;
fos.write(line.getBytes());
fos.write("\r\n".getBytes());//在windows下输入换行符
}
//3.读出文件(一个字节一个字节的读
FileInputStream fis = new FileInputStream("bbb.txt");//创建一个接受对象,并且关联bbb.txt
int b ;
while((b=fis.read())!=-1){
System.out.println(b);
}
}
3.5 文本的拷贝-FileInputStream,FileOutputStream
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("copyaaa.txt");
int b;
while((b=fis.read())!=-1){
fos.write(b);
}
fis.close();
fos.close();
}
3.6高效的读出或者写入-小数组
上面所用的都是小的文本,如果你考一个电影45M或者更多,效率是很慢的。下载电影过慢的软件你是绝对不会用的。
数组大小一般规定为1024的整数倍,不要太大咯(手动滑稽)因为会造成java的内存溢出哟~~~
代码;
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("copy.txt");
byte[] arr = new byte[3];
int len;
while((len = fis.read(arr))!=-1)
{
fos.write(arr);
}
System.out.println("拷贝完毕");
//4.关闭资源
fis.close();
fos.close();
值得注意的是java还给我们提供了write(b,0,len)这个方法,他存在的意义是啥?
采用上面代码执行的过程是这样的,我们姑且把aaa.txt里面的内容为:abcd
那么他存在的问题,就用红色的标识出来了。他只是覆盖arr数组,但是没有被覆盖到的也拷贝到copy.txt里面了。
所以我们需要用到write(b,0,len)这个方法。仅仅改变一下上面的代码就好了。
fos.write(arr,0,len);
3.7 IO流的BufferedInputStream,BufferedOutputStream
BufferedInputStream是java给你的,他是FileInputStream的子类。当然要比这个爸爸要强那么一点咯!强在哪里?
BufferedInputStrem 只能一个个赋值。然而他的好处是啥?他和我们之前说的小数组谁更快?
bufferedInputStream 是从硬盘上一次性拿8*1024的字节(形成一个缓冲区),然后在内存中一次次赋值。所以免去了内存从硬盘一次读一个然后进行赋值的工作。内存的速度总比硬盘上快吧。
当小数组的大小为8*1024时,定义小数组会略胜一筹,因为读和写操作的是同一个数组 ,而Buffered操作的是两个数组。
3.8 close和flush方法的区别
如果你足够细心,你可以尝试你没有关闭流的时候,你的拷贝是否都是完全一模一样的。有的时候总缺了啥。
* flush()方法
* 用来刷新缓冲区的,刷新后可以再次写出
* close()方法
* 用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出
3.9 1.7版本的IO流异常处理
public static void fileTry() throws IOException, FileNotFoundException {
try(FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("copygg.txt");
){
int b;
while((b=fis.read())!=-1){
fos.write(b);
}
//在try()里面创建的流对象必须实现AutoCloseeable这个接口,
//如果实现了,在try后面的{}(读写代码)执行后就会自动调用,流对象的close方法将流关掉
}
}
4.后言:
好的这就是IO流的字节流的基础,革命尚未成功同志仍需努力!!!加油啊,xhy ^_^