/* 字节流 读文件内容,节省空间 */ import java.io.*; class Hello{ public static void main(String[] args) throws IOException{ String fileName = "D:" + File.separator + "hello.txt"; File f = new File(fileName); InputStream in = new FileInputStream(f); byte[] b = new byte[(int)f.length]; in.read(b); System.out.println("文件长度为:"+f.length()); in.close(); System.out.println(new String(b)); } }
/* 字节流 向文件中写入字符串 */ import java.io.*; class hello{ public static void main(String[] args) throws IOException{ String fileName = "D:" + File.separator + "hello.txt"; File f = new File(fileName); OutputStream out = new FileOutputStream(f); String str = "你好"; byte[] b = str.getBytes(); out.write(b); out.close(); } }
/* 字节流 向文件中追加新内容 */ import java.io.*; class hello{ public static void main(String[] args) throws IOException{ String fileName = "D:" + File.separator + "hello.txt"; File f = new File(fileName); OutputStream out = new FileOutputStream(f, true); String str = "你好"; byte[] b = str.getBytes(); out.write(b); out.close(); } }
/* 字符流 向文件中写入字符串 */ import java.io.*; class hello{ public static void main(String[] args) throws IOException{ String fileName = "D:" + File.separator + "hello.txt"; File f = new File(fileName); Writer out = new FileWriter(f); String str = "你好"; out.write(str); out.close(); } }
/* 字符流 向文件中追加字符串 */ import java.io.*; class hello{ public static void main(String[] args) throws IOException{ String fileName = "D:" + File.separator + "hello.txt"; File f = new File(fileName); Writer out = new FileWriter(f, true); String str = "你好"; out.write(str); out.close(); } }
/** * 字符流 * 从文件中读出内容 * */ import java.io.*; class hello{ public static void main(String[] args) throws IOException { String fileName="D:"+File.separator+"hello.txt"; File f=new File(fileName); char[] ch=new char[100]; Reader read=new FileReader(f); int count=read.read(ch); read.close(); System.out.println("读入的长度为:"+count); System.out.println("内容为"+new String(ch,0,count)); } }
/** * 字符流 * 从文件中读出内容 * 当然最好采用循环读取的方式,因为我们有时候不知道文件到底有多大 * */ import java.io.*; class hello{ public static void main(String[] args) throws IOException { String fileName="D:"+File.separator+"hello.txt"; File f=new File(fileName); char[] ch=new char[100]; Reader read=new FileReader(f); int temp=0; int count=0; while((temp=read.read())!=(-1)){ ch[count++]=(char)temp; } read.close(); System.out.println("内容为"+new String(ch,0,count)); } }
实际上字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的,但是字符流在操作的 时候下后是会用到缓冲区的,是通过缓冲区来操作文件的。
读者可以试着将上面的字节流和字符流的程序的最后一行关闭文件的代码注释掉,然后运行程序看看。你就会发现使用字节流的话,文件中已经存在内容,但是使用字符流的时候,文件中还是没有内容的,这个时候就要刷新缓冲区。
答案是字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
/** * 文件的复制 * */ import java.io.*; class hello{ public static void main(String[] args) throws IOException { if(args.length!=2){ System.out.println("命令行参数输入有误,请检查"); System.exit(1); } File file1=new File(args[0]); File file2=new File(args[1]); if(!file1.exists()){ System.out.println("被复制的文件不存在"); System.exit(1); } InputStream input=new FileInputStream(file1); OutputStream output=new FileOutputStream(file2); if((input!=null)&&(output!=null)){ int temp=0; while((temp=input.read())!=(-1)){ output.write(temp); } } input.close(); output.close(); } }
整个IO类中除了字节流和字符流还包括字节和字符转换流。
OutputStreramWriter将输出的字符流转化为字节流
InputStreamReader将输入的字节流转换为字符流
但是不管如何操作,最后都是以字节的形式保存在文件中的。
/** * 将字节输出流转化为字符输出流 * */ import java.io.*; class hello{ public static void main(String[] args) throws IOException { String fileName= "d:"+File.separator+"hello.txt"; File file=new File(fileName); Writer out=new OutputStreamWriter(new FileOutputStream(file)); out.write("hello"); out.close(); } }
/** * 将字节输入流变为字符输入流 * */ import java.io.*; class hello{ public static void main(String[] args) throws IOException { String fileName= "d:"+File.separator+"hello.txt"; File file=new File(fileName); Reader read=new InputStreamReader(new FileInputStream(file)); char[] b=new char[100]; int len=read.read(b); System.out.println(new String(b,0,len)); read.close(); } }