初学者对于I/O流的小节-上
来源:互联网 发布:同望预算软件 编辑:程序博客网 时间:2024/06/09 02:05
我是一个刚刚进入java开发的菜鸟,java 基础比较薄弱,面试的路程也经历坎坷。带着这样的心态,我总结了这个关于java io 的文章,肯定覆盖面不全,但是肯定都是最基础最实用的。
第一章 初步认识 输入输出流 I/O流
第一步 流是什么 ?
流是对于信息的一个抽象!
站在程序的角度上讲 输入流 是读取数据
站在程序的角度上讲 输出流 是写入数据
第二步 流 分两种
(1)字节流 用于译字节为单位的输入输出,主要是用于处理 图形声音文件
InputStream 这是所有字节输入流的 父类
OutputStream 这是所有字节输出流的 父类
(2)字符流 以字符为基本处理的单位 ,主要用于处理文本类型文件
Reader这是所有字节输入流的 父类
Writer这是所有字节输出流的 父类
第三步 操作文件
File 类 它既可以代表一个资源文件 也可以代表一个文件夹!
介绍几个常用的方法 getPath() getName() isFile() exists() createNewFile() mkdir()
对于文件的方法可以对文件进行各种操作,唯独不能对其内容进行操作
public class FileDemo { public static void main(String[] args) { //创建一个file 对象 指向 一个文件或者目录 文件或者目录不一定存在 File file = new File("d:"+File.separator+"a.txt");//separator 是分割符的意思 // if(!file.exists()) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("文件绝对路径"+file.getAbsolutePath()); long lastmodifile = file.lastModified(); DateFormat df = new SimpleDateFormat("yyyy年MM月dd日"); String lastdate = df.format(new Date(lastmodifile)); System.out.println("最后修改的日期 "+lastdate); File file2 = new File("c://hellword "); if(!file2.exists()) { file2.mkdir();//创建一个目录 } }}
**
第二章 字节流
**
首先是输入流 读取到文件内容 并且打印
public static void read(){ File file = new File("d://ceshi.txt");// 首先先创建一个文件 try { //创建一个字节输入流 InputStream input = new FileInputStream(file); byte[] bytes = new byte[1024*1024]; //因为是字节输入流 所以只能用字节的方式去读取数据 // byte 数组 的大小就是没次读取的长度 这里我设置的比较大//如果把里面的参数设置为1 的话 代表的意思是每次读取一个字节 这样读取中文会出问题 int len = -1; StringBuffer buffer = new StringBuffer();//创建一个StringBuffer 来接收读取的数据 while((len =input.read(bytes))!=-1) //当读取的长度不等于-1 代表没有读取完的时候 继续读取 { buffer.append(new String(bytes,0,len)); } input.close(); //养成一个用完流就关闭的好习惯 System.out.println(buffer); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
接下来是输出流 想文件写入内容
public static void write(){ File file = new File("d://ceshi.txt"); if(file.exists()==false) { try { file.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { OutputStream out = new FileOutputStream(file); String xieshu ="输入写入的内容 "; //写入数据 因为这里面是字节流 所以 要把我写入的字符串转换成字节的形式去写入 out.write(xieshu.getBytes()); out.close();//释放资源 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
第三章 字符流
首先是字符输入流 reader
public static void read(){ File file = new File("d://asdcd.txt");//和字节流一样 首先要构造一个文件 try { Reader reader = new FileReader(file); //创建一个读取reader char[] c = new char[10]; //这里面传入的不是字节 是字符了 int len = -1; StringBuffer buffer = new StringBuffer(); //下面实现思路与字节流的读取一样 while((len =reader.read(c))!=-1) { buffer.append(new String(c,0,len)); } reader.close(); System.out.println(buffer); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
下面是字符输出流
public static void write(){ File file = new File("d://asdcd.txt"); try { Writer out = new FileWriter(file); String xieshu ="你好 , world"; //写入数据 out.write(xieshu); //这里想对于这个字节输入流而言 直接向文件输出字符串即可 out.close();//释放资源 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
**
第四章 缓冲流
**
计算机访问外部设备非常耗时。访问外存的频率越高,造成CPU闲置的概率就越大。
为了减少访问外存的次数,应该在一次对外设的访问中,读写更多的数据。
为此,除了程序和流节点间交换数据必需的读写机制外,还应该增加缓冲机制。缓冲流就是每一个数据流分配一个缓冲区,一个缓冲区就是一个临时存储数据的内存。这样可以减少访问硬盘的次数,提高传输效率。
下面分别是加上缓冲流之后的字符输入输出流 、 字节输入输出流
/** * 字符输出流 */ public static void zifuout() { try { Writer writer = new FileWriter("D:\\ceshi.txt"); BufferedWriter bufferwriter = new BufferedWriter(writer); bufferwriter.write("测试字符缓冲流"); bufferwriter.close(); writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 字符输入流 */ public static void zifuin() { String result; try { Reader reader = new FileReader("D:\\ceshi.txt"); BufferedReader bufferedReader = new BufferedReader(reader); result = bufferedReader.readLine(); bufferedReader.close(); reader.close(); System.out.println(result); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 用字节输出流 */ public static void bufferout() { try { OutputStream out = new FileOutputStream("D:\\a.txt"); BufferedOutputStream bufferout = new BufferedOutputStream(out); bufferout.write("测试用字节缓冲流写入文件 ".getBytes()); bufferout.close(); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 用字节输入流 */ public static void bufferin() { try { InputStream in = new FileInputStream("D:\\a.txt"); BufferedInputStream bufferin = new BufferedInputStream(in); int len= -1; byte[] bytes =new byte[1024*1024]; StringBuffer result = new StringBuffer(); while((len=bufferin.read(bytes))!=-1) { result.append(new String(bytes,0,len)); } bufferin.close(); in.close(); System.out.println(result); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
通过上面的例子 我们还可以发现,当我们 无论是给字符 还是字节输入输出流套上一层缓冲流的时候,当我们用缓冲流对象进行读写的时候,会多一些方法! 比如readline() 等一写常见好用的方法!所以 建议以后再写流的时候一定要套上缓冲流
第五章 其他常见的流
- 打印流
推荐一个很好用,很常用的输出流 — 打印流
/** * PrintStream 字节打引流 */ public static void shuchu(){ try { OutputStream out = new FileOutputStream("D:\\a.txt"); BufferedOutputStream bos = new BufferedOutputStream(out); //bos.write("写入的内容".getBytes());//原来的方法 PrintStream ps = new PrintStream(bos); ps.println("写入的内容");//用打印流之后的方法 bos.close(); ps.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 字符打印流 Print Writer */ public static void shuchu2(){ try { Writer writer = new FileWriter("D:\\a.txt"); BufferedWriter bufferedWriter = new BufferedWriter(writer); PrintWriter printWriter = new PrintWriter(bufferedWriter); printWriter.print("写入的内容"); printWriter.close(); bufferedWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
- 数据流
public static void DataOut(){ try { OutputStream out = new FileOutputStream("d:\\a.txt"); DataOutputStream dos = new DataOutputStream(out); dos.writeInt(10);// 按照数据 类型 去写 dos.writeUTF("测试数据流 "); dos.close(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void DataIn(){ try { InputStream in = new FileInputStream("d:\\a.txt"); DataInputStream dis= new DataInputStream(in); int a =dis.readInt(); //按照数据类型去读 String asd= dis.readUTF(); dis.close(); in.close(); System.out.println(a+asd); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
- 字符串流
public static void StringStream() { String s = "需要解析的文件"; StringReader reader = new StringReader(s); //这样就 可以 用 流的方式去读取 }
当我们从网上截取一段报文 一段文字 一段密文 需要用流的形式去解析的时候 字符串流是一个不二选择,不会抛出任何IO异常
- 字节数组流
/** * 在内存中操作 */ public static void bytearryStream(){ String info = "字节数组流测试"; ByteArrayInputStream bis = new ByteArrayInputStream(info.getBytes()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); int i =-1; while((i=bis.read())!=-1) { bos.write(i); } //可以把一个图片的数据写进去 这个 ByteArray里面 System.out.println(bos.toString()); }
这个流的特点是在内容当中操作 与外部文件 无关,且不会产生IO异常
此文章为自己总结 ,欢迎大家改正批评! 不喜勿喷
- 初学者对于I/O流的小节-上
- 初学者对于I/O流的小节-下
- 对于I/O流的理解
- 对于java i/o流的看法
- 初学者说i/o流
- 对于I/O操作的部分整理
- 对于I/O完成端口机制我的理解
- Google I/O 2015对于开发者的福利
- java的I/O流
- java的I/O流
- I/O 流的使用
- I/O流的用法
- Java的I/O流
- 标准的I/O流
- Java的I/O流
- C++的I/O流
- I/O流的分类
- Java的I/O流
- flex中将一个数组分割成多个小数组
- Solr/Lucene MMapDirectory的小细节
- ACM课程总结
- mysql日志详细解析
- 唐诗辑注 —— 辛夷坞、南园十三首、问六十九
- 初学者对于I/O流的小节-上
- 【Unity优化】关于优化方面的整理
- sphinx api 搜索 Sphinx 2.2.10-release
- 二叉树的中序遍历、递归实现、非递归实现、层次遍历、二叉树的应用,来来来,都有都有
- 顺丰BSP接口PHP开发注意事项
- 将一个媒体文件切割成多个碎片
- MySQL树形查询
- CPU简介
- [Database] 数据库事务隔离级别 2