在学习hadoop的时候遇到了IO流,就拿出IO流的相关知识复习一遍。
IO流,顾名思义就是Input/Output流,也就是输入输出流。
关于流:
- 一种有顺序的,有起点,有终点的字节集合。
- 对数据传输的总称。
- 本质就是:数据传输。
分类
按照流向
输入流:从一个源读取数据。 输出流:向一个目标写数据。
按照数据单位
字节流:以字节为单位(8位二进制) 字符流:以字符为单位(16位二进制)
两个重要的流是FileInputStream 和FileOutputStream
两个重要的流
FileInputStream
这个流是用于从文件读取数据。比如:
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputSteam in=new FileInputStream(url);
创建好InputStream对象后,就可以使用下面的方法来读取流或者其他操作:
in.read(int r) //读取制定字节的数据,返回int值。
in.close();//关闭流
我们可以这样一个个字节的读取一个文件:
public static void main(String[] args) {
try {
//创建一个字节输入流对象
InputStream in=new FileInputStream("D:\\test.txt");
int b=-1;
while((b=in.read())!=-1)//字节读取,当为-1时读取完毕
{
System.out.print((char)b);//转化为字符输出
}
in.close();//关闭流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
这样一个个读取字节就显得速度很慢,我们可以这样一次性读取全部字节:
public static void main(String[] args) {
try {
File file=new File("D:\\test.txt");
//创建一个字节输入流对象
InputStream in=new FileInputStream(file);
//根据文件大小来创建字节数组
byte[]bytes=new byte[(int)file.length()] ;
int len=in.read(bytes);//返回读取字节的长度
System.out.println("读取字节长度为:"+len);
System.out.println("读取的内容为: "+new String(bytes));//构建成字符串输出
in.close();//关闭流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
如果我们修改上面这段代码中的byte[]bytes=new byte[(int)file.length()]
改为byte[]bytes=new byte[int m]
,也就是:
public static void main(String[] args) {
try {
//创建一个字节输入流对象
InputStream in=new FileInputStream("D:\\test.txt");
//指定每次读取的大小--可根据性能字节修改
byte[]bytes=new byte[8] ;
StringBuffer sb=new StringBuffer();
int len=-1;//每次读取的实际长度
while((len=is.read(bytes))!=-1){
sb.append(new String(bytes,0,len));
}
System.out.println("读取字节为:"+sb);
in.close();//关闭流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
这样我们就可以读取制定字节的数据了。
FileOutputStream
这是一个用来向文件中写入数据的流。
同样,我们可以这样创建FileOutputStrem对象:
OutputStream out =new FileOutputStream(url);
这个流也有一些方法来写入或者其他操作:
out.write(int w); //把制定字节写到输出流中。
out.close(); //关闭流。