我想要像java文件编写器一样的java流通道

时间:2017-06-07 16:17:00

标签: java fileoutputstream filechannel

我只希望fileoutputstream像filewriter一样风格

像这样

//filewriter code
        try {
        File file = ('some file link');
        fw=new FileWriter(file,true);
        fw.write("2017-06-08");
        fw.write("#");//separator
        fw.write("ABCD");
        fw.write("#");//separator
        fw.write("\r\n");
        fw.flush();
    } 

是在文件中回答:: 2017-06-08#ABCD#

但我想要文件锁,所以请使用fos& channel。

try {   
        //date = string "2017-06-08", menu= string"ABCD"
        fos = new FileOutputStream('file_addr',true);
        channel = fos.getChannel();
        lock=channel.tryLock();
        //if (lock==null){ //<- not yet work
        //  channel.close();
        //  throw new Exception();
        //}

        ByteBuffer buf = ByteBuffer.allocate(512);

        for (char ch : date.toCharArray())
            buf.putChar(ch);


            buf.putChar('#');

        for (char ch : menu.toCharArray())
            buf.putChar(ch);



            buf.putChar('\r');

            buf.putChar('\n');
            buf.rewind();
        channel.write(buf);


        //if (lock!=null){
        //  lock.release();
        //  channel.close();
        //}

但不起作用。输出是&#39; 2 0 1 7 - 0 6 - 0 8&#39;(和粉碎)

怎么写这样的&#39; 2017-06-08#ABCD#&#39;使用fos&amp; filechannel?

1 个答案:

答案 0 :(得分:0)

ByteBuffer.putChar()的文档解释了您遇到的问题。

  

以当前字节顺序将包含给定char值的两个字节写入当前位置的此缓冲区,然后将位置递增2。

换句话说,putChar()写一个UTF-16字符(以便可以使用getChar()读取)。这可能不是你想要的。

如果你的所有字符都在ascii中,你可以简单地通过强制它们将它们写成单个字节。 buf.put((byte)ch)应该能满足你的期望。