概述:
- 什么是IO? input/output 输入输出
- Java如何处理IO?
- java把不同的输入/输出(键盘、文件、网络等)抽象描述为 "流"(stream)。
- 用相同的方式--"流"来处理 不同的输入/输出。
- 什么是"流"? 和电流、水流一样,只不过这里是数据流。
- 流的分类 (具体解释看扩展阅读)
- 输入流/输出流(流向)
- 字节流和字符流
- 字节流和字符流的转化: InputStreamReader 和 OutputStreamWriter
- java io功能强大看似复杂但实际是有规律的,它采用的是“装饰器设计模式”。
- 部分io相关类 解释: 文件流:顾名思义,提供了更加便利和强大的文件流操作。 缓冲流:增加了缓冲功能,提高了读写效率 但是注意一定要是使用flush()方法来处理缓冲区。 转换流:将字节流转换成字符流。 管道流:处理线程之间的通讯。 更多的请看java.io包
- 序列化(请关注后续文章)
程序演示:
- package com.cxyapi.io;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.FileWriter;
- import java.io.InputStream;
- import java.io.OutputStream;
- /** IO
- * @author cxy @ www.cxyapi.com
- */
- public class IoTest
- {
- public static void main(String[] args) throws Exception
- {
- writeDataToFile();
- System.out.println("-------------------------");
- readDataFromFile();
- System.out.println("-------------------------");
- copyFile("D:"+File.separator, "cxyapi.txt", "D:"+File.separator, "cxyapi复制.txt");
- }
- /**写数据到文件 站在内存角度 将内存输出到文件,所以应该用输出流
- * @throws Exception
- */
- public static void writeDataToFile() throws Exception
- {
- String filePath="d:/cxyapi.txt";
- File f=new File(filePath);
- if(!f.exists())
- {
- f.createNewFile();
- }
- OutputStream out=new FileOutputStream(f);
- String str="更多内容请访问:\r\nwww.cxyapi.com";
- byte[] buffer=str.getBytes();
- out.write(buffer);
- out.flush();
- out.close();
- System.out.println("文件写入完成");
- }
- /**从文件读取数据
- * @throws Exception
- */
- public static void readDataFromFile() throws Exception
- {
- String filePath="d:/cxyapi.txt";
- File f=new File(filePath);
- if(!f.exists())
- {
- f.createNewFile();
- }
- InputStream in=new FileInputStream(f);
- byte[] buffer=new byte[(int)f.length()];
- int len=in.read(buffer);
- in.close();
- System.out.println(new String(buffer,0,len));
- //System.out.println("完成");
- }
- /** 文件拷贝 字节流 (通用)
- * 字节流的方式和这个类似,只不过使用的是(FileReader和FileWriter),
- * 但是他只能拷贝字符文件,字节文件 会出现文件丢失数据的情况。
- * 所以为了通用 这里只展示通用的字节流方式
- */
- public static void copyFile(String fromPath,String fromFileName,String toPath,String tofileName) throws Exception
- {
- long st=System.currentTimeMillis();
- File f1=new File(fromPath+File.separator+fromFileName);
- File f2=new File(toPath+File.separator+tofileName);
- if(!f1.exists())
- {
- System.out.println("源文件不存在!");
- return;
- }
- if(!f2.exists())
- {
- f2.createNewFile();
- }
- //装饰器
- //new BufferedWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(f2))));
- BufferedInputStream br=new BufferedInputStream(new FileInputStream(f1));
- BufferedOutputStream bw=new BufferedOutputStream(new FileOutputStream(f2));
- //水桶打水的方式
- byte[] temp=new byte[256]; //“数据桶”,这个桶的大小视数据大小情况而定
- int read=0;
- while((read=br.read(temp))!=-1)
- {
- bw.write(temp,0,read);
- }
- bw.flush();
- //关闭操作应该放到finally块中,这里简单演示
- bw.close();
- br.close();
- long et=System.currentTimeMillis();
- System.out.println("拷贝完成,耗时:"+(et-st));
- }
- }
转载请加本站连接:
1.如何判断是输入流 还是输出流?
这是一个相对问题!关键是找好参照?输入输出都是从程序运行所在的内存角度来看。 我的记法: input*.read(); output*.write(); 最后你只要知道你现在是读还是写即可。2.字节流和字符流
字节流操作数据的单元是8位的字节,字符流是16位的字符。 字节流:InputStream和OutputStream作为父类。 字符流:Reader和Write作为父类。 处理文本的建议用 字符流。 处理其他的建议用 字节流。 比较通用的就是字节流。