一.字节流
字节流分为 输入字节流和输出字节流,其中输入字节流对应着read,读取文件内容,字节输出流对应着write,向文件中写入,这里可以比喻成读书,知识就进入了脑海,所以是InputStream,写字是将脑海中的知识写出,所以是OutputStream。
在使用字节流时,不能直接使用,通常要经过处理流(这里涉及到装饰者模式)
装饰者模式:
演示:
/**
* 一切都可以是字节流(inputStream,outputStream);
* 还有字符流(read,write),字符流也可以看为是字节流
* 字符流一般处理字符集的文件,而字节流所有都可以处理
* 字节流需要处理流才有用(比如FileInputStream)*/
public class IOTest {
public static void main(String[] args) throws IOException {
InputStream is =null;
//第一步选择源
File file = new File("test.txt");
try {
//第二步选择流
is= new FileInputStream(file);
//第三步操作
byte[] bytes=new byte[1024];//1k1k的进行读取
int len=-1;
//这里会将读取的长度赋值给len并将读取的元素赋值给
// bytes,当没有元素的时候读到的是-1
while ((len=is.read(bytes))!=-1){
String s=new String(bytes,0,len);
System.out.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//第四步释放资源
if(is!=null){
is.close();
}
}
}
}
public class OSTest {
public static void main(String[] args) throws IOException {
//第一步寻找源
File file=new File("test.txt");
FileOutputStream os =null;
try {
//第二步选择流,后面的append是选择是否在原有的基础上追加内容
os=new FileOutputStream(file,true);
//第三步操作
String s="hell world";
byte[] bytes=s.getBytes();//字符串转化成byte类型的数组
os.write(bytes,0,s.length());
os.flush();//每次写完刷新一下
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//第四步释放资源
if(os!=null) os.close();
}
}
}
除了字节流,还有字符流,字符流适用于直接读取文本内容,更方便快捷:操作上有一点的小差异
public class ReaderTest {
public static void main(String[] args) throws IOException {
File file = new File("test.txt");
FileReader re =null;
try {
re= new FileReader(file);
char[] chars=new char[1024];
int len=-1;
while((len=re.read(chars))!=-1){
String s=new String(chars,0,len);
System.out.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(re!=null) re.close();
}
}
}
public class WriteTest {
public static void main(String[] args) {
File file = new File("test.txt");
Writer wr =null;
try {
wr=new FileWriter(file,true);
String s="我一路向北";
/*第一种写法
char[] chars = s.toCharArray();字符串转化为字符数组
wr.write(chars,0,chars.length);
*/
/* //第二种写法直接写入
wr.write(s);
wr.flush();*/
/*第三种写法*/
wr.append("xij").append("xasda");
wr.flush();//必须要刷新,不然会操作失败
} catch (IOException e) {
e.printStackTrace();
}
}
}
缓冲流:用于提高效率,直接将原来的处理流套上即可,操作没什么改变:
/**
* 字节输入缓冲流,只要将字节输出流放进构造里即可,操作还是和原来一样
* 知识效率变高*/
public class BufferIS {
public static void main(String[] args) {
File file = new File("test.txt");
FileInputStream is =null;
try {
is=new FileInputStream(file);
BufferedInputStream BufferIS = new BufferedInputStream(is);
int len=-1;
byte[] bytes = new byte[1024];
while((len=BufferIS.read(bytes))!=-1){
String s=new String(bytes,0,len);
System.out.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
缓冲字节输出流:
/**
* 字节输出缓冲流,只要将字节输出流放进构造里即可,操作还是和原来一样
* 知识效率变高*/
public class BufferOS {
public static void main(String[] args) throws IOException {
File file = new File("test.txt");
FileOutputStream os =null;
BufferedOutputStream BufferOS =null;
try {
os= new FileOutputStream(file);
BufferOS= new BufferedOutputStream(os);
String s="woyiluxiangbei";
byte[] bytes = s.getBytes();
BufferOS.write(bytes,0,s.length());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
BufferOS.close();
}
}
}
还有字符缓冲流,但是在原有的基础上提供了更加便利的方法,使操作更加简便:
在使用时候一定要注意不能使用多态!!!!
BufferReader提供了readLine()方法可以整行读取,不用再像原来那样麻烦
/**
* 字符缓冲流,只要在原有的基础上套一层,就可以提高性能,
* 操作一样*/
public class BReader {
public static void main(String[] args) throws IOException {
/* 第一种写法,只是普普通通的加上缓冲,但没有用新方法
File file = new File("test.txt");
Reader reader = new BufferedReader(new FileReader(file));
int len =-1;
char[] chars = new char[1024];
while((len=reader.read(chars))!=-1){
String s = new String(chars, 0, len);
System.out.println(s);
}*/
//第二种采用新方法
File file = new File("test.txt");
//不能使用多态,即不能使用Reader reader=null
BufferedReader reader = new BufferedReader(new FileReader(file));
String s=null;
while ((s=reader.readLine())!=null){
System.out.println(s);
}
}
}
而BufferedWriter则提供了newLine()进行换行
/**
* 字符缓冲流,提高效率*/
public class BWriter {
public static void main(String[] args) throws IOException {
/* 第一种写法:没有用到新方法,只是在原有的基础上加缓冲流
File file = new File("test.txt");
Writer writer = new BufferedWriter(new FileWriter(file));
String s="World";
writer.write(s);
writer.flush();*/
//第二种写法,注意不能使用多态,即不能使用Writer w=null
File file = new File("test.txt");
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.append("Hello");
writer.newLine();//新方法,无需在用/r/n进行换行,这个就代表换行
writer.append("World");
writer.flush();
}
}
还有转化流:InputStreamReader,可以提供字符集
public class Inreader {
public static void main(String[] args) {
//InputStreamReader将字节流转化为字符流操作
InputStreamReader isr = new InputStreamReader(System.in);
//加入缓冲
BufferedReader reader = new BufferedReader(isr);
OutputStreamWriter osw = new OutputStreamWriter(System.out);
//加入缓冲
BufferedWriter writer = new BufferedWriter(osw);
try{
String msg="";
while (!msg.equals("exit")){
msg=reader.readLine();
writer.write(msg);
writer.newLine();
writer.flush();
}
}catch (Exception e){
}
}
}
OutputStreamWriter:
public class OutWriter {
public static void main(String[] args) throws IOException {
File file = new File("test.txt");
FileOutputStream osm =null;
OutputStreamWriter osw =null;
BufferedWriter writer =null;
try {
osm= new FileOutputStream(file);
//将字节流转化为字符流并指定字符集
osw= new OutputStreamWriter(osm,"UTF-8");
writer= new BufferedWriter(osw);
String s="我一路向北";
writer.write(s);
writer.flush();//记住要刷新
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(writer!=null) writer.close();
if(osw!=null) osw.close();
if(osm!=null) osm.close();
}
}
}
打印流:
/**
* 打印流*/
public class PWriter {
public static void main(String[] args) throws FileNotFoundException {
PrintStream ps=System.out;
ps.println("xx");
ps=new PrintStream(new BufferedOutputStream(new FileOutputStream("test.txt")),true);
ps.println("Hello jay");
ps.flush();//可以设置自动刷新
//第二个打印流
PrintWriter pw=new PrintWriter(new BufferedOutputStream(new FileOutputStream("test.txt")),true);
pw.print("asfka");
pw.flush();
}
}
字节数组流:在网络编程的时候有需要
数据流:专门操作基本数据类型,字符串的
对象流:不仅可以操作基本数据类型,还可以操作对象,操作的对象必须序列化
/**
* 操作对象的流,除了可以操作基本数据类型,还可以操作对象,其构造函数需要一个字节流*/
public class ObjectISOS {
public static void main(String[] args) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeInt(1);//对象数组流同样可以操作基本数据类型
person person = new person("jr",2);
oos.writeObject(person);//写入对象
oos.flush();
byte[] bytes = bos.toByteArray();
//读取
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
int i = ois.readInt();//同样按照上面写入的顺序读取
person o = (TestISOS.person) ois.readObject();
System.out.println(o.getName()+"==>"+i);
}
}
class person implements Serializable{
private transient String name;//transient关键字修饰的属性不会被序列化
private int age;
public person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}