在Java中,IO流可以实现对文件的读取和写入,也因此,我们可以借助IO流来对txt文件进行复制。(类似的,图片等文件亦可)
在IO流中,存在着字节流(byte为传输单位)和字符流(char为传输单位)。
其中,字节流可以实现对图片等多媒体文件进行复制;而字符流则可以很好地对文本性质的文件进行操作。
一、文本文件的复制
这里笔者采用的是字节流进行文本的复制,效率低于字符流,但适用范围更广。
步骤:
1、(可选)创建File对象,指向需要操作的文件
2、在文件操作IO流FileInputStream和FileOutStream创建的对象中指向两个文件
3、设置缓冲区,读取文本中的内容
4、遍历缓冲区,读取所有数据后存入输出流对象
public static void main(String[] args) {
File fileIn = new File("src/com/wust/Class06/Stream/In.txt");
File fileOut = new File("src/com/wust/Class06/Stream/Out.txt");
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = new FileInputStream(fileIn);
outputStream = new FileOutputStream(fileOut);
byte[] buffer = new byte[1024];
int length = 0;
while( (length = inputStream.read(buffer)) != -1){
System.out.println(new String(buffer,0,length));
outputStream.write(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally {
try {
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("End");
}
如上,虽然以这种方法可以实现buffer的整体复制,但此处调用的write方法未输入长度,即默认全部复制buffer内容。
此时,倘若我们的buffer大小设置过大,而我们未全部填满的时候,剩余空间会被默认填满“0”,以这种write方法进行copy的时候,我们会把大量的0也一起copy过来,这里,我们添加一个遍历,获取准确的buffer有效数据长度后再进行复制。
int Count = 0;
for( int i = 0; i < buffer.length; i++){
if( buffer[i] != 0)
Count++;
}
System.out.println(Count);
outputStream.write(buffer,0,Count);
二、图片的复制
与字符的复制不同,图片等文件是以byte的形式进行存储的,如用字符流进行读取和存储,都无法收获理想的效果,虽然我们可以通过字节-字符之间的转换,实现字符流的R&W,但这样未免南辕北辙,因小失大了。
所以在这里,笔者以一次简单的字节流复制的源码为示例。
步骤:
1、创建FileInputStream和FileOutputStream对象,以分别实现图片等文件的读取和存入操作。
(这里,也可以如上文的txt复制,创建File对象,来予以IO流指向,便于后续进行修改)
2、创建缓冲区,以存储读取的数据(byte[] buffer)
3、使用while循环遍历缓冲区中的数据,遍历结束后存入FileOutputStream对象中。
4、最终,我们对流进行关闭,即可保证文件的复制成功。
public static void main(String[] args) {
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream =
new FileInputStream("src/com/Class06/readerOrWriter/1.jpg");
fileOutputStream =
new FileOutputStream("src/com/Class06/readerOrWriter/2.jpg");
int length = 0;
byte[] buffer = new byte[1024];
while( (length = fileInputStream.read(buffer)) != -1){
fileOutputStream.write(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}