字节流抽象基类:
InputStream、OutputStream
字符流抽象基类:
Reader、Writer
-------------------------------------------------------------------------------------------
字符流:
类FileWriter:
//创建一个FileWriter对象,该对象一初始化就必须要明确操作文件
//而且该文件会被创建到指定目录下,如果已有文件,将被覆盖
FileWriter fw = new FileWiter("demo.txt");
fw.writer("abcde"); //调用Writer方法,将字符串写入到流中
fw.flush(); //刷新流对象缓冲中的数据将数据刷到目的地,
fw.close(); //关闭流资源,关闭前会刷新一次
----------------------------------
//对已有的文件续写
FileWriter fw = new FileWriter("demo.txt",true);
//写入转意字符换行 \r\n
fw.writer("\r\n");
-------------------------------------------------------------------------------------------
类FileReader:
//创建一个文件读取流对象,和指定名称的文件相关联,要保证文件存在不然发生FileNotFoundException异常
FileReader fr = new FileReader("demo.txt")
//调用读取流对象的方法read(),read()一次读取一个字符,并且再次调用read()将自动往下读取
int ch = fr.read();
sop("ch = "+(char)ch);
//使用reader()方法当读取到字符末尾时返回-1
while(true){
int ch = fr.read()
if(ch == -1)
break;
System.out.println("ch = "+(char)ch);
}
上面代码进行优化后如下:
int ch = 0;
while((ch = fr.read()) != -1){
System.out.println((char)ch);
}
//通过字符数组读取,先定义一个字符数组用于存贮读到的字符,当数组装满或者读取完毕再将数组中的字符一次取出
char[] buf = new char[1024];
int num = fr.read(buf); //read读取返回读取到字符的个数
fr.close() ;
//循环读取
int num = 0;
while((num = fr.read()) != -1){
sop(new Sting(buf, 0, num));
}
-------------------------------------------------------------------------------------------------
//练习:读取一个.java文件并打印在控制台上
import java.io.*;
class FileReader{
public static void main(String args[]) throws IOException {
FileReader fr = new FileReader("Demo.java");
char[] buf = new char[1024];
int num = 0;
while((num = fr.reade(buf)) != -1){
System.out.print(new String(buf, 0, num)); //使用print,不然读到1024*n处将会自动换行
}
fr.close();
}
}
-------------------------------------------------------------------------------------------------
练习:将C盘一个文件复制到D盘
原理:将C盘下的一个文件数据存储到D盘的一个文件中
步骤:1、在D盘创建一个文件,用于存储c盘文件中的数据
2、定义读取流和C盘文件相关联
3、通过不断的读写完成数据的存储
4、关闭资源
import java.io.*;
class FileReaderDemo{
public static void main(String args[]) throws IOException {
FileWriter fw = new FileWriter("D:\\demo_copy.txt");
FileReader fr = new FileReader("C:\\demo.txt");
char[] buf = new char[1024];
int num = 0;
while((num = fr.read(buf)) != -1){
fw.write(buf, 0 num);
}
fr.close();
fw.close();
}
}
-----------------------------------------------------------------------------*-*
缓冲区:
提高了对数据的读写效率,在创建缓冲区前必须有流,
BufferedWriter类
FileWriter fw = new FileWriter("demo.txt");
//为了提高效率,将要提高效率的流对象作为参数传递给缓冲区构造函数,加入缓冲
BufferedWriter bufw = new BufferedWriter(fw);
bufw.writer("abcde");
bufw.newLine(); //缓冲区中提高跨平台换行符
bufw.flush(); //只要用到缓冲区就要进行刷新
bufw.close(); //关闭缓冲区就是关闭缓冲区的流
--------------------------------------------------*-*
BufferedReader类
FileReader fr = new FileReader("demo.txt");
BufferedReader bufr = new BufferedReader(fr);
//缓冲技术中整行读取
String s = bufr.readLine();
String s = null;
while((s = bufr.readLine()) != null){
sop(s);
}
bufr.close();
readLine()方法原理:
无论读一行还是多个字符,其实底层行数在硬盘上面都是使用read()一个一个的读取
--------------------------------------------------------*-*
根据缓冲区原理创建自己的缓冲类——装饰设计模式
class MyBufferReader{
private FileReader r;
MyBufferedReader(FileReader r){
this.r = r;
}
//缓冲区一次读一行的方法
public String myReadLine() throws IOException {
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch = r.read()) != -1){
if((ch = r.read()) == '\r')
continue;
if((ch = r.read()) == '\n')
return sb.toString();
sb.append((char)ch);
}
if(sb.length() != 0)
return sb.toString() ; //加入,否则当最后一行无换行则失去最后一行
}
public void myColse(){
r.close();
}
}
---------------------------------------*-*
装饰设计模式:
当要对已有对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能 ,那么自定义的类就称为装饰类,
装饰类通常通过构造方法接受需要增强的对象。
实例演示:基于人吃饭的增强功能
class Person {
public void eat(){
System.out.println("吃饭");
}
}
class SuperPerson{
SuperPerson(Person p){
this.p = p;
}
public void superEat(){
p.eat();
System.out.println("喝汤"):
}
}
-------------------------------*-*
装饰类LineNumberReader
FileReader fr = new FileReader("demo.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String line = null;
//设置从100开始计数
lnr.setLinNumber(100);
while((line = lnr.readLine()) != null){
System.out.print(lnr.getLineNumber()+"--"+line);
}
lnr.close();
-------------------------------------------------------------------------------------------------------*-*
字节流:
基类:
InputStream、OutputStream
//创建写入流对象
FileOutputStream fos = new FileOutputStream("demofos.txt");
fos.write("abcde".getByte());
//无需刷新但同样需要关闭
fos.close();
//创建写入流对象
FileInputStream fis = new FileInputStream("demo.txt");
//读取一个字节
int ch = fis.read();
sop((char)ch);
//读取一个字节数组
Byte[] buf = new Byte{1024];
int len = 0;
while((len = fis.read()) != -1){
sop(new String(buf, 0, len));
}
//FileInputStream 中提供文件大小获取方法,借此也可以定义一个刚刚好的缓冲区,但是一般不常用
byte[] buf = new byte[fis.available()];
fis.read(buf); //当读取内容过多时会导致内存溢出
System.out.println(new String(buf));
fis.close();
-------------------------------------------------------------------------------------*-*
读取键盘录入:
System.out; 对应标准输出设备 控制台
System.in; 对应标准输入设备 键盘
需求:通过键盘录入数据,当录入一行数据后,就将该行数据打印,如果录入数据是 over ,就停止录入
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(s))
break;
System.out.println(s.toString());
sb.delete(0, sb.length());
}else{
sb.append((char)ch);
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------*-*
转换流:
使用转换流将字节流转换为字符流:
inputStream in = System.in;
//将字节流转换位字符流,使用InputStreamReader
InputStreamReader isr = new InputStreamReader(in);
//为提高读写效率,将字符串加入缓冲技术
BufferedReader bufr = new BufferedReader(isr);
键盘录入的最常见写法:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
流操作的基本规律:
1、明确源和目的
2、操作的数据是不是纯文本的
3、当体系明确后,再明确要使用哪个具体对象
通过设备进行区分
源:内存、硬盘、键盘 InputStream、Reader(源)
目的:内存、硬盘、控制台 OutputStream、Writer(目的)
-----------------------------------------------
编码:
把录入的数据按照指定的编码表将数据存到文件中,默认:utf-8
OutputStreamWriter osw = new OutputStreamWriter(new FileInputStream("demo.txt","UTF-8"));
修改标准输入、输出:
System.setIn(new FileInoutStream("1.txt"));
System.setOut(new printStream("2.txt"));
将异常信息存入指定文件,IO的应用
import java.io.*;
class ExceptionInfo{
public static void main(String args[]){
try{
int[] arr = new int[2];
System.out.println(arr[3]);
}catch(Exception e){
try{
System.setOut(new print("exception.log"));
}catch(IOException ex){
throw new RuntimeException("日志文件创建失败");
}
e.printStackTrace(System.out);
}
}
}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------