2013-03-29 45 views
0

我正在读取file1.txt中的行,并且只将选定的几行复制到file2.txt中。但是java不会复制应该根据我的代码复制的所有行。底部的625行不会被复制。我必须注意到,应该复制的行都显示在控制台上。所以txt文件没有问题。这里出了什么问题?代码如下:Java无法打印所有从file1.txt到file2.txt的行?

InputStream i = new FileInputStream("file1.txt"); 
     InputStreamReader is=new InputStreamReader(i); 
     BufferedReader bsa = new BufferedReader(iq); 

     FileWriter fw=new FileWriter("file2.txt"); 
     BufferedWriter bw=new BufferedWriter(fw); 
     PrintWriter pr=new PrintWriter(bw); 

     String z=""; 
     for(int i=0;i<3137;i++){ 
      z=bsa.readLine(); 
      for(int q=0;q<2538;q++){ 
       if(array1[i].equals(array2[q])==true){ 
        System.out.println(z);//to see printed lines in console 
        pr.println(z);//printing to file2 
       } 
      } 
     } 
+3

你从哪里得到你的幻数? –

+0

硬编码哈哈。正如人们下面所说的,我不得不关闭printwriter。 –

回答

3

您是否关闭了PrintWriter

pr.close(); 

PrintWriter缓冲器的数据,直到其它的缓冲器满后,它写入磁盘。它有一个默认缓冲区大小为8192 characters,因此可以很容易地让几百行保持不写,直到调用close

+0

打败了我,你赢了这一轮:P –

2

你需要你的PrintWriter使用pr.close();

1

为了从一个文件复制到另一个我会推荐关闭:

try (final InputStream inputStream = new FileInputStream(file1); 
      final OutputStream outputStream = new FileOutputStream(file2)) { 
     final byte[] buffer = new byte[1024]; 
     int numRead = -1; 
     while ((numRead = inputStream.read(buffer)) >= 0) { 
      outputStream.write(buffer, 0, numRead); 
     } 
    } 

它使用Java 7的try-与资源的语法;它也可以避免你的魔法数字。

您还可以使用FileChannel,这是一个稍微简单:

try (final FileChannel source = new RandomAccessFile(file1, "r").getChannel(); 
      final FileChannel dest = new RandomAccessFile(file2, "rw").getChannel()) { 
     source.transferTo(0, source.size(), dest); 
    } 
+0

具有'FileChannel'的Java NIO远远优于将字节读入内存并写入文件的过时方法。使用'FileChannel'实际上可以让操作系统聪明地复制文件。另外,OP不想复制所有内容。 –

+0

@TimBender我只是扩展了OP的原始方法;我也加了一个NIO的例子。 –

+0

是的。删除了反对票(因为它并不令人反感),但OP仍然只需要一组选定的行。 –

相关问题