就是Input和Output,通过IO可以完成硬盘文件的读和写。
输入(Input)、读(Read)、输入流(InputStream):从硬盘到内存中。
输出(Output)、写(Write)、输出流(OutputStream):从内存到硬盘中。
以内存作为参照物,按照流的方向分类:
按照读取数据的不同进行分类:
四个分支:
java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
java.io.Reader 字符输入流
java.io.Writer 字符输出流
以上都是抽象类,都实现了Closeable接口。
结论:以”Stream“结尾的都是字节流,以”Reader“和”Writer“结尾的都是字符流。
用完了流:一定要用close关闭流。
输出流都实现了Flushable接口,都是可刷新的。所以在输出流最终输出之后,一定要使用flush()对管道进行清空管道。
文件专属:
FileInputStream
FileOutputStream
FileReader
FileWriter
转换流(将字节流转换成字符流):
InputStreamReader
OutputStreamWriter
缓冲流:
BufferedReader
BufferedWriter
BufferedInputStream
BufferedOutputStream
数据流专属:
DataInputStream
DataOutputStream
标准输出流:
PrintWriter
PrintStream
对象专属流:
ObjectInputStream
ObjectOutputStream
将磁盘文件以字节方式读入内存(即程序中使用)中。
构造方法:
常用方法:
代码如下:
public static void main(String[] args) { FileInputStream in = null; try { in = new FileInputStream("C:\\Users\\Administrator\\Desktop\\实验.txt"); int data = 0; while ((data=in.read()) != -1){ //in.read()方法返回的是int类型,返回的为字节的ascii码,如果没有字节则返回-1 System.out.println(data); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //防止输入流为空。只有不为空时才可以关闭 if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } }
注意:IDEA默认路径是工程的根路径。
使用byte数组读取
public class IOTest02 { public static void main(String[] args) { FileInputStream in = null; try { in = new FileInputStream("C:\\Users\\Administrator\\Desktop\\实验.txt"); byte[] bytes = new byte[4]; int dataCount = 0; while ((dataCount=in.read(bytes)) != -1){ //dataCpunt为byte数组读取到的字节数,有多少个输出多少个 System.out.print(new String(bytes,0,dataCount)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //防止输入流为空。只有不为空时才可以关闭 if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
构造方法:
常用方法:
len
字节从位于偏移量 off
的指定字节数组写入此文件输出流。代码如下:
public static void main(String[] args) { FileOutputStream out = null; try { out = new FileOutputStream("myfile",true); // byte[] bytes = {97,98,99}; String str = "噼里啪啦"; byte[] bytes = str.getBytes(); out.write(bytes); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
利用输入输出流进行复制
代码如下:
public static void main(String[] args) { FileInputStream in = null; FileOutputStream out = null; byte[] bytes = new byte[1024*1024]; try { in = new FileInputStream("E:\\team work\\主方程建模\\主方程运算.pdf"); out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\主方程运算.pdf"); int dataCount = 0; while((dataCount = in.read(bytes))!=-1){ out.write(bytes,0,dataCount); } } catch (IOException e) { e.printStackTrace(); }finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if(out !=null){ try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
将磁盘文件以字符方式读入内存(即程序中使用)中。只能读取文本文件。
构造方法:
常用方法:
``
public static void main(String[] args) { FileReader reader = null; try { reader = new FileReader("C:\\Users\\Administrator\\Desktop\\实验.txt"); char[] c = new char[1024*512];//1MB int dataCount = 0; while((dataCount = reader.read(c))!=-1){ System.out.print(new String(c,0,dataCount)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
构造方法:
常用方法:
复制:通过字符流复制,只能对文本文件进行复制。