I/O流概念
处理设备之间的数据传输
按照传输类型:字符流、字节流
字符流:读取文字字节数据后,不直接操作而是先查制定的编码表,获取对应的文字 =字节流+编码表
常用顶层父类
InputStream,OutputStream——字节流
Reader,Writer——字符流
——FileReader,FileWriter
字符流
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IODemo {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
public static void main(String[] args) throws IOException {
String file = "IODemo.txt";
//创建文件字符流对象,不能续写 直接覆盖或新建
FileWriter fileWriter = new FileWriter(file);
//加上true,在原文件上续写或新建
// FileWriter fileWriter = new FileWriter(file,true);
//.write:将数据写入到临时存储缓冲区中
//写入字符串".."或者字符'..'
fileWriter.write("123456");
//写入换行-第一种:\r\n -第二种:
//fileWriter.write("\r\n");
fileWriter.write(LINE_SEPARATOR);
fileWriter.write("abcdef");
//将数据写到目的地中
fileWriter.flush();
//关闭数据流
fileWriter.close();
//close后无法write
// fileWriter.write("654321");
FileReader fileReader = new FileReader(file);
//读取方式一 read();——每次读取都会准备到下一个字符
/*int c=fileReader.read();
while(c!=-1) {
System.out.print((char)c);
c=fileReader.read();
}*/
//读取方式二 read(char[]);——读取会转到下一堆字符
/*char[] buf=new char[3];
fileReader.read(buf);
//打印与buf相同长的的字符
System.out.println(new String(buf));
fileReader.read(buf);
System.out.println(new String(buf));
fileReader.read(buf);
System.out.println(new String(buf));
// 结果:
// 123
// 456
// //回车实际上是\r\n,相当于两个字符
// a
*/
//全部显示:
char[] buf=new char[10];
int len = 0;
while((len=fileReader.read(buf))!=-1) {
System.out.print(new String(buf,0,len));
}
fileReader.close();
}
}
实例:将C盘文件复制到其他盘来
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IOExample {
public static void main(String[] args) throws IOException {
String fromfile = new String("C:/Users/yangxiao/Desktop/FROM.txt");
String copyfile = new String("D:/eclipse-workspace//JavaSe/src/com/yyxx/day14/IODemo.txt");
FileReader fr=new FileReader(fromfile);
FileWriter fw=new FileWriter(copyfile);
int ch = fr.read();
while(ch!=-1) {
fw.write(ch);
ch=fr.read();
}
fr.close();
fw.close();
}
}
缓冲区
提高数据读写效率
如字符流一节中的读取方法二:char[] buf=new char[3];即为缓冲区
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberInputStream;
import java.io.LineNumberReader;
public class IODemo2 {
public static void main(String[] args) throws IOException {
String file = "IODemo.txt";
FileWriter fw=new FileWriter(file);
//创建输出缓冲区的缓冲字符输出流
BufferedWriter bfw = new BufferedWriter(fw);
bfw.write("123465798123456795123465798123456"
+ "7951234657981234567951234657981234"
+ "567951234657981234567951234657981234"
+ "567951234657981234567951234657981234"
+ "5679512346579812345679512346579812345"
+ "67951234657981234567951234657981234567"
+ "95\r\nqwertyuasdfghxc");
bfw.newLine();//可以这样写入回车
bfw.write("qwertyu");
bfw.flush();
bfw.close();
FileReader fr=new FileReader(file);
BufferedReader bfr = new BufferedReader(fr);
//数据读取方式一:read()方法
/*int ch;
while((ch=bfr.read())!=-1) {
System.out.print((char)ch);
}*/
//数据读取方式二:.readline()方法
/*String line =null;
while((line=bfr.readLine())!=null) {
System.out.println(line);
}
bfr.close();*/
//数据读取方式三:LineNumberReader类
LineNumberReader lnr = new LineNumberReader(fr);
String line = null;
while((line=lnr.readLine())!=null) {
System.out.println(lnr.getLineNumber()+" "+line);
}
}
}
字节流
基本操作与字符流类似
不仅可以操作字符,也可以操作图像、音频等
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IODemo3 {
public static void main(String[] args) throws IOException {
String fromfile = "picture.jpg";
String outfile = "D:/eclipse-workspace/JavaSe/src/com/yyxx/day14/picture.jpg";
FileInputStream fis =new FileInputStream(fromfile);
FileOutputStream fos =new FileOutputStream(outfile);
int ch = 0;
while ((ch=fis.read())!=-1) {
System.out.print((char)ch);
fos.write(ch);
}
fos.flush();
fis.close();
fos.close();
}
}
键盘流
import java.io.IOException;
import java.io.InputStream;
public class IODemo4 {
public static void main(String[] args) throws IOException {
InputStream input = System.in;
int ch =0; //input.read();//阻塞式方法:等待输入数据
StringBuilder sBuilder=new StringBuilder();
while ((ch=input.read())!=-1) {
if(ch=='\r')
continue;
if(ch=='\n')
break;
else {
sBuilder.append((char)ch);
}
// sBuilder.append((char)ch);
}
System.out.println(sBuilder);
input.close();
}
}
转换流
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class IODemo5 {
public static void main(String[] args) throws IOException {
// 字节流
InputStream in = System.in;
// 字节流->转换字符流
InputStreamReader isr = new InputStreamReader(in);
// 高效装饰
BufferedReader bufr = new BufferedReader(isr);
// 字符流
OutputStream out = System.out;
// 字符流->转换字节流
OutputStreamWriter osw = new OutputStreamWriter(out);
// 高效装饰
BufferedWriter bufw = new BufferedWriter(osw);
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line)) {
break;
}
System.out.println(line);
bufw.write("123456789");
bufw.flush();
}
}
}