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

黑马程序员-----IO流(2)字节流和转换流

2015-08-20 16:52 447 查看
——- android培训java培训、期待与您交流! ———-

一、字节流

1、 字节流:

字节读取流:InputStream

字节写入流:OutputStream

字节读取流缓冲区:Buffered OutputStream

字节读取流缓冲区:Buffered InputStream

注:字节流和字符流用法差不多,只不过一个是对字节操作,一个是对字符进行操作

2、演示:往一个文件中,写入字节流并读取出来

package com.shan;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* 需求:字节流File读写操作演示(FileInputStream和FileOutputStream)
* @param args
*/
public class Demo13 {
public static void main(String[] args) throws IOException {
writeFile();
readFile_1();
readFile_2();
readFile_3();

}
public static void writeFile() throws IOException  //文件里写入字节数据
{
FileOutputStream  fos=new FileOutputStream("fos.txt");
fos.write("abcdefghijklmn".getBytes());
fos.flush();
fos.close();
}
public static void readFile_1() throws IOException //一个字节一个字节的读取
{
FileInputStream  fis=new FileInputStream("fos.txt");
int ch=0;
while((ch=fis.read())!=-1)
{
System.out.print((char)ch);
}
fis.close();
}
public static void readFile_2() throws IOException   //把字节存入字节数组中,按一个字节数组的长度读取
{
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 readFile_3() throws IOException
{
FileInputStream  fis=new FileInputStream("fos.txt");
byte[] buf=new byte[fis.available()];  //定义一个长度刚刚好的字节数组。不用循环了
fis.read(buf);
System.out.println(new String(buf));
fis.close();
}

}


3、 拷贝图片(用字节流来进行操作)

package com.shan;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* 需求:拷贝一个图片文件
* @param args
*/
public class Demo14 {
public static void main(String[] args) {
FileOutputStream fos=null;
FileInputStream fis=null;
try
{
fis=new FileInputStream("1.jpg");
fos=new FileOutputStream("2.jpg");
int len=0;
byte[] buf=new byte[1024];
while((len=fis.read(buf))!=-1)
{
fos.write(buf, 0, len);
}
}
catch(IOException e)
{
throw new RuntimeException("复制图片失败!");

}
finally
{

try
{
if(fis!=null)
fis.close();

}
catch(IOException e)
{
throw new RuntimeException("读取关闭失败!");

}
try
{
if(fos!=null)
fos.close();

}
catch(IOException e)
{
throw new RuntimeException("写入关闭失败!");

}
}

}

}


4、 通过缓冲区演示MP3的复制(用字节流来进行操作)

package com.shan;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* 需求:演示MP3的复制,通过缓冲区
* @param args
*/
public class Demo15 {
public static void main(String[] args) throws IOException {
copyMp3();

}
public static void copyMp3() throws IOException
{
BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("1.mp3"));
BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("2.mp3"));
byte[] buf=new byte[1024];
int len=0;
while((len=bufis.read(buf))!=-1)
{
bufos.write(buf, 0, len);
}
bufis.close();
bufos.close();
}

}


5、 读取键盘录入

1) System.in:对应的是标准输入设备:键盘

2) System.out:对应的是标准输出设备:控制台

3) 最常见的键盘录入的写法:

BufferedReader  bufr=new BufferedReader(new InputStreamReader(System.in));


例子:通过键盘录入数据,当录入一行数据后,就将该行数据进行打印,如果录入的值是“over”,那么就停止录入。

package com.shan;
import java.io.IOException;
import java.io.InputStream;

/**
* 需求:通过键盘录入数据,当录入一行数据后,就将该行数据进行打印,如果录入的值是“over”,那么就停止录入。
* @param args
*/
public class Demo16 {
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(in))
break;
System.out.println(s.toUpperCase());
sb.delete(0, sb.length());
}
else
sb.append((char)ch);
}

}
}


二、转换流(字符和字节之间的桥梁)

1、读取转换流:InputStreamReader

2、写入转换流:OutputStreamWriter

3、示例演示:通过读取转换流来读取键盘录入的数据:

package com.shan;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
* 需求:通过读取转换流来读取键盘录入的数据
(读取转换流:InputStreamReader)
* @param args
*/
public class Demo17 {
public static void main(String[] args) throws IOException {
//获取键盘录入的数据
InputStream  in=System.in;
//将字节流对象转成字符流对象,使用转换流
InputStreamReader isr=new InputStreamReader(in);
//为了提高效率,使用BufferedReader缓冲区提高效率
BufferedReader bufr=new BufferedReader(isr);
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
System.out.println(line.toUpperCase());
}
bufr.close();

}

}


4、 通过写入转换流来获取键盘录入的数据并大写打印出来

(写入转换流:OutputStreamWriter)

package com.shan;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
* 需求:通过写入转换流来获取键盘录入的数据并大写打印出来   (写入转换流:OutputStreamWriter)
* @param args
*/
public class Demo18 {
public static void main(String[] args) throws IOException {
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();

}

}


5、 转换流什么时候使用?

转换流是字符和字节之间的桥梁,通常,涉及到字符编码需要转换时需要用到转换流

6、总结:(流操作的基本规律)

1) 明确源和目的

源:输入流 InputStream Reader

目的:输出流 OutputStream Writer

2) 操作的数据是否是文本

是:字符流

不是:字节流

3) 当体系明确后,在明确要使用哪个具体的对象,通过设备来进行区分

源设备:内存、硬盘、键盘等

目的设备:内存、硬盘、控制台等

例如:将键盘录入的数据保存到一个文件中


(分析需求)
源:
因为是读取流,键盘录入的数据都是文本数据,所以使用Reader
因为System.in对应的是字节流,为了操作键盘的文本数据方便,所以将其转换成字符流,所以用到了读取转换流:InputStreamReader
因为需要提高效率,所以加入缓冲技术,用到了:BufferedReader
操作源的代码就可以确定,如下所示:
InputStreamReader  isr=new InputStreamReader(System.in);
BufferedReader  bufr=new BufferedReader(isr);
目的:
OutputStream     Writer
是否是纯文本?是!就选择Writer
设备:硬盘。一个文本文件, 使用FileWriter
需要提高效率,所以使用BufferedWriter
目的的代码就可以确定,如下所示:
FileWriter  fw=new FileWriter(c.txt);
BufferedWriter  bufw=new BufferedWriter(fw);


——- android培训java培训、期待与您交流! ———-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: