2

java.nio を使用して、データを入力して任意のサイズのファイルを作成する必要があります。文書を読んでいますが、めくったり、置いたり、書いたりする必要があるときに混乱し、エラーが発生します。.io を使用してこのプログラムを正常に実行しましたが、.nio を使用すると実行速度が向上するかどうかをテストしています。

これはこれまでの私のコードです。args[0] は作成するファイルのサイズ、args[1] は書き込むファイルの名前です。

public static void main(String[] args) throws IOException
 {
     nioOutput fp = new nioOutput();
     FileOutputStream fos = new FileOutputStream(args[1]);
     FileChannel fc = fos.getChannel();

     long sizeOfFile = fp.getFileSize(args[1]);      
     long desiredSizeOfFile = Long.parseLong(args[0]) * 1073741824; //1 Gigabyte = 1073741824 bytes      
     int byteLength = 1024;      
     ByteBuffer b = ByteBuffer.allocate(byteLength);

     while(sizeOfFile + byteLength < desiredSizeOfFile)
     {  
    // b.put((byte) byteLength);
     b.flip();
     fc.write(b);
     sizeOfFile += byteLength;       
     }
     int diff = (int) (desiredSizeOfFile - sizeOfFile);
     sizeOfFile += diff;

     fc.write(b, 0, diff);

     fos.close();
     System.out.println("Finished at " + sizeOfFile / 1073741824  + " Gigabyte(s)");                
 }

long getFileSize(String fileName) 
{
    File file = new File(fileName);        
    if (!file.exists() || !file.isFile()) 
    {
        System.out.println("File does not exist");
        return -1;
    }
    return file.length();
}
4

2 に答える 2

1

ヌルを使用してファイルを特定の長さに事前に拡張することだけが必要な場合は、3 行でそれを実行し、すべての I/O を節約できます。

RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.setLength(desiredSizeOfFile);
raf.close();

これは、あなたが今やろうとしていることと同じくらい速く数ガジリオン回動作します。

于 2013-03-28T03:24:50.783 に答える
-1

皆さんごめんなさい、私はそれを理解しました。

 while(sizeOfFile + byteLength < desiredSizeOfFile)
     {           
     fc.write(b);
     b.rewind();
     sizeOfFile += byteLength;       
     }
     int diff = (int) (desiredSizeOfFile - sizeOfFile);
     sizeOfFile += diff;

     ByteBuffer d = ByteBuffer.allocate(diff);

     fc.write(d);
     b.rewind();

     fos.close();
     System.out.println("Finished at " + sizeOfFile / 1073741824  + " Gigabyte(s)");                
 }
于 2013-03-27T18:25:33.720 に答える