2014-04-22 29 views
0

我想用Java编写一个程序,检查src是否存在(如果不是抛出FileNoot)
并复制内容src.txt到des.txt
并在开幕和闭幕打印两个文件的大小(Java).txt读写器在txt(或更多)字节中显示错误的大小

输出是:

src.txt is in current directory 
Before opening files:Size of src.txt:43 Bytes Size of des.txt:0 Bytes 
After closing files:Size of src.txt:43 Bytes Size of des.txt:0 Bytes 

src.txt经过des.txt写入其内容,des应该是43字节

首先,我想问一下,如果我能写

PrintWriter outStream = new PrintWriter(new FileWriter("des.txt")); 

其次忽略文件声明,我想问一下如何将下面的开关情况下适应(系统indepent行)
为了增加一个阅读后的换行符。


第三,我想问一下try/catch块的重要性,同时关闭文件
真对不起了这样的问题,但在C没有错误处理(我认为)的close()是一定的工作


我为这些类型的问题,抱歉,但我在Java初学者

import java.io.*; 
public class Main 
{ 
    public static void main()throws FileNotFoundException 
    { 

    File src = new File("src.txt"); 
    if(src.exists()) 
     System.out.println("src.txt is in current directory"); 
    else throw new FileNotFoundException("src.txt is not in current directory"); 

    BufferedReader inStream = null; 
    PrintWriter outStream = null; 
    try{ 
     File des = new File("des.txt"); 
     inStream = new BufferedReader(new FileReader(src)); 
     outStream = new PrintWriter(new FileWriter(des)); 

     System.out.print("Before opening files:Size of src.txt:"+src.length()+" Bytes\t"); 
     System.out.println("Size of des.txt:"+des.length()+" Bytes"); 
     int c; 
     while((c = inStream.read()) != -1){ 
      switch(c){ 
       case ' ': outStream.write('@'); 
          break; 
       case '\r': 
       case '\n':outStream.write('\n'); 
          outStream.write('\n'); 
          break; 
       default:outStream.write(c); 
      } 
     } 
     System.out.print("After closing files:Size of src.txt:"+src.length()+" Bytes\t"); 
     System.out.println("Size of des.txt:"+des.length()+" Bytes"); 

    } catch(IOException io) { 
     System.out.println("Read/Write Error:"+io.toString()); 
    } finally { 
     try{ 
       if (inStream != null) { 
       inStream.close(); 
       } 

       if (outStream != null) { 
       outStream.close(); 
       } 
     } catch (IOException io){ 
      System.out.println("Error while closing Files:"+io.toString()); 
     } 
    } 
} 
} 
+0

让人惊讶的是,这个预言文件http://docs.oracle.com/javase/tutorial/essential/io/charstreams.html 在没有异常处理中最后块为接近();方法 ,但我的编译器抱怨处理 – hitter

回答

3

你有你的主要问题内3个问题

  1. 完成后文件大小不正确的问题是由文件内容的缓冲引起的,默认情况下,它会缓冲一些数据以防止写入硬盘,导致性能下降,检查您的大小文件后关闭文件,以便您用.length()调用看到正确的大小。

  2. 您可以使用

    PrintWriter outStream = new PrintWriter(new FileWriter("des.txt")); 
    

    你的代码中,因为FileWriter的接受在它的构造一个字符串参数。

  3. 建议练习关闭文件处理程序/流,因为它们在您完成它们时不会自动关闭,因为垃圾回收器不会一直运行,而只会在需要的时候运行因为它可能会导致无法读取的文件出现问题,因为这些文件仍然由您无法访问的数据流使用,但仍然在内存中加载,这也可能会导致某些数据流延迟使用缓冲区写入的问题,并且如果他们没有关闭,它会导致问题,认为自己是你的第一个问题。

+0

重新。 #1:你也可以在打印语句之前使用'outStream.flush()'强制它写入。 – azurefrog

+0

@ferrybig我是否需要关闭File对象以及我在这种情况下使用的缓冲流? – hitter

+0

@azurefrog在哪里写和写什么(缓冲区包含很多东西在内存中的权利?) – hitter