黑马程序员_IO流

来源:互联网 发布:爱国者之日 知乎 编辑:程序博客网 时间:2024/06/06 00:37
/*
IO流概述: 
流:程序用来读写文件数据这个技术,流技术,输出和输入,IO流技术
IO流技术实现设备之间的数据传输,可以使用流技术读取数据,自己机子的,读取其他计算机,设备硬盘,另一台主机,或者互联网
按照操作数据的不同,分成了字符流和字节流
字符流,专门用于操作文本数据,记事本,Java程序,网页,字符流在读或者写数据的时候,查询本机默认编码表(GBK),有利于操作文本文件,出现于JDK1.1
字节流,可以用来操作任意文件,读写文件的时候,不查询编码表
按照流向分,输出流Output和输入流Input。输出,Java程序写文件,操作数据目的,输入,Java程序读取文件,操作数据源
字符流只能操作文本数据,字节流任意数据,输出就是写文件,输入就是读取件


   字符输出流,写文本文件的,抽象基类 java.io.Writer,写文件的
write(字符数组)  write(字符数组一部分) write(单个字符) write(字符串)
字符输入流,读文本文件的,抽象基类 java.io.Reader,读文件的
read()单个字符  read(字符数组)  read(字符数组一部分)
字节输出流,写任意文件的,抽象基类 java.io.OutputStream,写文件的
write(单个字节)  write(字节数组) write(字节数组一部分)
字节输入流,读任意文件的,抽象基类 java,io.InputStream,读文件的
read()单个字节  read(字节数组)  read(字节数组一部分)


写文本文件
字符输出流 Writer,父类不能直接使用,找子类,FileWriter类
构造方法 FileWriter(字符串的文件名)
字符流在写数据的时候,write方法写,数据写在了内存中,并没有直接写到目的文件中,内存(缓冲),如果让数据写到目的文件中,字符流要进行缓存区的刷新操作。Writer中的方法flush,刷新流的缓冲,将数据写到目的地,字符流只要刷新的,数据必会走向目的地。
文件的续写,文件的后面追加写入,原有的数据都被保留下来
FileWriter类构造方法中,传递String的文件名,true实现追加写入


读取文本文件
  Reader类,抽象类,找子类,FileReader,构造方法,直接传递字符串的文件名
  调用FileReader父类方法实现读取功能
  读取单个字符的方法  int read() 读取一个字符
 read()方法,每次只能读取一个字符,返回这个字符的码值,没调用一次read()自动向后读取一个字符,如果读取到文件的末尾,返回-1
 注意:文件读取的时候,一次循环不允许出现2次read()
       保证读取的文件必须是GBK编码的(ANSI)
读取字符数组 int read(char[] ch)
每次读取到的字符,装在字符数组中,返回每次读取的有效字符个数


*/
//文件的复制,文本文件
// 读写原理,一个读,一个写
// FileReader类读取源文件
// FileWriter将读取到的数据源中的文本,写向数据目的文件
import java.io.*;
class CopyFile{
public static void main(String[] args) {
//定义字符输入输出流
FileWriter fw=null;
FileReader fr=null;
try{
fw=new FileWriter("c:\\x.txt");
fr=new FileReader("e:\\x.txt");
//定义数组接受读取的信息
char[] ch=new char[1024];
int len=0;
while((len=fr.read(ch))!=-1){//读数组
fw.write(ch, 0, len);//写数组
fw.flush();//刷新
}
}catch(IOException e){
e.printStackTrace();
throw new RuntimeException("复制失败");
}finally{
try{
if(fr!=null)
fr.close();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException e){
e.printStackTrace();
}
}
}

}
}
/*
1.字符输出流的缓冲区对象
 数组的缓冲,提高了流对象的读写效率,开发出现流对象的缓冲区对象,目的提高流的操作效率。字符输出流的缓冲区 java.io.BufferedWriter
  字符输出流缓冲区对象方法
构造方法 BufferedWriter(Writer out)传递的是Writer的子类对象。目的:缓冲区对象出现的目的,提高输出流的效率,提高哪一个流,只要传递的是Writer的子类,提高的就是你这个子类的效率。FileWriter
void newLine()写一个换行。\r\n Windows下有效,Linux操作系统\n 
newLine()具有跨平台性,安装的JVM版本了,如果安装的JVM是Windows版本的,newLine()方法中写的就是\r\n ,如果安装的是Linux版本的JVM,newLine()方法中的写就是\n


2.字符输入流的缓冲区对象
 提高字符输入流的读取效率,java.io.BufferedReader,查阅API文档,这个缓冲区可以按行读取。
 字符输入流缓冲区对象的方法
构造方法 BufferedReader(Reader in),传递是的Reader类的子类对象。目的,提高字符输入流的读取效率,提高哪个流对象,传递Reader子类,FileReader.
String readLine()读取文本一行,返回字符串,读取文件结尾,返回null,读取一行,返回的字符串中,没有\r\n符号,返回是一行有效字符
*/


//利用字符流缓冲区对象,按行读取,读一行,写一行,写换行,刷新
import java.io.*;
public class CopyFile {
public static void main(String[] args) {
//定义两个缓冲区
BufferedWriter bw=null;
BufferedReader br=null;
//使用try{}catch(){}处理异常
try{
bw=new BufferedWriter(new FileWriter("e:\\x.txt"));
br=new BufferedReader(new FileReader("c:\\x.txt"));
//定义一个字符串接收读取到的信息
String len=null;
while((len=br.readLine())!=null){
bw.write(len);
bw.newLine();
bw.flush();
}
}catch(IOException e){
e.printStackTrace();
throw new RuntimeException("复制失败");
}finally{
try{
if(br!=null)
br.close();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(bw!=null)
bw.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
/*
字节输出流
 字节可以操作任意文件,字节输出流,写任意文件,单个字节8个二进制。
   不查询编码表
 字节输出流的抽象基类OutputStream
 写字节数组,字节数组一部分,单个字节
 子类FileOutputStream类,文件的输出
 构造方法方法,专递字符串文件名
 字节流写数据,不需要刷新,直接向数据写到目的地
字节输入流
字节可以操作任意文件,字节输入流读取文件,单个字节8个二进制
字节输入流的抽象基类InputStream
读取的方法,读取单个字节,读取字节数组,读取字节数组一部分
子类是FileInputStream,构造方法直接传递字符串文件名
读取单个字节的read()方法,返回字节的码值,文件末尾返回-1
int available()字节输入流的方法,返回字节输入流封装的文件的字节数
*/
//字节流复制任意文件
//使用字节流复制avi格式的视频
import java.io.*;


public class CopyFile {
public static void main(String[] args) {
// 定义两个字节流
FileInputStream fis = null;
FileOutputStream fos = null;
// try{}catch(){}处理异常
try {
fis = new FileInputStream("c:\\aa.avi");
fos = new FileOutputStream("e:\\aa.avi");
// 定义字节数组接收读取的信息
byte[] bytes = new byte[1024 * 1024];
int len = 0;
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("复制失败");
} finally {
try {
if (fos != null)
fos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/*
转换流:
InputStreamReader
是Reader的子类,字符流对象,字节流向字符的桥梁。InputStreamReader有一个子类就是FileReader
字节转成字符流,InputStreamReader如果使用
构造方法:InputStreamReader(InputStream in)传递字节输入流,变成字符流
OutputStreamWriter
是Writer的子类,字符流对象,字符流向字节的桥梁
OutputStreamWriter构造方法,传递的是字节输出流,System.out
*/
/*使用转换轮流完成键盘录入
  读取键盘输入,输入后的内容,转成大写,保存在一个记事本中
读取一个文本文件,转大写后,输出在控制台
读取一个文本文件,转大写后,输出在另一个文件中
*/
import java.io.*;


public class JianPan {
public static void main(String[] args) {
BufferedReader br=null;
BufferedWriter bw=null;
try{
br=new BufferedReader(new InputStreamReader(System.in));
bw=new BufferedWriter(new OutputStreamWriter(System.out));
String len=null;
while((len=br.readLine())!=null){
if("over".equals(len))
break;
bw.write(len);
bw.newLine();
bw.flush();

}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(bw!=null)
bw.close();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(br!=null)
br.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}

0 0