2017-11-06 6 views
0

次のMWEは、nioを使用してファイルを書き込む方法を理解しています。しかし、ファイルを開くと失敗します。ディレクトリに何も問題がないことを証明するために、古いスクールファイルは同じプロジェクト、同じディレクトリに書き込まれます。 NIのコードで何が問題になっていますか?java nioはファイルに書き込めず、古い学校のファイルが動作します。何が間違っていますか?

エラー:スレッド「main」の例外java.nio.file.NoSuchFileException:test.dat。このオプションは、既存のファイルに書き込むか、新しいファイルを作成する予定のCREATEに設定されていることに注意してください。 documentationから

import java.io.*; 
import java.nio.*; 
import java.nio.file.*; 
import java.nio.channels.*; 

public class FastWritenio { 
    public static void writeUsingPrintWriter() throws IOException { 
     PrintWriter pw = new PrintWriter(new FileWriter("test.txt")); 
     pw.print("testing"); 
     pw.close(); 
    } 
    public static void writeUsingnio(int numTrials, int bufferSize, int putsPer) throws IOException { 
     String filename = "test.dat"; 
     java.nio.file.Path filePath = Paths.get(filename); 
     WritableByteChannel channel = Files.newByteChannel(filePath, StandardOpenOption.CREATE); 
     ByteBuffer buf = ByteBuffer.allocate(bufferSize); 
     for (int t = 0; t < numTrials; ++t) { 
      for (int i = 0; i < putsPer; i ++) { 
       buf.putInt(i); 
      } 
      buf.flip(); // stop modifying buffer so it can be written to disk 
      channel.write(buf); // Write your buffer's data. 
     } 
     channel.close(); 
    } 
    public static void main(String[] args) throws IOException { 
     writeUsingPrintWriter(); 
     writeUsingnio(16, 8*1024, 1024); 
    } 
} 
+0

オープンに失敗した場合の例外は何ですか? – Compass

+0

あなたは私にそれを打つ!編集 – Dov

+0

を参照してください。 'text.txt!= test.dat' – QBrute

答えて

3

Quted:

Both newByteChannel methods enable you to specify a list of OpenOption options. The same open options used by the newOutputStream methods are supported, in addition to one more option: READ is required because the SeekableByteChannel supports both reading and writing.

Specifying READ opens the channel for reading. Specifying WRITE or APPEND opens the channel for writing. If none of these options is specified, the channel is opened for reading.

あなたOpenOptionsは不十分です。あなたの例でWritableByteChannel channel = Files.newByteChannel(filePath, StandardOpenOption.CREATE, StandardOpenOption.APPEND);を設定すると、Windows上にファイルが作成されますが、最終的にはBufferOverflowになります。

+0

私は修正されたコードを質問に入れようとしています。なぜなら、うまくいきますが、それはうんざり遅いので、うまくいけば何かが間違っているからです。 – Dov

+1

回答があなたにとって根本的な解決策であった場合、それを受け入れることは自由です;) – DrHopfen

+0

@Dov書き込みの後に 'BufferOverflowException'を解決するには' buf.compact() 'が必要です。 – EJP

関連する問題