欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

文件输入输出流的学习

程序员文章站 2022-10-01 10:46:52
1.单个字节形式的字节输入输出(效率较低) (1)单个字节的输入流 package qwe;import java.io.*;public class inputStream1 { public static void main(String[] args) { FileInputStream in ......

1.单个字节形式的字节输入输出(效率较低)

    (1)单个字节的输入流

package qwe;
import java.io.*;
public class inputstream1 {
public static void main(string[] args) {
fileinputstream in=null;
try {
in=new fileinputstream("a.txt");
int n; //用以接收输入流从文件读取的单个字节, read()函数返回的是字节对应的ascll码,当读不到数据时返回-1
while((n=in.read())!=-1) {
system.out.print((char)n);//将ascall码转化为字节并且输出
}

} catch (filenotfoundexception e) {
e.printstacktrace();
} catch (ioexception e) {
e.printstacktrace();
}finally {
if(in!=null) {
try {
in.close();//流的关闭
} catch (ioexception e) {
e.printstacktrace();
}
}
}
}
}

(2)单个字节的输出流

package qwe;

import java.io.fileoutputstream;
import java.io.ioexception;
public class outputstream {
public static void main(string[] args) throws ioexception {
fileoutputstream ou=new fileoutputstream("b.txt");
for(int i=0;i<10;i++) {     
ou.write(97);
}
}
}

(3)基于单个字节输入输出流的文件复制

fileinputstream in=null;
fileoutputstream ou=null;
try {
in=new fileinputstream("a.txt");  //这是被复制的文件名
ou=new fileoutputstream("b.txt");    //这是复制出的文件的文件名,此处是相对路径,如果需要绝对路径,形式为:"c://users//user//desktop//abc.txt"  即可
int n;
while((n=in.read())!=-1) {
ou.write(n);
}
} catch (filenotfoundexception e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}finally {
try{
if(in!=null) {
in.close();
}
if(ou!=null) {
ou.close();
}
}catch (ioexception e) {

}

}

注意:文件输入输出流的学习 1.ascll码里面并没有中文对应的字节,所以单字节形式的输入输出流无法处理中文等特殊字符的乱码问题

2.gbk每个汉字两个字节,而utf-8每个汉字三个字节。

3.如果出现乱码则可以用string(byte[] ,"合适的编码方式")或则其他可以自己设置编码的函数

2.字节数组形式的文件输入输出流

(1)多字节输入流

package qwe;
import java.io.*;
import java.lang.reflect.array;
import java.util.arrays;
public class inputstream1 {
public static void main(string[] args) {
fileinputstream in=null;
try {
in=new fileinputstream("a.txt");

int n;
byte b[]=new byte[5];   //此处一般写1024 ,但是本人认为即便是1024也不能完全避免中文乱码,因为当文件中文字符多到大于1024字节后,下一次读取也会因为字节分割的问题造成乱码的出现                          
while((n=in.read(b))!=-1) {                         //以字节数组的形式读的话,每次读取的5个字节会放入缓冲区,所以不满5个字节的时候,更新完新前几个字节后,剩下的内容还是上一个5字节的内容,此时的返回值为所读文件的字节个数。
system.out.println(new string(b,0,n));          
}
} catch (filenotfoundexception e) {
e.printstacktrace();
} catch (ioexception e) {
e.printstacktrace();
}finally {
if(in!=null) {
try {
in.close();//流的关闭
} catch (ioexception e) {
e.printstacktrace();
}
}
}
}
}

(2)多字节输出流(部分代码)

public class outputstream {
public static void main(string[] args) throws ioexception {
fileoutputstream ou=new fileoutputstream("b.txt");
for(int i=0;i<10;i++) {
ou.write("he真实的\r\n".getbytes());         //在windows系统下用/r/n来表示的换行。
}
}

(3)多字节的文件复制

public void test() {
fileinputstream in=null;
fileoutputstream ou=null;
try {
in=new fileinputstream("a.txt");
ou=new fileoutputstream("b.txt");
byte a[]=new byte[1024];
int n;
while((n=in.read(a))!=-1) {
ou.write(a,0,n);
}
} catch (filenotfoundexception e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}finally {
try{
if(in!=null) {
in.close();
}
if(ou!=null) {
ou.close();
}
}catch (ioexception e) {
}
}
}
}

注意:

      1.fileinputstream每次都是从硬盘读入,而bufferedinputstream大部分是从缓冲区读入。读取内存速度比读取硬盘速度快得多,因此bufferedinputstream效率高。
  bufferedinputstream的默认缓冲区大小是8192字节。当每次读取数据量接近或远超这个值时,两者效率就没有明显差别了。