本文共 4325 字,大约阅读时间需要 14 分钟。
可以将数据传输的操作,看作一种数据流动,按照流动的方向分为输入Input和输出Output。
Java中的IO操作主要指的是Java.io包下的一些常用类的使用。这些常用类通常操作的是对数据的读取(输入Input)和写出(输入Output)。
使用总结:只要处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。
操作的是对文件的
创建:creatNewFile()、mkdir()、mkdirs()
删除:delete()
获取大小:length()
获取名称;getName()
获取路径:getAbsolutePath()、
得到文件数组:listFile()
......
按照流的方向来分
输入流和输出流
按照流动的数据类型来分
字节流和字符流
字节流
输入流:顶级父类-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);//abyte 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个结果并放到数组中。结果是abcdefghijSystem.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容10len = fis.read(b); //读取10个结果并放到数组中。结果是klmnopqistSystem.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容10len = fis.read(b); //读取6个结果并放到数组中。结果是uvwxyzSystem.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容6fis.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();
转载地址:http://ghlai.baihongyu.com/