2011-07-05 25 views
2

下面的方法将文件大小返回为2.由于它很长,我假设java计算的文件大小为2 * 64位。但实际上我保存了32位int + 16位char = 48位。为什么Java会执行此转换?另外,不管是char还是int,Java是否将所有内容都隐式地存储在文件中?我如何获得48位的准确大小?使用Java确定和打印文件大小

public static void main(String[] args) 
     { 
      File f = new File("C:/sam.txt"); 
      int a= 42; 
      char c= '.'; 
      try { 
       try { 
        f.createNewFile(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       PrintWriter pw = new PrintWriter(f); 
       pw.write(a); 
       pw.write(c); 
       pw.close(); 
       System.out.println("file size:"+f.length()); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 

     } 
+0

它有助于了解如何使用十六进制编辑器来检查文件中的真实内容。 –

回答

5

不,你写了两个字符。编写者用于文本数据,而不是二进制数据。该documentation of write(int)说:

写入单个字符。

由于平台的默认字符编码存储这两个字符作为一个单字节(每个),文件长度是2(2个字节:一个文件的长度以字节为单位,as the documentation says)。用文本编辑器打开文件,看看里面有什么。

Java API doc对于了解类或方法的作用非常有用。你应该阅读它。

+0

究竟发生了什么...... Java将int作为一个unicode代码,它可以有1到4个字节之间的任何长度。如果不需要,可以使用print()而不是write()。 – yankee

+2

@yankee:不能:int只是简单地转换为char。 –

+0

好的。我改变了pw.print(a)和pw.print(c),现在该方法返回文件长度= 3 ...我的问题是一个int是32位= 4字节,那么如何将这4个字节存储在该文件,然后当我写了一个单一的字符如何被保存。为什么当java使用char作为16位或2个字节时结果= 3个字节...? – Pan

1

都要求写是写一个字符,这是在内存16位,但由于

new PrintWriter(f) 

使用默认字符集编码(可能是ASCII或您的系统上UTF-8),它导致正在写入2个字节。