JAVA基础之IO读写
流的概念
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
字节流的抽象基类
InputStream(FileInputStream) OutputStream(FileOutputStream)
字符流的抽象基类
Reader(FileReader),Writer(FileWriter)
字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream
字节流处理对象:FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream
字符流在程序中一个字符等于两个字节,那么java提供了Reader、Writer两个专门操作字符流的类。
字符流处理对象:FileReader、FileWriter、BufferedReader、BufferedWriter
不多说直接示例Demo演示,每个Demo都有详细注释说明!
字符流读写(FileWriter、FileReader、BufferedReader)
import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
FileWriter fw = null;//创建一个FileWriter对象,初始化为空
FileReader fr = null;//创建一个FileReader对象,初始化为空
try
{
//FileWriter
fw = new FileWriter("demofw.txt");//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//fw = new FileWriter("demo.txt",true); //传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
fw.write("abcdefg");//调用write方法,将字符串写入到流中。
//fw.flush();//刷新流对象中的缓冲中的数据,将数据刷到目的地中。
//FileReader
fr = new FileReader("demofr.txt");//创建一个文件读取流对象,和指定名称的文件相关联。
char[] buf = new char[1024];//定义一个字符数组,用于存储读到字符。
int num = 0;
while((num=fr.read(buf))!=-1){//read():一次读1024个字符,而且会自动往下读。
System.out.println(new String(buf,0,num));
}
//BufferedReader
//为了提高效率,加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
BufferedReader bufr = new BufferedReader(new FileReader("buf.txt"));
String line = null;
//readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。
while((line=bufr.readLine())!=null)
{
System.out.print(line);
}
}
catch (IOException e)
{
System.out.println("catch:"+e.toString());
}
finally//IO流处理必须定义个finally来关闭流
{
try
{
if(fw!=null)
fw.close(); //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
if(fr!=null)
fr.close();
}
catch (IOException e)
{
System.out.println(e.toString());
}
}
}
}
缓冲区技术,小程序一枚
public static void main(String[] args) throws IOException {//使用throws跑出异常,建议使用try catch
//创建一个BufferedReader对象获取键盘输入
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
//创建一个BufferedWriter对象实现控制台输出
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();
}
Copy MP3两种方法
CopyMp3.java
import java.io.*;
class CopyMp3
{
public static void main(String[] args) throws IOException
{
long start = System.currentTimeMillis();//获取系统开始时间
copy_2();
long end = System.currentTimeMillis();//获取系统结束时间
System.out.println((end-start)+"毫秒");
}
public static void copy_2()throws IOException//抛出异常,通过自定义BufferedInputStream来实现缓冲
{
//调用自定义MyBufferedInputStream类
MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("c:\\9.mp3"));
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\3.mp3"));
int by = 0;
//System.out.println("第一个字节:"+bufis.myRead());//涉及到btye int二进制转换、提升,如果不清楚可打印查看自定义类
while((by=bufis.myRead())!=-1)
{
bufos.write(by);
}
bufos.close();
bufis.myClose();
}
public static void copy_1()throws IOException//通过字节流的缓冲区完成复制。
{
BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("c:\\0.mp3"));//正常读取方法
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));
int by = 0;
while((by=bufis.read())!=-1)
{
bufos.write(by);
}
bufos.close();
bufis.close();
}
}
MyBufferedInputStream.java
import java.io.*;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
private int pos = 0,count = 0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
//一次读一个字节,从缓冲区(字节数组)获取。
public int myRead()throws IOException
{
//通过in对象读取硬盘上数据,并存储buf中。
if(count==0)
{
count = in.read(buf);
if(count<0)
return -1;
pos = 0;
byte b = buf[pos];
count--;
pos++;
return b&255;
}
else if(count>0)
{
byte b = buf[pos];
count--;
pos++;
return b&0xff;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}