您的位置:首页 > 职场人生

黑马程序员——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

基本操作与字符流类相同,但它不仅可以操作字符,还可以操作其他媒体文件。

常见操作例子:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: