IO流概述
可以将数据传输的操作,看作一种数据流动,按照流动的方向分为输入Input和输出Output。
Java中的IO操作主要指的是Java.io包下的一些常用类的使用。这些常用类通常操作的是对数据的读取(输入Input)和写出(输入Output)。
使用总结:只要处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。
io.File
操作的是对文件的
创建:creatNewFile()、mkdir()、mkdirs()
删除:delete()
获取大小:length()
获取名称;getName()
获取路径:getAbsolutePath()、
得到文件数组:listFile()
......
IO流的分类
按照流的方向来分
输入流和输出流
按照流动的数据类型来分
字节流和字符流
字节流
输入流:顶级父类-InputStream
输出流:顶级父类-OutputStream
字符流
输入流:顶级父类-Reader
输出流:顶级父类-Writer
字节流
输出流:顶级父类-OutputStream
将内存中的变量写到文件中
常用方法:
close() : 关闭流
flush():刷新缓冲
write(byte[] b) :写出一个字节数组的所有内容
write(byte[] b,int off ,int len) :写出一个字节数组,从off下标开始,写len个
write(int b) :虽然传的是int,当作字节使用
最常用子类:FileOutputStream,其他所有子类写出的方法都是上面的write(..)方法;
每个FileOutputStream对象就表示向某个文件输出的流管道,可以通过对象向指定文件输出内容
使用方法:
直接创建对象,没有文件自动创建文件:
1.一次写一个字节
FileOutputStream fos = new FileOutputStream("C://a.txt");//new对象
fos.write(65);//写1个字节 字节65对照askII码表对应为'A'
fos.close();//关闭流
2.一次写一个字节数组
FileOutputStream fos = new FileOutputStream("C://a.txt");//new对象
byte[] b = {65,66,67,68,69}//创建一个字节数组
fos.write(b);//写出1个字节数组
fos.close();//关闭流
3.追加模式写
FileOutputStream fos = new FileOutputStream("C://a.txt",true);//new对象,追加模式
byte[] b = {65,66,67,68,69}//创建一个字节数组
fos.write(b);//写出1个字节数组
fos.close();//关闭流
没有追加的话(append=true),每次写出都会清空原文件内容
4.一次写一个字节数组的一部分
FileOutputStream fos = new FileOutputStream("C://a.txt");//new对象
byte[] b = "ABCDEFG".getBytes();//创建一个字节数组,这里调用了字符串的getBytes()方法将字符串转换成了字节数组
fos.write(b,1,2);//写出1个字节数组的一部分,从1下标开始写,写两个元素
fos.close();//关闭流
输入流:顶级父类-InputStream
将硬盘中文件的内容读到程序中来
常用方法:
close() : 关闭流
flush():刷新缓冲
read():从文件中读取一个字节数据
read(byte[] b):将文件中的内容读取到字节数组中
最常用子类:FileInputStream
使用方法:
FileInputStream fis = new FileInputStream("C://a.txt");//创建对象,准备从C盘下的a.txt里面读内容,假设a.txt里面内容是 abcde
byte b = (byte) fis.read();//读取一个字节,返回是int类型需强转
System.out.println(b);//97 与a对应
//可以转成字符再打印
System.out.println((char)b);//a
byte b1 = (byte) fis.read();//再读取一个字节,返回是int类型需强转
System.out.println(b1);//98 与b对应
fis.close();
可以看到每次只能打印1个字节,解决办法,利用循环
FileInputStream fis = new FileInputStream("C://a.txt");//创建对象,准备从C盘下的a.txt里面读内容,假设a.txt里面内容是 abcde
while(true){
byte b = (byte)fis.read();
if(b==-1){//读到空的内容会返回-1
break;
}
System.out.println((char)b);//abcde
}
fis.close();
一次读一组字节(常用)
FileInputStream fis = new FileInputStream("C://a.txt");//创建对象,准备从C盘下的a.txt里面读内容,假设a.txt里面内容是 abcdefghijklmnopqistuvwxyz
//按照字节数组的长度进行读取
byte[] b = new byte[10];//创建个长度10的字节数组
//注意:每次读取的字节长度返回为int类型的变量
int len = fis.read(b); //读取10个结果并放到数组中。结果是abcdefghij
System.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容10
len = fis.read(b); //读取10个结果并放到数组中。结果是klmnopqist
System.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容10
len = fis.read(b); //读取6个结果并放到数组中。结果是uvwxyz
System.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容6
fis.close();
字符流
输入流:顶级父类-Reader
常用方法:
close() : 关闭流
flush():刷新缓冲
read():读取一个字符,读取一组字符,注意:返回值int,返回的是读取的字符个数,如果读到文件尾部时返回-1
最常用子类:FileReader
输出流:顶级父类-Writer
常用方法:
close() : 关闭流
flush():刷新缓冲
write():这个方案可以传的参数有字符、字符数组、字符数组的一部分、字符串、字符串的一部分
append():追加一段文字,可以一直.append
最常用子类:FileWrite
转换流
将字节流转换为(装饰为)字符流:使用了装饰者设计模式
InputStreamReader :将字节输入流转换为字符输入流
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//将字节流转换为字符流
FileInputStream fis = new FileInputStream("D://a.txt");//假设这行代码是你从服务器获取到的字节流数据
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//参数1:是需要转换的对象,参数2:可以指定编码格式
while (true){
int c = isr.read();//read方法返回int类型,代表读取的字符个数,如果为-1,代表已经读完
if (c == -1){
break;
}
System.out.println((char) c);
}
}
}
OutputStreamWrite :将字节输出流转换为字符输出流
public class OutputStreamWriteDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("D://a.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
osw.write("床前明月光");
osw.flush();
osw.close();
}
}
方法2:采用打印流转换---PrintWriter
(字符输出)打印流
printStream
PrintStream printStream = new PrintStream("D://a.txt");
printStream.println("哈哈哈");
printStream.println("嘿嘿嘿");
PrintWriter----需要flush()刷新缓存
PrintWriter printWrite = new PrintWriter("D://a.txt");
printWrite.println("哈哈哈哈");
printWrite.flush();
缓存读取流
将字符输入流 转换为带有缓存 可以一次读取一行的缓存字符读取流
BufferedReader
可以读取一行字符 readLine();