黑马程序员——IO流(二)
2015-05-28 19:09
435 查看
------- <a href="http://www.itheima.com"
target="blank">android培训</a>、<a href="http://www.itheima.com"
target="blank">java培训</a>、期待与您交流! ----------
-学习字节流操作
字节写入流:FileOutputStream
字节输出流:FileInputStream
基本操作与字符流类相同,但它不仅可以操作字符,还可以操作其他媒体文件。
常见操作例子:
-通过字节流复制一个文本文件的例子
-学习字节流缓冲区
为了提高操作效率,字节流通过提高了字节流缓冲区技术:BufferedInputStream,BufferedOutputStream;
一个通过字节流缓冲区技术实现复制一张JPG图片文件的例子:
-System类中的字段:in,out
它们各代表了系统标准的输入和输出设备。
默认输入设备是键盘,输出设备是显示器。
System.in的类型是InputStream.
System.out的类型是PrintStream,它是OutputStream子类FileOutputStream的子类
-标准输入输出流示例:获取键盘录入数据,然后将数据流向显示器,那么显示器就是目的地。
通过System类的setIn,setOut方法对默认设备进行改变。
System.setIn(new FileInputStream(“1.txt”));//将源改成文件1.txt。
System.setOut(new FileOutputStream(“2.txt”));//将目的改成文件2.txt
因为是字节流处理的是文本数据,可以转换成字符流,操作更方便。
BfferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw =
new BufferedWriter(new OutputStreamWriter(System.out));
-通过键盘录入的经典练习:通过键盘录入一行数据,将小写字母变成大写字母,并打印到控制台,当录入为"over" 时,结束程序,停止录入。
(提示:一种是按照平常方式实现,一种是通过转换流 InputStreamReader -> BufferedReader,然后通过BufferedReader 中readLine()方法实现。)
-学习读写转换流:InputStreamReader,OutputStreamWriter
转换流出现的主要原因和作用:
1:字符流与字节流之间转换的桥梁;
2:可以按照指定的编码表操作文件。
通过转换流完成上面那个小练习:
-IO流操作规律总结
(1)明确操作源和目的
源:输入流,InputStream, Reader
目的:输出流,OutputStream, Writer
(2)操作的数据是否是纯文本
是:采用字符流
否:采用字节流
(3)明确体系后,在在根据情况确定使用哪个具体的操作对象
通过设备来进行区分
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,操作台
字节流:(输入)InputStream, FileInputStream, BufferedInputStream
(输出)OutputStream, FileOutputStream, BufferedOutputStream
字符流:(输入)Reader, FileReader, BufferedReader, InputStreamReader
(输出)Writer, FileWriter, BufferedWriter, OutputStreamWriter
target="blank">android培训</a>、<a href="http://www.itheima.com"
target="blank">java培训</a>、期待与您交流! ----------
-学习字节流操作
字节写入流:FileOutputStream
字节输出流:FileInputStream
基本操作与字符流类相同,但它不仅可以操作字符,还可以操作其他媒体文件。
常见操作例子:
package day19_IO; import java.io.*; /** * 学习字节流操作 * @author Administrator * */ public class Day19_11_ByteStream { FileInputStream fis = null; FileOutputStream fos = null; public static void main(String[] args) { inputStreamRead_3(); //inputStreamRead_2(); //inputStreamRead_1(); //outputStream(); } //学习了解FileInputStream 中的available()方法 public static void inputStreamRead_3(){ FileInputStream fis = null; try { fis = new FileInputStream("OutputStreamDemo.txt"); //获取fis对象所指定文件数据的字节数 int num = fis.available(); System.out.println("num= "+num); byte[] b = new byte[num];//要慎用,因为太大的话会超出内存大小 int len = 0; while((len=fis.read(b))!=-1){ System.out.println(new String(b,0,len)); } } catch (Exception e) { e.printStackTrace(); } finally { try { if(fis!=null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } } //字节读取流方式2 public static void inputStreamRead_2(){ FileInputStream fis = null; try { fis = new FileInputStream("OutputStreamDemo.txt"); byte[] cbuf = new byte[1024]; int count = 0; while((count=fis.read(cbuf))!=-1){ System.out.println(new String(cbuf,0,count)); } } catch (Exception e) { e.printStackTrace(); } finally { try { if(fis!=null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } } //字节读取流方式1 public static void inputStreamRead_1(){ FileInputStream fis = null; try { fis = new FileInputStream("OutputStreamDemo.txt"); int ch= 0; while((ch=fis.read())!=-1){ System.out.print((char)ch); } } catch (Exception e) { e.printStackTrace(); } finally { try { if(fis!=null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } } //字节写入流 public static void outputStream(){ FileOutputStream fos = null; try { fos = new FileOutputStream("OutputStreamDemo.txt",true); fos.write(" / hello new world".getBytes()); } catch (Exception e) { e.printStackTrace(); } finally { try { if(fos!=null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
-通过字节流复制一个文本文件的例子
package day19_IO; import java.io.*; /** * 学习字节流操作,通过字节流复制一个文本文件 * @author Administrator * */ public class Day19_11_ByteStream1 { public static void main(String[] args) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("demo.txt"); fos = new FileOutputStream("outputStreamDemo.txt"); //fos.write("hello outputStream".getBytes()); int ch = 0; while((ch=fis.read())!=-1){ fos.write(ch);//-与FileWriter的write方法是有什么区别? //System.out.print((char)ch); } } catch (Exception e) { e.printStackTrace(); } finally { try { if(fis!=null) fis.close(); } catch (IOException e) { e.printStackTrace(); } try { if(fos!=null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
-学习字节流缓冲区
为了提高操作效率,字节流通过提高了字节流缓冲区技术:BufferedInputStream,BufferedOutputStream;
一个通过字节流缓冲区技术实现复制一张JPG图片文件的例子:
package day19_IO; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * 练习通过字节流来实现对图片文件的复制 * @author Administrator * */ public class Day19_12_CopyImage { public static void main(String[] args) { //1:创建引用对象 FileInputStream fis = null; FileOutputStream fos = null; try { //2:实例化引用对象 fis = new FileInputStream("initImage.jpg"); fos = new FileOutputStream("copyImage.jpg"); //3:为了提高效率,定义一个用于暂时存放数据的字节数组cbuf byte[] b = new byte[1024]; int len = 0; while((len=fis.read(b))!=-1){ fos.write(b, 0, len); } } catch (Exception e) { System.out.println("图片复制失败"); e.printStackTrace(); } finally { try { if(fis!=null) fis.close(); } catch (IOException e) { e.printStackTrace(); } try { if(fos!=null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
-System类中的字段:in,out
它们各代表了系统标准的输入和输出设备。
默认输入设备是键盘,输出设备是显示器。
System.in的类型是InputStream.
System.out的类型是PrintStream,它是OutputStream子类FileOutputStream的子类
-标准输入输出流示例:获取键盘录入数据,然后将数据流向显示器,那么显示器就是目的地。
通过System类的setIn,setOut方法对默认设备进行改变。
System.setIn(new FileInputStream(“1.txt”));//将源改成文件1.txt。
System.setOut(new FileOutputStream(“2.txt”));//将目的改成文件2.txt
因为是字节流处理的是文本数据,可以转换成字符流,操作更方便。
BfferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw =
new BufferedWriter(new OutputStreamWriter(System.out));
-通过键盘录入的经典练习:通过键盘录入一行数据,将小写字母变成大写字母,并打印到控制台,当录入为"over" 时,结束程序,停止录入。
(提示:一种是按照平常方式实现,一种是通过转换流 InputStreamReader -> BufferedReader,然后通过BufferedReader 中readLine()方法实现。)
package day19_IO; import java.io.IOException; import java.io.InputStream; /** * 学习通过键盘读取录入 * System.out:对应的是标准输出设备-控制台 * System.in:对应的是标准输入设备- 键盘 * * 练习需求: * 通过键盘录入数据,当录入一行数据后将该行数据转变为 * 大写字母后打印到控制台;如果录入的是over,则停止录入。 * @author Administrator * */ public class Day19_15_SystemIn { public static void main(String[] args) throws IOException { InputStream in = System.in; //创建一个StringBuilder容器 StringBuilder sb = new StringBuilder(); while(true){ int ch = in.read(); if(ch=='\r') continue; if(ch=='\n'){ String s = sb.toString(); if("over".equals(s)) break; System.out.println(s.toUpperCase()); // sb.delete(0, sb.length()); } else sb.append((char)ch); } } }
-学习读写转换流:InputStreamReader,OutputStreamWriter
转换流出现的主要原因和作用:
1:字符流与字节流之间转换的桥梁;
2:可以按照指定的编码表操作文件。
通过转换流完成上面那个小练习:
package day19_IO; import java.io.*; public class Day19_16_IOTransStream { public static void main(String[] args) throws IOException { //获取键盘录入对象 //InputStream in = System.in; //将字节流对象转换为字符流对象,使用转换流- InputStreamReader //InputStreamReader isr = new InputStreamReader(in); //为了提高效率,将字符串进行缓冲区技术处理,使用BufferedReader //BufferedReader br =new BufferedReader(isr); //优化为一句,读入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //写入 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); String s = null; while((s=br.readLine())!=null){ if("over".equals(s)) break; bw.write(s.toUpperCase()); bw.newLine(); bw.flush();//得刷新! //System.out.println(s.toUpperCase()); } br.close(); } }
-IO流操作规律总结
(1)明确操作源和目的
源:输入流,InputStream, Reader
目的:输出流,OutputStream, Writer
(2)操作的数据是否是纯文本
是:采用字符流
否:采用字节流
(3)明确体系后,在在根据情况确定使用哪个具体的操作对象
通过设备来进行区分
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,操作台
字节流:(输入)InputStream, FileInputStream, BufferedInputStream
(输出)OutputStream, FileOutputStream, BufferedOutputStream
字符流:(输入)Reader, FileReader, BufferedReader, InputStreamReader
(输出)Writer, FileWriter, BufferedWriter, OutputStreamWriter
相关文章推荐
- 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告
- 【转】30多年程序员生涯经验总结
- 民营医院员工职业素养培训心得体会
- 公司面试题精选
- 115个Java面试题和答案——终极列表(下)【转】
- 115个Java面试题和答案——终极列表(上)【转】
- 黑马程序员——IO流(一)
- 每日一问:面试结束时面试官问"你有什么问题需要问我呢",该如何回答?
- 程序员保值的4个秘密
- 百度历年笔试面试题
- 黑马程序员-10-java-IO流知识点串讲(4)-利用IO流实现对数据的直接操控
- 黑马程序员-9-java-IO流知识点串讲(3)-IO修饰(功能扩展)类及其应用
- 一个程序员对学弟学妹的建议
- 码农翻墙去美帝 —— 系统设计准备
- 有意思的微软面试题
- 黑马程序员——多线程
- android面试题(一)
- 面试笔记9(面对对象编程)
- 面试笔记8(类)
- 面试笔记5(C预处理器、作用域、static、cosnt以及内存管理)