IO流就是处理设备之间的数据传输
java对数据的操作是通过流的方式,操作流的对象基本都在IO包中。
IO流分为字符流和字节流。
字节流的抽象基类: InputStream OutputStream
字符流的抽象基类: Writer Reader
字符流:
IO异常处理方式:
缓冲区提高了流的读写效率,在创建缓冲区前必须要有流对象。
字符写入流缓冲区提供了一个跨平台的换行符:newLine();
字符读取流缓冲区提供了一个读取一行的方法:readLine(); 如果到流结尾,返回null。只返回回车符之前的有效字符,不返回任何行终止符。
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义一个装饰类,将已有对象传入,基于已有对象的功能,并提供加强功能。
这种模式称为装饰设计模式。
装饰类通常会通过构造方法传入被装饰的对象,基于被装饰的对象的功能,提供更强的功能。
装饰模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。
装饰类因为是增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都是属于一个体系的。
字节流:
FileInputStream FileOutputStream
字节流写入时,因为操作的是最小单位,不需要刷新,直接写入就可以了。
FileInputStream 中available()方法可以返回估计剩余字节数。
自定义字节流缓冲区myBufferedInputStream
流操作规律:
通过两个明确来完成
1.源和目的
源:输入流.InputStream Reader
目的:输出流.OutputStream Writer
2.操作的数据是否是纯文本
是:字符流
不是:字节流
当体系明确后,再明确要使用哪个具体的对象,通过设备来进行区分
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
源:键盘录入
目的:控制台
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
源:文件
目的:文件
BufferedReader bufr = new BufferedReader(new FileReader("demo.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("demo_copy.txt"));
源:键盘录入
目的:指定字符集的文件//操作指定字符集最方便的是转换流。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("demo.txt"),"uft-8"));
改变标准输入输出设备:
System.setIn(InputStream in)
System.setOut(PrintStream out)
异常的日志信息:
System.setOut("exception.log");
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(d);
PrintStream ps = new PrintStream("exception.log");
ps.print(s);
e.PrintStackTrace(ps);
java对数据的操作是通过流的方式,操作流的对象基本都在IO包中。
IO流分为字符流和字节流。
字节流的抽象基类: InputStream OutputStream
字符流的抽象基类: Writer Reader
字符流:
//写入流:
//创建一个文件写入流,指定目录,如果目录中有同名文件,会覆盖掉。
FileWriter fw = new FileWriter("demo.txt");
//如果是对已有文件进行续写:
FileWriter fw = new FileWriter("demo.txt",true);
//指定对应的构造函数,传递一个true参数,代表不覆盖已有文件
fw.write("abcdef");
//刷新流对象中的缓冲区
fw.flush();
//关闭流资源
fw.close();
//读取流:
//方式一:一个一个读
FileReader fr = new FileReader("demo.txt");
int ch = 0;
while((ch=fr.read())!=-1)//文件读取的末尾会返回-1
{
System.out.print((char)ch);
}
fr.close();
//方式二:建立一个缓冲区,读满后一起输出
FileReader fr = new FileReader("demo.txt");
char[] chs = new char[1024];
int len = 0;
while((len=fr.read(chs))!=-1)
{
System.out.print(new String(chs,0,len));
}
fr.close();
IO异常处理方式:
FileWriter fw = null;
try
{
fw = new FileWriter("demo.txt");
fw.write("abcd");
}
catch (IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch (IOException e)
{
System.out.println(e.toString());
}
}
缓冲区提高了流的读写效率,在创建缓冲区前必须要有流对象。
字符写入流缓冲区提供了一个跨平台的换行符:newLine();
字符读取流缓冲区提供了一个读取一行的方法:readLine(); 如果到流结尾,返回null。只返回回车符之前的有效字符,不返回任何行终止符。
import java.io.*;
class CopyTxtByBuffer
{
public static void main(String[] args)
{
BufferedReader bufr = null;
BufferedWriter bufw = null;
try
{
bufr = new BufferedReader(new FileReader("g:\\java\\SchoolTest\\CharNumTest.java"));
bufw = new BufferedWriter(new FileWriter("CharNum_copy.java"));
String line = null;
while((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}
catch (IOException e)
{
throw new RuntimeException("读取失败");
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch (IOException e)
{
throw new RuntimeException("关闭读资源失败");
}
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException("关闭写资源失败");
}
}
}
}
装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义一个装饰类,将已有对象传入,基于已有对象的功能,并提供加强功能。
这种模式称为装饰设计模式。
装饰类通常会通过构造方法传入被装饰的对象,基于被装饰的对象的功能,提供更强的功能。
装饰模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。
装饰类因为是增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都是属于一个体系的。
字节流:
FileInputStream FileOutputStream
字节流写入时,因为操作的是最小单位,不需要刷新,直接写入就可以了。
FileInputStream 中available()方法可以返回估计剩余字节数。
//复制图片
import java.io.*;
class CopyPic
{
public static void main(String[] args)
{
FileInputStream fis = null;
FileOutputStream fos = null;
try
{
fis = new FileInputStream("1.jpg");
fos = new FileOutputStream("2.jpg");
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("读取失败");
}
}
}
}
//自定义字节流缓冲区myBufferedInputStream
import java.io.*;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024];
private int count = 0,pos = 0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
public int myRead()throws IOException
{
if(count==0)
{
count = in.read(buf);
if(count<0)
return -1;
pos = 0;//每循环一次就要置零一次
byte b = buf[pos];
count--;
pos++;
return b&0xff;//byte型的-1转成int型的还是-1,会导致循环提前结束。所以要&255使其返回255,这样就能读取图片所有的字节。
}
if(count>0)
{
byte b = buf[pos];
count--;
pos++;
return b&0xff;//在read()方法中提升byte为int,而在write中再把int强制转成byte,只保留其有效部位。
}
else
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}
流操作规律:
通过两个明确来完成
1.源和目的
源:输入流.InputStream Reader
目的:输出流.OutputStream Writer
2.操作的数据是否是纯文本
是:字符流
不是:字节流
当体系明确后,再明确要使用哪个具体的对象,通过设备来进行区分
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
源:键盘录入
目的:控制台
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
源:文件
目的:文件
BufferedReader bufr = new BufferedReader(new FileReader("demo.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("demo_copy.txt"));
源:键盘录入
目的:指定字符集的文件//操作指定字符集最方便的是转换流。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("demo.txt"),"uft-8"));
改变标准输入输出设备:
System.setIn(InputStream in)
System.setOut(PrintStream out)
异常的日志信息:
System.setOut("exception.log");
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(d);
PrintStream ps = new PrintStream("exception.log");
ps.print(s);
e.PrintStackTrace(ps);