------- android培训、java培训、期待与您交流! ----------
黑马学习日志之十三 IO流(二)
1 字节流
字符流 底层实际是字节数据 有对应的码表 主要操作文本
字节流 操作数据都是字节数据 可以操作图片等
字节流基类:InputStream 读 OutputStream 写
字符流使用的是字符数组 字节流使用的是字节数组
例子:
import java.io.*;
class FileStream
{
public static void main(String [] args )throws IOException{
readFile3();
}
public static void readFile1()throws IOException{//字节流特有方法
FileInputStream fis = new FileInputStream("fos.txt");
byte[] buf = new byte[fis.available()];//算是字节的长度 此处注意如果文本中有回车的话 占两个字节
//慎用,如果文件过大,会内存损坏
int len=0;
while ((len=fis.read(buf))!=-1)
{
System.out.println(new String(buf,0,len));
}
fis.close();
}
public static void readFile2()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 writeFile()throws IOException{
FileOutputStream fos = new FileOutputStream("fow.txt");
fos.write("abcde".getBytes());//字符串变成字节数组 字符串变成字符数组是 //toCharArray()方法
//此处和字符流的区别是 没有刷新 字符流是将半个字节先临时存储 然后再查表 //需要缓冲
//字节如果没有操作缓冲区时 它是不需要刷新 可以参考源码 有缓冲区才刷新了
fos.close();//虽然没有刷新 但是必须要关闭资源
}
}
2 Copy图片
思路:
1.用字节读取流对象和图片关联
2.用字节写入流对象创建一个图片文件,用于存储获取到的图片数据
3.通过循环读写,完成数据的存储
4.关闭资源
import java.io.*;
class CopyPic
{
public static void main(String [] args){
FileOutputStream fos = null;
FileInputStream fis = null;
try
{
fos= new FileOutputStream("D:\\2.bmp");
fis= new FileInputStream("D:\\1.bmp");
byte [] buf = new byte[1024];
int len = 0;
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("写入文件失败");
}
}
}
}
字符流也可以复制图片,但是操作后的图片可能打不开。
3 字节流缓冲区
BufferedOutputStream
BufferedInputStream
Copy Mp3文件
import java.io.*;
class CopyMp3
{
public static void main(String [] args)throws IOException{
long start = System.currentTimeMillis();
copy_1();
long end = System.currentTimeMillis();
System.out.println((end-start)+"毫秒");
}
//通过字节流的缓冲区完成复制
public static void copy_1()throws IOException{
BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("D:\\1.mp3"));
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("D:\\2.mp3"));
//缓冲区中封装着数组就不需要设置数组了
int by = 0;
while ((by=bufis.read())!=-1)
{
bufos.write(by);
}
bufos.close();
bufis.close();
}
}