黑马程序员技术交流社区
标题:
搞定IO,解决IO的copy问题
[打印本页]
作者:
孙涛00
时间:
2013-11-26 14:20
标题:
搞定IO,解决IO的copy问题
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import org.junit.Test;
public class IO_Buffered {
//====================================1.从键盘输入输出数据==========================================
@Test
public void inputByKey() {
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new FileWriter("C:\\1.txt"));
String[] str = new String[5];
for (int i = 0; i < str.length; i++) {
str[i] = br.readLine();
}
for (int i = 0; i < str.length; i++) {
bw.write(str[i]);
bw.newLine();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {
if(bw!=null)bw.close();
if(br!=null)br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
(1)BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
0) BufferedReader extends Reader
1) 从字符输入流中读取文本,缓冲各个字符,从而实现字符,数组和行的搞笑读取 可以指定缓冲区的大小,或者默认大小
通常Reader的所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求,因此,建议用BufferedReader
包装所有的Read()操作开销可能很高的Reader(如FileReader和InputStreamReader)
2) InputStreamReader是字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符。它使用的字符集可以由 名称指定或显示给定,
或者可以接受平台默认的字符集。每次调用InputStreamReader中的read()方法都会导致从底层输入流读取一个或多个字节,要启用从字节到字符的有效转换,
可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节为了达到高效可以考虑在BufferedReader内包装InputStreamReader
3) InputStream is =System.in 此抽象类表示字节输入流的所有类的超类
(2)BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\1.txt"));
1) BufferedWriter将文本写到字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入
通常Writer将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用BufferedWriter包装所有其write()(如FileWriters和OutputStreamWriters)
2) FileWriter
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
用来写入字符文件的便捷类,此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的,要自己指定这些值
*/
}
//====================================2.copyMp3(或者avi)=========================================
@Test
public void copyMp3(){
BufferedInputStream bufis = null;
BufferedOutputStream bufos = null;
try
{
// bufis = new BufferedInputStream(new FileInputStream("C:\\1.mp3"));
// bufos = new BufferedOutputStream(new FileOutputStream("C:\\关不上的窗.mp3"));
bufis = new BufferedInputStream(new FileInputStream("C:\\1.avi"));
bufos = new BufferedOutputStream(new FileOutputStream("C:\\java.avi"));
byte[] buf = new byte[1024];
int num = 0;
while((num = bufis.read(buf))!=-1)
{
bufos.write(buf,0,num);
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
if(bufis!=null)
try {
bufis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(bufos!=null)
try {
bufos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
// bufis = new BufferedInputStream(new FileInputStream("C:\\1.mp3"));
// bufos = new BufferedOutputStream(new FileOutputStream("C:\\关不上的窗.mp3"));
(1)BufferedInputStream(InputStream in)
创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
(2)FileInputStream:
FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。
FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
FileInputStream(String name)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
(3)FileOutputStream:该类实现缓冲的输出流,通过设这这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统
(4)BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流
(5)FileOutputStream:文件输出流是用于将数据写入到File或FileDescriptor的输出流。文件是否可用或能否被创建取决于基础平台
FileOutputStream用于写入诸如图像数据之类的原始字节的流,要写入字符流请考虑使用FileWriter
*/
}
//======================================3.copy文本文档===========================================
@Test
public void copyTextFile(){
BufferedWriter bufw = null;
BufferedReader bufr = null;
try
{
bufw = new BufferedWriter(new FileWriter("C:/2.txt"));
bufr = new BufferedReader(new FileReader("C:\\12.txt"));
String line = null;
while((line=bufr.readLine())!=null)
{
//System.out.println(line);
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
if(bufr!=null)
{
try {
bufr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(bufw!=null)
try {
bufw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* (1)BufferedReader:读取字符缓冲流
* BufferedReader(FileReader fr)//读取文本
* 或 BufferedReader(InputStreamReader isr)//字节转换字符流
* (2)FileReader(String fileName)
* 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
*/
}
//======================================3.copy文本夹===========================================
@Test
public void copyFolder(){
//本地源文件
String url1 = "D:/p2p/";
String url2 = "D:/p2pCopy/";
(new File(url2)).mkdirs();//创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
File[] files = (new File(url1)).listFiles();
for (File file : files) {
if(file.isFile()){
File targetFile = new File(url2 + file.getName());
copyFile(file, targetFile);
}
if(file.isDirectory()){
// separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
String sourceDir = url1 + File.separator + file.getName();
String targetDir = url2 + File.separator + file.getName();
copyDir(sourceDir,targetDir);
}
}
}
public void copyFile(File sourceFile,File targetFile){
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(sourceFile));
bos = new BufferedOutputStream(new FileOutputStream(targetFile));
byte[] byt = new byte[1024*5];//使用的是字节流数组,在此可以将字符流文件用字节流数组读取
int len = 0;
while((len=bis.read(byt))!=-1){
bos.write(byt,0,len);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {
if(bis!=null)bis.close();
if(bos!=null)bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
* (1)FileInputStream:
* byte[] b = new byte[1024]//读取字节文件
* char[] b = new char[1024]//读取字符文件
*/
}
}
public void copyDir(String sourceDir,String targetDir){
//创建
(new File(targetDir)).mkdirs();
File[] files = (new File(sourceDir)).listFiles();
for (File file : files) {
if(file.isFile()){
File sourceFile = file;
File targetFile = new File(new File(targetDir).getAbsolutePath()+File.separator+file.getName());
copyFile(sourceFile,targetFile);
}
if(file.isDirectory()){
String dir1 = sourceDir + File.separator + file.getName();
String dir2 = targetDir + File.separator + file.getName();
copyDir(dir1,dir2);
}
}
}
}
复制代码
作者:
孙涛00
时间:
2013-11-27 14:19
这么好的帖子居然没人跟帖,我花了一天时间复习总结的。。。
作者:
何伟超
时间:
2013-11-27 14:28
我跟一个,我现在正学者呢,复制回去好好参考一下!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2