您的位置:首页 > 编程语言 > Java开发

java Io流学习(二) 字节流

2017-08-02 11:27 155 查看

一、IO流分类

 IO流若按照流的方向可以分为:

输出流(内容从程序内存到磁盘文件的过程,即向文件中添加内容)的类:OutputStream,Writer.

输入流(内容从磁盘空间到程序内存的过程,即从文件中读取内容)的类:InputStream,Reader.

按照操作对象也可以分为:

字节流(操作对象是单个字节)的类:InputStream,OutputStream.

字符流(操作对象是单个字符)的类:Reader,Writer.

因此IO流的顶级父类就是InputStream,OutputStream,Reader,Writer,其余的流类都是继承于这4个类,因此只需要了解4个父类的属性方法,基本子类操作就没有多大问题

二、InputStream(字节输入流)

    InputStream是java所有的字节输入流的父类,其本质是一个抽象类,因此实例化父类对象的时候一般通过子类对象向上实例化,而对于InputStream的API只需要了解几个常规的即可(下面会举实例展示各个APi的作用)



1、read()方法

package com;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class Test5 {

public static void main(String[] args) throws Exception {

File file=new File("D:"+File.separator+"a.txt");//创建file对象,a.txt中的内容是"zhangsan"

//	InputStream stream=new InputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象

InputStream stream=new FileInputStream(file); //子类FileInputStream向上转型实例化父类InputStream

//read()方法,单字节读取,返回的int就是读取到的字节的int表示方式,
byte c[]=new byte[1024]; //创建字节数组,用于存储读取出来的字节
int z=0;
int x=0;
while((z=stream.read())!=-1){ //进入循环
c[x]=(byte)z; //注意要转成字节然后存放到存放到字节数组中去
x++;
}
stream.close();
System.out.println(new String(c)+"1");

}
}


2、read(byte[])方法

package com;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class Test4 {

public static void main(String[] args) throws Exception {

File file=new File("D:"+File.separator+"a.txt");//创建file对象,a.txt中的内容是"zhangsan"
//    	InputStream stream=new InputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象
InputStream stream=new FileInputStream(file); //子类FileInputStream向上转型实例化父类InputStream

//read(byte[])方法,一次读取,返回读取成功的字节个数,同时字节会读入到数组中--较为方便
byte b[]=new byte[1024];
int i=stream.read(b);
stream.close();
System.out.println(i);
System.out.println(new String(b,0,i));

}
}


3、read(byte b[],int off,int len)

package com;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class Test6 {

public static void main(String[] args) throws Exception {

File file=new File("D:"+File.separator+"a.txt");//创建file对象,a.txt中的内容是"zhangsan"

//	InputStream stream=new InputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象

InputStream stream=new FileInputStream(file); //子类FileInputStream向上转型实例化父类InputStream

//read(bytep[] b,int off ,int len)方法,从输出流中读取最多len个字节到数组中,从下表0ff开始添加数据

int len=(int)file.length();

byte[] b=new byte[1024];

int i=0;

while((i=stream.read(b, 0, len))!=-1){  //等于是多次调用read()方法,单个字节单个字节的读取,知道len个字节为止

System.out.println(new String(b));
}
stream.close();

}


   
以上3个方法运行的结果都是“zhangsan”,但是追究效率来说,建议使用read(byte[] b )方法较好,一次读入,注意在建立数组的时候的长度,可以根据流的长度来确认,避免占用较多内存

三、OutputStream (字节输出流)

    OutputStream是javaio流中所有输出流的父类,因此同上述的输入流一样,只需要了解其常用API即可(重点在write方法)

1)write(int b)方法

package com;

import java.io.*;

public class Test7 {

public static void main(String[] args) throws Exception {

File file=new File("D:"+File.separator+"c.txt");//创建file对象,注意此时我的D盘是没有c.txt的文件的

//流的操作会自动判断是否有该文件存在,若有,则进行覆盖,若没有则会新建,然后在输出内容

//	OutputStream stream=new OutputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象

OutputStream stream=new FileOutputStream(file); //子类FileOutputStream向上转型实例化父类OutputStream

//write(int b)方法,注意参数是字节的int型位数,而不是常规int

String str="hello";

byte b[]=str.getBytes();//字节输出流,要操作字节,所以把字符转成字节

for (int i = 0; i < b.length; i++) {
stream.write(b[i]);
}
stream.close();
}
}


2)write(byte[])方法

package com;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class Test8 {

public static void main(String[] args) throws Exception {
File file=new File("D:"+File.sep
4000
arator+"c.txt");//创建file对象,注意此时我的D盘是有c.txt的文件的

//流的操作会自动判断是否有该文件存在,若有,则进行覆盖,若没有则会新建,然后在输出内容

//	OutputStream stream=new OutputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象

OutputStream stream=new FileOutputStream(file); //子类FileOutputStream向上转型实例化父类OutputStream

String str="zhangsan";

byte b[]=str.getBytes();//字节输出流,要操作字节,所以把字符转成字节

stream.write(b); //一次输出整个数组

stream.close();
}
}


3)write(byteb [] ,int off,int len )

package com;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class Test9 {

public static void main(String[] args) throws Exception {

File file=new File("D:"+File.separator+"c.txt");//创建file对象,注意此时我的D盘是有c.txt的文件的

//流的操作会自动判断是否有该文件存在,若有,则进行覆盖,若没有则会新建,然后在输出内容

//	OutputStream stream=new OutputStream() //此代码会报错,因为InputStream是抽象类,不能实例化对象

OutputStream stream=new FileOutputStream(file); //子类FileOutputStream向上转型实例化父类OutputStream

String str="wagnwu";

byte b[]=str.getBytes();//字节输出流,要操作字节,所以把字符转成字节

int len=b.length-1; //少取一个字节

stream.write(b, 0, len);//等于是单个单个字节输出

stream.close();

}
}


    以上3个write()方法的结果,请自行运行查看,仔细观察会发现,三种方法的情况的话,后两种方法效率会较高(第二种一次性输出所有字节,第三种获取字节只输出想要的部分内容),另注意,输出流操作完毕后记得运行close()方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 基础知识 io流