一、IO类的基本知识
1、字节流可以读文本文件和非文本文件
2、字符流只能读文本文件
3、当输出流到文件时,如果文件不存在,会自动创建文件;当文件存在时,会自动覆盖掉之前的文件。
4、节点流只有FileInputStream、FileOutputStream、FileReader、FileWriter这四个。其他的全是处理流。
5、当关闭输入流或者输出流的时候,只关闭最外层的流就可以了
二、File类(此对象对应着文件或者文件目录):
File file = new File(""); //这个文件目录是相对于System.getProperty("user.dir")这个路径来说的 File file2 = new File("/"); //这个文件目录就是绝对路径,根目录
File类注意事项:同一级文件系统下不允许同时存在相同名字的目录或文件,目录名和文件名不能相同(带后缀的目录“root.txt”和文件“root.txt”也不能同时存在),但是root.txt和root可以同时存在,因为“root.txt”和“root”会被判断两个不同的名字;即如果文件系统下有root目录,那么在这里名为root的文件是创建不出来的,如果文件系统下有root文件,那么在这里名为root的目录是创建不出来的。
1、createNewFile创建文件
2、exists文件是否存在
3、FileInputStream文件输入的流
4、getAbsolutePath获取绝对路径
5、toPath
三、IO流
1、抽象基类
InputStream,OutputStream,Writer,Reader
2、节点流
FileInputStream,FileOutputStream,FileWriter,FileReader,ByteArrayInputStream(需要用缓冲流包装),ByteArrayOutputStream(这个不需要缓冲流包装)
3、处理流(包装节点流)
(1)缓冲流(四个)
缓冲流的原理:本质上也是一个阻塞操作,只不过阻塞的次数比较少而已,因为它一次性读的数据比较多(8192)。
① BufferedInputStream
BufferedOutputStream-->flush
BufferedReader-->readLine
BufferedWriter-->flush
② flush的使用
flush如果缓冲区不满,强制输出。如果缓冲区满了的话,就会自动输出,就不用flush了。close方法也会强制输出。
(2)转换流(缓冲流包装转换流,转换流包装节点流)
InputStreamReader 字节数组转换成字符串
OutputStreamWriter 字符串转换成字节数组
(3)标准输入流
System.in是个字节流
(4)打印流(包装节点流)
PrintStream
(5)数据流(包装节点流)
数据流(针对基本数据类型,字符串,字节数组)
DataOutputStream
DataInputStream
(6)对象流(包装节点流)
①这个对于static、transient修饰的属性是不起作用的
②序列化的对象必须实现Serializable
③显示定义SerializableID。首先,一是为了区分同一类的不同版本。其次,另一个是通过这个号识别那些文件属于一个类只是版本不同而已
ObjectOutputStream
ObjectInputStream
(7)随机访问文件流(单独使用)
RandomAccessFile
二、java io方式读取字符串
public static void main(String[] args) throws Exception{ File file = new File("test.txt"); Reader is = new FileReader(file); char[] buffer = new char[10]; StringBuffer str = new StringBuffer(); int len = 0; while((len=is.read(buffer))!=-1) { System.out.println(len); str.append(buffer,0,len); } System.out.println(str); System.out.println(Charset.defaultCharset()); is.close(); }
参考文献
java IO流:https://www.cnblogs.com/ningvsban/p/3600185.html