如题,java写文件还是挺简单的,但是它写文件的时候,具体的细节是什么呢?
是这样的,我写了个java程序,往txt文件中写入1000000个int数据
如果我没想错的话,不是应该1000000 * 4B才对吗?也就是约等于4MB?
为什么生成的是7.52MB?
谁知道具体细节的能说一下吗?
如果想生成4MB的文件,又是怎么操作呢?Java文件读写

解决方案 »

  1.   

    如果想把int 型 1存到文本里,需要转换为字符的。而且,为啥*4不是*8么?
      

  2.   

    int *4, long *8txt是后缀,不一定代表文件就是文本(虽然八九不离十),要看他最后用的是什么Writer了
      

  3.   

    看你怎么写进去的。txt默认是ansi编码,你写的是用什么编码是不是也会有影响。
      

  4.   

    int *4, long *8txt是后缀,不一定代表文件就是文本(虽然八九不离十),要看他最后用的是什么Writer了

    对的,早上还想到自己记错了,呵呵~
      

  5.   

    这是我写的其中一种写文件的代码:try{
       FileOutputStream out = new FileOutputStream("D:/test.dat");
       PrintStream p = new PrintStream(out);
       for(int i = 0;i < 1000000;i++){
            p.println(i);
      }
      p.close();
     }catch(FileNotFoundException e){
        e.printStackTrace();
     }
      

  6.   

    for(int i = 0;i < 1000000;i++){
            p.println(i);
      }println会额外的写入换行符\r\n
      

  7.   

    额,我尝试了一下用print来写,结果出来的文件大小是5.61M
      

  8.   

    额,我尝试了一下用print来写,结果出来的文件大小是5.61M
    另外尝试把循环条件改成for(int i = 10000000;i < 11000000;i++)2
    这样的话,文件就变成了7.62M了,所以基本确定了是编码问题导致这样的
      

  9.   

    确实是使用ascii,打开文件也确实看到了我写进去的int数据
      

  10.   

    ascii就不是4byte了啊。。1是1byte,100是3byte。。
      

  11.   

    ascii就不是4byte了啊。。1是1byte,100是3byte。。
    我已经明白了啊,不过现在寻找一下如何写二进制的方式,觉得使用二进制IO的话就不会出现这种问题了
      

  12.   

    问题已经解决了,我知道我使用的writer在写入int的时候,是转化成ascii码的形式来保存的,而使用DataOutputStream的writeInt方法的话,就不会出现这样的问题了,跟预期的一样String fileName = "d:/test.txt";
    try {
    DataOutputStream out = new DataOutputStream(
    new BufferedOutputStream(new FileOutputStream(fileName,true)));
    for (int i = 0 * 1024 * 1024; i < 1 * 1024 * 1024; i++) {
    out.writeInt(i);
    }
    out.close();

    DataInputStream input = new DataInputStream(new BufferedInputStream(new   
                                                                 FileInputStream(fileName)));
    int i = 0;
    while(i < 10 * 1024){
    System.out.println(input.readInt());
    i++;
    }
    input.close();
    } catch (Exception e) {
    e.printStackTrace();
    }