有A和B两个文件,现要将B文件追加在A文件末尾,生成新文件C。
方案一:读A和B文件到内存中,然后合并生成新文件C;
方案二:读B文件到内存中,并将之写到A文件的输出流中;
显然,第二种方案的效率要比第一种方案的效率高,因为只需要把B文件的数据读到内存中即可。
我想问问有没有办法使两个文件的数据都不用读到内存中进行合并呢?谢谢大家。
方案一:读A和B文件到内存中,然后合并生成新文件C;
方案二:读B文件到内存中,并将之写到A文件的输出流中;
显然,第二种方案的效率要比第一种方案的效率高,因为只需要把B文件的数据读到内存中即可。
我想问问有没有办法使两个文件的数据都不用读到内存中进行合并呢?谢谢大家。
解决方案 »
- 用java开发数据库访问层需要具备哪些知识
- 一道押宝题的思考!
- 遇到一看似挺简单的问题。。。。。
- 监听器不起作用是怎么回事?急!
- 内部类
- 0.0001为什么输出时是1.0E-4
- 在java中如何向一个Soket发送一个请求
- 急,请教,怎样按行读、修改文本文件啊?
- 请问JBUILER怎样打包,怎样把jre也包含进去?谢了。
- 国内有哪些Java的著名+实用的网站?编辑器是IBM的VisualAge J++还是Borland的JBuilder更好一些??
- java -jar执行jar包出现 java.io.IOException: invalid header field name无法解决
- Java环境设置
用BufferedReader和BufferedWriter
to8楼:这种方法在windows可以,但我们的程序有可能在其他系统上跑啊,谢谢哦
继续求救~~~~~~~
File file = new File("D:\\test.txt");
File file1 = new File("D:\\test1.txt");
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(file,true),1000));
BufferedReader in
= new BufferedReader(new FileReader(file1),1000);
char[] ch = new char[1000];
int length;
while((length=in.read(ch))!=-1){
out.write(ch);
}
out.close();
in.close();
文件最终是要操作系统管理的.
二个文件合并,不读文件的内容,那只能把第一个文件结束标记去掉,在文件分配表中修改第一个文件占用的磁盘空间,把第二个文件占的磁盘空间链接到第一个文件占的空间上.
好了,我说的是在windows系统上的操作,在其它系统上如果操作?那要看其它系统是怎么管理文件的.
所以说,你的程序的操作本来就是和操作系统相关的,java又没有相关的API实现,不读到内存实现合并,不可能.
就算DOS 也是要的 除非在一个分区
要想使具体机型无关 DataArrayInputStream 和 DataArrayOutputStream 这两个类可以使用
其他就想不倒了
等下面的答复
若B文件较大(A在不大无所谓),可否考虑用FileChannel?
A文件是用于写的,因而获取到A文件的FileChannel(写的Channel),
B文件较大,用于读的,可获取B文件的FileChannel(读的Channel),并MAP到内存中[若文件小(K级加紧),则MAP到内存开销就不合算了],然后合并。因为FileChannel是使用本地操作系统的基础设施,比纯JAVA中的BUF应该性能快些。以上仅供楼主参考
如果两个文件是有顺序的,那就不说了.
如果用BufferedReader, BufferedWriter,两个文件都必须读一遍和写一遍吧?
注意关注transferFrom方法和transferTo方法。
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Arrays;
public class test {
public static final int BUFSIZE = 1024 * 8;
public static void mergeFiles(String outFile, String[] files) {
FileChannel outChannel = null;
out.println("Merge " + Arrays.toString(files) + " into " + outFile);
try {
outChannel = new FileOutputStream(outFile).getChannel();
for(String f : files){
FileChannel fc = new FileInputStream(f).getChannel();
ByteBuffer bb = ByteBuffer.allocate(BUFSIZE);
while(fc.read(bb) != -1){
bb.flip();
outChannel.write(bb);
bb.clear();
}
fc.close();
}
out.println("Merged!! ");
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {if (outChannel != null) {outChannel.close();}} catch (IOException ignore) {}
}
}
public static void main(String[] args) {
mergeFiles("D:/output.txt", new String[]{"D:/in_1.txt", "D:/in_2.txt", "D:/in_3.txt"});
}
}
package 文本文件合并;import static java.lang.System.out;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Arrays;public class Test { public static final int BUFSIZE = 1024 * 8; public static void mergeFiles(String outFile, String[] files) {
FileChannel outChannel = null;
out.println("Merge " + Arrays.toString(files) + " into " + outFile);
try {
outChannel = new FileOutputStream(outFile,true).getChannel();
for (String f : files) {
FileChannel fc = new FileInputStream(f).getChannel();
ByteBuffer bb = ByteBuffer.allocate(BUFSIZE);
while (fc.read(bb) != -1) {
bb.flip();
outChannel.write(bb);
bb.clear();
}
fc.close();
}
out.println("Merged!! ");
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (outChannel != null) {
outChannel.close();
}
} catch (IOException ignore) {
}
}
} public static void main(String[] args) {
mergeFiles("D:/output.txt", new String[] { "D:/in_1.txt","D:/in_2.txt", "D:/in_3.txt" });
}
}
我这个方法是33楼的哥们的。
但是他的那个方法会覆盖原文件
我的是追加。
不知道楼主能不能看出来。!