黑马程序员------IO流(No.2)(字节流、InputStream、OutputStream、转换流、改变输入输出设备)
来源:互联网 发布:pdf在线拆分软件 编辑:程序博客网 时间:2024/06/07 18:05
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
字节流
InputStream OutputStream
import java.io.*;class FileStream{public static void main(String[] args)throws Exception{readFile3();}//读取操作方法一public static void readFile1()throws Exception{FileInputStream fis = new FileInputStream("fos.txt");int ch = 0 ;while((ch=fis.read())!=-1){System.out.print((char)ch);}fis.close();}//读取操作方法二public static void readFile2()throws Exception{FileInputStream fis = new FileInputStream("fos.txt");byte[] buf = new byte[1024] ;int len = 0;while((len=fis.read(buf))!=-1){System.out.println(new String(buf,0,len));}fis.close();}//读取操作方法三public static void readFile3()throws Exception{FileInputStream fis = new FileInputStream("fos.txt");//定义一个刚刚好的缓冲区,不用循环。但是该文件不宜太大,否则内存溢出。byte[] buf = new byte[fis.available()] ;fis.read(buf);System.out.println(new String(buf));fis.close();}//写入方法public static void writeFile()throws Exception{FileOutputStream fos = new FileOutputStream("fos.txt");fos.write("aasfafa".getBytes());//这里可以不刷新也能存入。fos.close();}}
拷贝一个图片。
思路:
1.用字节选取流对象和图片关联。
2.用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。
3.通过循环读写,完成数据的存储。
4.关闭资源
/*复制一个图片思路:1.用字节选取流对象和图片关联。2.用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。3.通过循环读写,完成数据的存储。4.关闭资源*/import java.io.*;class CopyPic {public static void main(String[] args) {//用字节选取流对象和图片关联。FileInputStream fis = null;//用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。FileOutputStream fos = null;try{fis = new FileInputStream("qa.jpg");fos = new FileOutputStream("qb.jpg");int len = 0;byte[] buf = new byte[1024];//通过循环读写,完成数据的存储。while ((len = fis.read(buf))!=-1){fos.write(buf,0,len);}}catch (IOException e){System.out.println(e.toString());}finally{//关闭资源if(fis!=null){try{fis.close();}catch (IOException e){System.out.println(e.toString());}}if(fos!=null){try{fos.close();}catch (IOException e){System.out.println(e.toString());}}}}}
演示avi的复制。通过缓冲区
import java.io.*;/*演示avi的复制。通过缓冲区*/class CopyPic2{public static void main(String[] args)throws IOException{BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("002.avi"));BufferedInputStream bis = new BufferedInputStream(new FileInputStream("001.avi"));int by=0;while((by=bis.read())!=-1){bos.write(by);}bos.close();bis.close();}}
键盘的录入问题
用键盘录入
System.out:对应的是标准输出设备,控制台。
System.in:对应的是标准输入设备,键盘。
/*用键盘录入System.out:对应的是标准输出设备,控制台。System.in:对应的是标准输入设备,键盘。*/import java.io.*;class ReadIn{public static void main(String[] args)throws IOException{InputStream in = System.in;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.toString());sb.delete(0,sb.length());}elsesb.append((char)ch);}}}
通过刚才的键盘录入一行数据并打印其字符串,我们发现其实就是读一行数据的原理。也就是readLine方法。
能不能直接使用readLine方法来完成键盘录入的一行数据的读取呢?
readLine方法是字符流BufferedReader类中的方法,而键盘录入的read方法是字符流InputStream的方法。那么能不能将字节流转成字符流然后再使用字符流中的readLine方法呢?
import java.io.*;class TransStreamDemo{public static void main(String[] args)throws IOException{InputStream in = System.in;//将字节流转换成字符流对象,使用转换流:InputStreamReaderInputStreamReader isr = new InputStreamReader(in);//为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader。BufferedReader br = new BufferedReader(isr);StringBuilder sb = new StringBuilder();String s = null;while((s=br.readLine())!=null){System.out.println(s);}}}
根据上面的程序,我们考虑到是不是向控制台输出也可以使用转换流呢?
根据文档,我们发现了Write的子类java.io.OutputStreamWriter
import java.io.*;class TransStreamDemo{public static void main(String[] args)throws IOException{/*InputStream in = System.in;//将字节流转换成字符流对象,使用转换流:InputStreamReaderInputStreamReader isr = new InputStreamReader(in);//为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader。BufferedReader br = new BufferedReader(isr);*///上面三个语句可以合成一个语句BufferedReader br = new BufferedReader(new InputStreamReader(System.in));/*OutputStream os = System.out;OutputStreamWriter osw = new OutputStreamWriter(os);BufferedWriter bs = new BufferedWriter(osw);*///上面的三个语句可以合成一个语句BufferedWriter bs = new BufferedWriter(new OutputStreamWriter(System.out));StringBuilder sb = new StringBuilder();String s = null;while((s=br.readLine())!=null){bs.write(s);bs.newLine();bs.flush();}}}
关于流操作的基本规律,我们可以做个总结:
避免流对象很多,不知道用哪个(很痛苦)。我们可以通过两个明确来完成。
1.明确源和目的。
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer
2.操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3.当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘,键盘
目的设备:控制台,内存,硬盘
需求:将键盘录入的数据保存到一个文件中。
这个需求中的源和目的都存在。
源:
InputStream Reader
是不是纯文本 是
设备:键盘。对应的对象System.in。
不死选择Reader吗?System.in对应的不是字节流吗?
为了操作键盘的文本数据方便,转成字符流,按照字符串操作是最方便的。
所以既然明确了Reader,那么就将System.in转成Reader。
用了Reader体系中转换流,InputStreamReader。
为了提高效率,使用BufferedReader。
目的:
OutputStream Writer
是否为纯文本?是,Writer。
设备:硬盘。一个文件,使用FileWriter。
需要提高效率吗?需要使用BufferedWriter。
--------------------------------------------------------------
扩展,想要把录入的数据按照指定的编码表(UTF-8)将数据存到文件中。
目的:OutputStream Writer
是否纯文本?是!Writer。
设备:硬盘。一个文件。使用FileWriter。
但是FilerWriter是使用默认的编码表。GBK
但是存储时,需要加入指定的编码表utf-8。而指定的编码表只有转换流可以指定 。
所以要使用的对象是OutputStreamWriter。
而该转换流对象要接收一个字节输出流。而且还可以操作的文件的字节输出流。FileOutputStream。
import java.io.*;class WriteToFile {public static void main(String[] args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter (new FileOutputStream("sendTo.txt"),"utf-8"));String s = null;while((s=br.readLine())!=null){bw.write(s);if("over".equals(s))break;bw.newLine();bw.flush();}}}
改变标准输入输出设备:
static void
setIn(InputStream in)
static void
setOut(PrintStream out)
import java.io.*;class WriteToFile {public static void main(String[] args) throws IOException{System.setIn(new FileInputStream("TransStreamDemo.java"));System.setOut(new PrintStream("hahh.txt"));BufferedReader br = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter (System.out));String s = null;while((s=br.readLine())!=null){bw.write(s);if("over".equals(s))break;bw.newLine();bw.flush();}}}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详情请查看:http://edu.csdn.net
- 黑马程序员------IO流(No.2)(字节流、InputStream、OutputStream、转换流、改变输入输出设备)
- 黑马程序员---IO流(字节流InputStream、OutputStream)
- java中Inputstream,outputstream(字节输入输出流)
- 黑马程序员_学习笔记:13) IO流: 字节流(InputStream、OutputStream)、字符流(Reader、Writer)、File类、递归
- IO流——(字节流)OutputStream和InputStream
- 黑马程序员—Java IO流(InputStream、FileInputStream、OutputStream、FileOutputStream、字节流缓冲区)
- 黑马程序员:Java基础总结----字节流&InputStream &OutputStream
- 黑马程序员:字节流的介绍:InputStream、OutputStream
- IO流的字节流InputStream、OutputStream
- IO流:InputStream/OutputStream字节流
- Java IO 字节流 InputStream和OutputStream
- IO字节流,OutputStream和InputStream
- 黑马程序员--------java IO流 Reader、Writer、InputStream、OutputStream
- 黑马程序员_IO流(三)——InputStream,OutputStream
- (黑马程序员)学习笔记,IO输入输出(字节流)
- 黑马程序员_<<字节流(含子类)和字节缓冲流(InputStream,OutputStream,BufferedInputStream,BufferedOutputStream)>>
- 黑马程序员——22,字节流InputStream,OutputStream,字节流缓冲区技术,BufferedInputStream,BufferedOutputStream
- JAVA 的IO操作(二) 字节输出流和输入流:OutputStream和InputStream
- 大端字节和小端字节的判断及转换
- 翻译-你必须知道的28个HTML5特征、窍门和技术
- 【精华】Android应用程序框架分析
- 完全平方数的判定及整数平方根的快速求解
- 线性表顺序存储
- 黑马程序员------IO流(No.2)(字节流、InputStream、OutputStream、转换流、改变输入输出设备)
- 菜单命令的路由
- 光大期货人生
- 在c#中实现DataGridView中自定义控件列
- Java的接口和C++的虚类的相同和不同处
- MFC对话框初始化及大小设置
- 编码问题汇总
- RuntimeException异常可以在没有异常声明的时候被抛出
- 关于文件读写操作中ios::app与ios::ate的区别