Java学习之IO
两种分类
- 按流向分类
- 输入流:数据源到程序(InputStream、Reader)
- 输出流:程序到目的地(OutputStream、Writer)
- 按功能分类
- 节点流:直接从数据源或目的地读写数据,IO操作第一线,必须经过
- 处理流:不直接连接数据源或目的地,对其他流进行封装,提高性能或简化操作
第一个程序
//1、创建源,路径分割符使用'/'
File srcFile = new File("D:/abc.txt");
//2、选择流
InputStream is = new FileInputStream(srcFile);
//3、操作(读取)
int data1 = is.read();//不存在返回-1
//4、释放资源
is.close();
四大抽象类

节点流

处理流
- 缓冲流
- 字节输入缓冲流:BufferedInputStream(InputStream in)
- 字节输出缓冲流:BufferedOutputStream(OutputStream out)
- 字符输入缓冲流:String readLine() 读取一行
- 字符输出缓冲流:void newLine() 换行,与write方法搭配逐行读取
- 转换流
/将字节流转换成字符流,指定字符集
InputStreamReader isr = new InputStreamReader(System.in,"gbk");
//使用缓存字符流来进行读写,效率高
br = new BufferedReader(isr);
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:/abc.txt"),"gbk"));
//开始读写
String line =null;//用于存储读到的字符串
while(!"exit".equals(line=br.readLine())) {
bw.write(line);
bw.newLine();
bw.flush();
}
- 数据流
提供了可以存取所有基本数据类型和String的方法,针对字节流且是二进制的文件,写出后读取,读取顺序与写出一致- DataOutputStream(OutputStream out):void writeUTF(String str);void writeInt(int v);
- DataInputStream(InputStream in):String readUTF();int readInt();
- 打印流
- PrintStream(OutputStream out, boolean autoFlush):PrintStream ps = System.out;
- PrintWriter(OutputStream out, boolean autoFlush):自动刷新
- 随机访问
RandomAccessFile(File file, String mode)- mode:"r"读,"rw"写
- seek(long pos):文件指针偏移量
- 序列流
SequenceInputStream(Enumeration<? extends InputStream> e)
Vector<InputStream> vi = new Vector<InputStream>();
for(int i=0;i<size;i++) {
vi.add(new BufferedInputStream(new FileInputStream(destPaths.get(i))));
}
SequenceInputStream sis = new SequenceInputStream(vi.elements());
释放资源
- 集中释放
public static void close(Closeable... ios) {
for(Closeable io:ios) {
try {
if(null!=io) {
io.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- try-with-source
try(InputStream is = isr;OutputStream oStream=os) {
//在try后括号内定义的流可关闭,语法糖,编译后自动加上关闭代码
} catch (FileNotFoundException e) {
e.printStackTrace();
}

浙公网安备 33010602011771号