IO in Java

IO流

IO流可以用于读写数据(本地或网络中)。

IO流按流向分为输入流(Input)用于读取数据(文件to程序),输出流(Output)用于输出数据(程序to文件)。

IO流按操作文件类型可以分为字符流,字节流;字符流可以运用于所有类型的文件,而字符流只能运用于文本文件(可以被操作系统自带的记事本打开并读懂)。

IO流体系如图。InputStream、OutputStream、Reader、Writer均为abstract类。

字节流

OutputStream(字节输出流) 

FileOutputStream

文件字节输出流,用于写入。在使用时需要throws掉IOException。

FileOutputStream fos = new FileOutputStream("文件地址");//创建对象
fos.write(输入字符的ASCII码);                           //写入数据
fos.close;                                             //释放资源

值得注意的是:1.文件地址可以是字符串路径,也可以是文件的对象。2.如果不存在文件,则会新创建一个文件,但要保证super路径存在。3.如果文件存在,则会清空文件。

并且每次使用完流后,必须释放资源!

下面介绍三种写入方式:

void write(int a);                      //一次写入一个字节
void write(byte[] b);                   //一次写入一个字节数组
void write(byte[] b,int off,int len);   //一次写入一个部分字节数组
FileOutputStream fos1 = new FileOutputStream("文件地址");
fos1.write(97);                            
fos1.close;            //产生文件,文件中为a。

FileOutputStream fos2 = new FileOutputStream("文件地址");
byte[] bytes = {97,98,99,100,101,102}
fos2.write(bytes);                            
fos2.close;            //产生文件,文件中为abcdef。

FileOutputStream fos3 = new FileOutputStream("文件地址");
byte[] bytes = {97,98,99,100,101,102}
fos3.write(bytes,2,3);                            
fos3.close;            //产生文件,文件中为cde。

 如果我们不知道对应的ASCII码或者字符串太多,很乱很杂。则需要用到getsBytes()方法。

FileOutputStream fos2 = new FileOutputStream("文件地址");
String str ="aidhioawhdoiawd";
Byte[] bytes = str.getBytes();
fos2.write(bytes);                            
fos2.close;            //产生文件,文件中为aidhioawhdoiawd。

如果我们想换行输入,则需要加上换行符。"/r/n"(windows)、"/n"(linux)、"/r"(MAC);在windows中"/r" "/n"都可以进行换行,因为在运行时会自动补齐"/r/n"。

FileOutputStream fos2 = new FileOutputStream("文件地址");
String str1 ="aaaaaaaaaaa";
String str2 ="bbbbbbbbbbb";
Byte[] bytes1 = str1.getBytes();
Byte[] bytes2 = str2.getBytes();
fos2.write(bytes1);    
fos2.write(bytes2);                         
fos2.close;            //产生文件,文件中为aaaaaaaaaaabbbbbbbbbbb。

FileOutputStream fos2 = new FileOutputStream("文件地址");
String str0 ="/r/n";
String str1 ="aaaaaaaaaaa";
String str2 ="bbbbbbbbbbb";
Byte[] bytes0 = str0.getBytes();
Byte[] bytes1 = str1.getBytes();
Byte[] bytes2 = str2.getBytes();
fos2.write(bytes1);
fos2.write(bytes0);  
fos2.write(bytes2);                         
fos2.close;            //产生文件,文件中为aaaaaaaaaaa
                                         bbbbbbbbbbb。

如果我们想要续写一个文件,则需要把FileOutputStream中默认的续写开关打开,是方法的第二个参数,加一个true。

FileOutputStream fos1 = new FileOutputStream("文件地址");
String str1 ="aaaaaaaaaaa";
Byte[] bytes1 = str1.getBytes();
fos1.write(bytes1);                            
fos1.close;            //产生文件,文件中为aaaaaaaaaaa。

FileOutputStream fos2 = new FileOutputStream("文件地址",true);
String str2 ="bbbbbbbbbbbbb";
Byte[] bytes2 = str2.getBytes();
fos1.write(bytes2);                            
fos1.close;            //产生文件,文件中为aaaaaaaaaaabbbbbbbbbbbbb。

 InputStream(字节输入流)

FileInputStream

文件字节输入流,用于文件字节的读取。使用的同时也需要throws IOException。

FileInputStream fis = new FileInputStream("文件地址");//创建对象
int a =fis.read();                                   //读取数据
System.out.print(a);                                 
fis.close;                                           //释放资源
//输出文件中的第一个字符的ASCII码
如果想要输出原本的char,则需要强转。
System.out.print((char)a);       //输出文件中的第一个字符的char值

循环读取文本。因为空白文本read会返回-1值,则利用-1来判断是否到文本最末端。

int a;
FileInputStream fis = new FileInputStream("文件地址");//创建对象
while((a =fis.read())!= -1)   {                              //读取数据
System.out.print((char)a);     }                            
fis.close;                                           //释放资源

字符流 

字符流多用于纯文本文件包含非英文的情况下使用,因为规定的ASCII码只能容纳英文,无法读取中文,则需要另外的编码解码方式进行读取,GBK(一个汉字两个字节),unicode中的UTF-8(一个汉字三个字节)是最常用的解码编码方式。同时GBK与UTF-8兼容ASCII码。

GBK

一个汉字用两个字节进行表示,前八位的第一位为1,遇到为1的字节自动读取两个字节组成汉字。

UTF-8

一个汉字用三个字节进行表示,编码格式为1110xxxx 10xxxxxx 10xxxxxx,遇到1110开头自动读取三个字节组成汉字。

Reader(字符输入流)

FileReader

用于纯文本文件的输入,使用时需要throws掉IOException。

FileReader fr = new FileReader(读取文件地址);     //创建对象
int a =0;                                        
while((a = fr.read())!= -1){                     //循环读
System.out.print((char)a);}                      //输出字符
fr.close();                                      //释放资源

需要注意的是,read()会自动根据默认的编解码方式进行工作。并且可以读取空格/r/n。

read()一个字节一个字节读取数据,如果碰到中文会按编码解码类型进行多个读取,并且会返回一个int值表示当前读取到的字符。

read也可以带参数,相当于一次读取一个数组,注意为char类型。

FileReader fr = new FileReader(读取文件地址);     //创建对象
int len =0;  
char[] chars =new char[2];                       //一次读两个                                     
while((len = fr.read(chars))!= -1){                //循环读
System.out.print(new String(chars,0,len));}       
fr.close();                                      //释放资源

Writer(字符输出流) 

FileWriter

用于纯文本文件的输出,使用时需要throws掉IOException。

FileWriter fr = new FileWriter(读取文件地址);     //创建对象                                       
fr.write(int值);                   //写入int值对应的字符
fr.write(String str);              //写入字符串str
fr.write(char[] ch);               //写入字符数组ch
fr.write(String str,0,len);        //写入字符串str中从0开始,长度为len
fr.write(char[] ch,0,len);         //写入字符数组ch中从0开始,长度为len
fr.close();

同样的,想要续写文件则将续写开关变为true。 

FileWriter fr = new FileWriter(读取文件地址,true);     //创建对象   

应用

文件拷贝

如果我们想拷贝一个文件到另外一个地址。

FileInputStream fis =new FileInputStream(需要拷贝的文件地址);
FileOutputStream fos =new FileOutputStream(拷贝到的地址);         //创建对象
int a =0;                  //存储字节
while((a = fis.read()) != -1){
fos.write(a);
}
fos.close();
fis.close();                          //先开后关

上述方法文件拷贝缺点为:每次read一个字节,write一个字节,时间会很长。

所以我们使用改进的read方法。

fis.read(byte[] b);              //表示一次读一个字节数组

数组大小可以自己定义,一般为1024的整数倍(1024为1k,1024*1024为1M,以此类推)。

接下来我们就可以改写文件拷贝代码。

FileInputStream fis =new FileInputStream(需要拷贝的文件地址);
FileOutputStream fos =new FileOutputStream(拷贝到的地址);         //创建对象
byte[] bytes = new byte[1024*1024*10];                   //10M的数组
int len =0;                                              //读取到字节的长度
while((len = fis.read(bytes)) != -1){
fos.write(bytes,0,len);                        //写入数据,从数组第零个开始,到len结束
}
fos.close();
fis.close();                          //先开后关
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值