当前位置 博文首页 > 白徽的博客:谈话之间 java I/O 字节流 灰飞烟灭
在学习 java I/O 流的时候二狗问我。
老大,我们是不是应该先熟悉一下 I/O流 的相关类呀?否则这直接就去接触,互相认不出怎么搞?
哟呼,二狗不错呀!很有见解。对,学习就像把妹一样,你一不知道人家性格,爱好是什么样的,直接冲过去说句我爱你。对方会喜欢你的概率就像彗星撞地球一般啊。
给,你先看一下,I/O流的机构图吧–I/O类结构图
二狗看了半天后说道:老大,这看了一下,我就只知道了 I/O流 分为了 字节流 和 字符流 别的没看明白。
这样就不错了,我先考考你。电脑文件里面的东西是什么形式的呀?
这我就很清楚了!字节的形式!嘿嘿
不错,那我再问你。那么电脑显示在屏幕上的是什么形式?
这。。应该不是字节形式。可能是字符型。
二狗有些不确定的到。
嗯,不错。是的电脑里面的文件使用的字节形式。而显示的时候却需要转化成字符型!毕竟电脑里面存的东西是二进制的。你总不能直接把二进制给别人看吧。
嗯嗯,对对。必须得转化。否则我直接给我女盆友看,她不得怪我弄坏了电脑。
你说什么?我没怎么听清二狗咕哝了什么。
没什么,老大,我们知道了需要转化。也知道电脑 I/O流 分为 字节 和 字符流 那这又有什么用呢?
这用处就是敲门砖啊!你看既然文件时字节形的,那么我们打开的时候也应该是字节形式的打开。就好像你女。。。咳咳,就好像你的保险箱,只有你自己能打开。别人就不行一样。打开的方法要符合它的形式。否则就没法打开又或者直接把里面的文件给毁了。
哦哦,这样我就懂了。那到底应该怎么打开呢?
咋在打开之前是不是应该需要有个变量。类型是不是应该是 字节输入输出流 也就是 InputStream 和 OutputStream 类型。那么如何打开就是个问题了。
嗯,咋们应该用字节的方式打开。嗯?这里不有个 FileInputStream 和 FileOutputStream 子类吗?是不是使用他们打开?
嗯,对。二狗,最近进步很大呀
那是。二狗得意一笑。
那么我们已经搞清楚了这些。现在去接触肯定能把到妹。。。呸,是能打出代码。
直接放代码:
边打边学
可能引起你的恐惧的代码那里已经标记好。最下面已经给你解释好了那段标记的代码。恐惧了就看一下解释。激励一下自己。
//做法一:使用InputStream接口的 int read()方法,一次读一个字节
//package cn.edu.dlnu;
import java.io.*;
public class IOStreamTest {
public static void main(String[] args) throws IOException {
//第一个害怕点
InputStream input=null;
OutputStream output=null;
input= new FileInputStream("计科136.jpg");
output = new FileOutputStream("dest.jpg");
int i=0;
while(true){
int b=input.read();
if (b==-1) break;
i++;
output.write(b);
}
System.out.println("处理完毕!"+" 共读写了"+i+"个字节");
input.close();
output.close();
}
}
/**
//做法一的改进版本,规范格式
package cn.edu.dlnu;
import java.io.*;
public class IOStreamTest {
public static void main(String[] args) throws IOException {
InputStream input= new FileInputStream("src.txt");
OutputStream output = new FileOutputStream("dest.txt");
int b=-1;
while((b=input.read())!=-1){
output.write(b);
}
input.close();
output.close();
}
}
*/
/**
//做法二:使用InputStream接口的 int read(byte[])方法,一次读若干字节
package cn.edu.dlnu;
import java.io.*;
public class IOStreamTest {
public static void main(String[] args) throws IOException {
InputStream input= new FileInputStream("src.txt");
OutputStream output = new FileOutputStream("dest.txt");
//恐惧点2
byte[] b=new byte[7];
while(true){
int length=input.read(b);
if (length==-1) break;
output.write(b,0,length); // 为啥写length?
}
input.close();
output.close();
}
}
*/
/**
//做法二的改进版本,规范格式
package cn.edu.dlnu;
import java.io.*;
public class IOStreamTest {
public static void main(String[] args) throws IOException {
InputStream input= new FileInputStream("src.txt");
OutputStream output = new FileOutputStream("dest.txt");
byte[] b=new byte[7];
int length=-1;
while((length=input.read(b))!=-1 ){
output.write(b,0,length); // 为啥写length?
}
input.close();
output.close();
}
}
/**
//读写文件更多的细节,对此有兴趣的学生,可关注 哈~~
package cn.edu.dlnu;
import java.io.*;
public class IOStreamTest {
public static void main(String[] args) throws IOException {
InputStream input= new FileInputStream("src.txt");
OutputStream output = new FileOutputStream("dest.txt");
byte[] b=new byte[7];
int length=-1;
int count=0; //统计字节总数
while((length=input.read(b))!=-1 ){
output.write(b,0,length); // 为啥写length?
//按src.txt文本编码格式,以字节形式输出文本
for(int i=count; i<length+count;i++) {
System.out.printf("b[%d]=%x ",i,(byte)b[i-count]);
}
System.out.print("\n");
count +=length;
}
System.out.printf(" The length of file: %dbyte\n", count);
input.close();
output.close();
}
}
*/
这一段
InputStream input=null;
OutputStream output=null;
input= new FileInputStream("计科136.jpg");
output = new FileOutputStream("dest.jpg");
不要怕。第一和第二行是声明一个变量,类型名字叫InputStream 和 OutputStream。然后给他赋值为空。第三行和第四行是给他new一个对象。因为是初学者,你可以认为这只不过是个开了文件而已,毕竟最后都不是关了吗!参数只不过是用来打开文件的钥匙。
如果出现这种
Exception in thread "main" java.io.FileNotFoundException: 计科136.jpg (系统找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at one.Test1.main(Test1.java:9)
是因为你没有写相对地址。什么叫相对地址?就是全部的地址。举个例子:你住在内蒙古赤峰市XX区XX单元XX号。
上代码,酱紫:
input = new FileInputStream("D:\\JAVA\\Java\\IOStream\\src\\one\\计科136.jpg");
output = new FileOutputStream("D:\\JAVA\\Java\\IOStream\\src\\one\\dest.jpg");
为什么会有这个:
byte[] b=new byte[7];
while(true) {
int lenght = input.read(b);
if(lenght == -1)break;
output.write(b,0,lenght);
}
数组的长度必须是7吗?
不是的,举个例子:我们以前搬砖一个一个的搬。感觉好麻烦。那么我们创造一个推车(数组)吧。里面放砖头(数据),那么这个推车(数组)一定要是只能放7个砖头(数据)吗?
一定不是的。你想要放多少,你自己定。只不过你需要知道这里面有几个砖头(数据),所以有了这段代码:
int lenght = input.read(b);
为什么要知道有多少呢?因为取砖头(数据)时候需要知道,所以在下面使用了这个有多少砖头(数据)的数量:
output.write(b,0,lenght);
cs