字节流操作数据读写
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
/** *利用流来拷贝文件 * @author ALWZ * */ public class CopyByteStream { public static void main(String[] args) { try { FileInputStream fiStream=new FileInputStream("ani.gif");//将一个动态图片读入字节流 FileOutputStream fos =new FileOutputStream("ani_new.gif");//定一个输出流,输出新的拷贝图片
byte input[] =new byte[50]; while (fiStream.read(input)!=-1) {//如果读取的数据不是最后一个就将读的数据放入到input中 fos.write(input);//放入数据
}
fiStream.close(); fos.close();
System.out.println("CopyByteStream.main()"); //运行之后刷新,就会看到一个新的ani_new.gif文件
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
} } |
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
/** *利用缓冲区实现数据的复制 * @author ALWZ * */ public class CopyReadBufferedByteStream { public static void main(String[] args) { try { FileInputStream fis =new FileInputStream("movie.mp4"); BufferedInputStream bis =new BufferedInputStream(fis);//将读出来的字节流放入到缓冲区中,还可以设置缓冲区的大小//如果一个缓冲区设置的大小合理的话,会降低复制的时间 //实现文件的复制,定义一个输出流 FileOutputStream fos =new FileOutputStream("movie_new.mp4"); BufferedOutputStream bos =new BufferedOutputStream(fos);
byte input[]=new byte[100];//每次读取100个字节//如果一个数组设置的合理的话,会减少对磁盘io的操作 int count=0; //计算使用了多少ms读取这个文件 long before=System.currentTimeMillis();
while (bis.read(input)!=-1) { bos.write(input); count++; } bis.close(); fis.close();//先打开的后关闭 bos.close(); fos.close();
System.out.println(System.currentTimeMillis()-before+"ms");//计算使用了多少毫秒
System.out.println("读取了"+count+"次");
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
} } |
字符流操作数据读写
读取的操作:
package RWCharStream;
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException;
/** *用字符流读取数据 * @author ALWZ * */ public class RWByCharStream { public static void main(String[] args) { try { File file=new File("java.txt"); FileInputStream fis=new FileInputStream(file); InputStreamReader isr=new InputStreamReader(fis,"UTF-8");//把文件读取成字符流 char input[]=new char[100]; while(isr.read(input)!=-1){//将字符流读取到字符数组中 System.out.println(input); };
isr.close(); fis.close();
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
} } |
还有另一种写法:因为有可能出现如下情况,到了输出文本的末尾没有结束,而是从头又输出了几个字符。
解决方法如下
package RWCharStream;
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException;
/** * 用字符流读取数据 * @author ALWZ * */ public class RWByCharStream { public static void main(String[] args) { try { File file=new File("java.txt"); FileInputStream fis=new FileInputStream(file); InputStreamReader isr=new InputStreamReader(fis,"UTF-8");//把文件读取成字符流 char input[]=new char[100]; /*while(isr.read(input)!=-1){//将字符流读取到字符数组中 System.out.println(new String(input)); };*/ //这样有可能会输出多余的数据,因为可能最后截取的字符,不够100,它又会重新开始读取几个字符来满足100的填充。
//于是可以用下面的写法 int length=0; while((length=isr.read(input))!=-1){//将字符流读取到字符数组中 System.out.println(new String(input,0,length));//给输出的字符串设置偏移量为0,从头开始读,长度为读取字符串的最大长度。 };
isr.close(); fis.close();
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
} } |
这样运行结果和第一个是一样的,只不过可能最后如果读取的字符串不够100个字符,它也不会自动给你补充到100个了。
写入,拷贝的操作
package RWCharStream;
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException;
/** * 用字符流拷贝 * @author ALWZ * */ public class WCharStream { public static void main(String[] args) { try { FileInputStream fis =new FileInputStream("java.txt"); FileOutputStream fos=new FileOutputStream("java_new.txt"); InputStreamReader isr=new InputStreamReader(fis,"UTF-8");//把文件读取成字符流 OutputStreamWriter osr =new OutputStreamWriter(fos,"UTF-8");
char input[]=new char[100];
int length=0; while((length=isr.read(input))!=-1){//将字符流读取到字符数组中 //String inputString=new String(input,0,length);//将字符输出 osr.write(input,0,length);//将字符输出 };
isr.close(); fis.close(); osr.close(); fos.close(); System.out.println("WCharStream.main() done");
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |
带有缓冲的字符流的读写操作:
package RWCharStream;
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; /** *带有缓冲的字符流的读操作 * @author ALWZ * */ public class RByBufferCharStream {
public static void main(String[] args) { try { FileInputStream fis =new FileInputStream("java.txt"); FileOutputStream fos=new FileOutputStream("java_new_buffer.txt"); InputStreamReader isr=new InputStreamReader(fis,"UTF-8");//把文件读取成字符流 OutputStreamWriter osr =new OutputStreamWriter(fos,"UTF-8");
//定义读写的缓冲流 BufferedReader br =new BufferedReader(isr); //BufferedWriter bw =new BufferedWriter(osr);//使用这个api会导致生成的文件中的换行符都被替换掉,从而没有了格式 PrintWriter pw =new PrintWriter(osr);。//使用print可以输出流而不会被替换换行符
String input; while ((input=br.readLine())!=null) {//读取一行数据 //bw.write(input);//使用这个api会导致生成的文件中的换行符都被替换掉,从而没有了格式 pw.println(input);//使用print可以输出流而不会被替换换行符。
}; pw.flush();//将缓冲区的内容强制输出,保证输出的文件是完整的。也可以用bw.flush。 //另外还可以在定义printWriter的时候定一个参数new PrintWriter(osr,true),这样当文件输出的时候就会自动强制输出缓存区的内容
//bw.close();//使用这个api会导致生成的文件中的换行符都被替换掉,从而没有了格式 pw.close();//使用print可以输出流而不会被替换换行符。 br.close(); isr.close(); fis.close(); osr.close(); fos.close();
System.out.println("WCharStream.main() done");
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |