我想要像filewriter一样的java流通道

我想要像filewriter一样的java流通道,java,fileoutputstream,filechannel,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");

我只希望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();
        //}
试试{
//日期=字符串“2017-06-08”,菜单=字符串“ABCD”
fos=新文件输出流(“文件地址”,true);
channel=fos.getChannel();
lock=channel.tryLock();

//如果(lock==null){/ByteBuffer.putChar()的文档解释了您遇到的问题

将包含给定字符值的两个字节按当前字节顺序写入当前位置的该缓冲区,然后将该位置增加两个字节

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


如果您的字符都是ascii格式,只需将它们转换为单个字节即可。buf.put((byte)ch)应该可以满足您的要求。

实际上我编写Unicode文本。<<(因为写入字符串不是字母表)@LocketGoma不,您在原始示例中没有编写Unicode。使用
FileWriter(文件,布尔值)
运行您的程序的人在启动程序时正在使用他们的默认字符集和编码。@Tom Blodget这是我的错误…“ABCD”位置字符串是unicode集字符串。对不起。unicode也可以是UTF-8、UTF-16、UTF-32等。您需要知道哪一个。如果您有选择,请选择UTF-8,但java使用UTF-16内部。这很重要,因为UTF-8通常为1字节,UTF-16通常为2字节。如果您希望使用ByteBuffer编写Unicode文本,则必须使用
put(byte[])
方法。Do
put(menu.getBytes(CHAR\u SET));
使用所需的字符集(例如
private static final CHAR\u SET=Charset.forName(“UTF-8”);
)问题在于您正在使用Unicode字符集的UTF-16编码进行写入和/或不知道如何验证?请参阅。您如何得出输出为“2 0 1 7-0 6-0 8”的结论?我检查了写入的文件。在该文件中。写入的字符串是“2 0 1 7-”,而不是“2017-”+我将检查您的链接。thx当写入文本文件时,它使用特定的字符编码。当您读取它时,您必须使用相同的编码。(编辑和人们喜欢猜测。调试器喜欢假设一些简单的东西。除非他们是对的,否则他们都错了。)