【问题标题】:i want java stream channel like filewriter我想要像filewriter这样的java流通道
【发布时间】:2017-06-07 16:17:00
【问题描述】:

我只想要 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();
        //}

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

如何使用 fos 和 filechannel 编写像这样的 '2017-06-08#ABCD#'?

【问题讨论】:

  • 这是您使用 Unicode 字符集的 UTF-16 编码编写的问题和/或不知道如何验证?见ByteBuffer.putChar(char)。您如何得出结论是“2 0 1 7 - 0 6 - 0 8”?
  • 我检查了书面文件。在那个文件中。书面字符串是“2 0 1 7 -”,而不是“2017-”+ 我会检查你的链接。谢谢
  • 当一个文本文件被写入时,它具有特定的字符编码。当您阅读它时,您必须使用相同的编码。 (编辑和人们喜欢猜测。调试人员喜欢假设一些简单的事情。除非他们是对的,否则他们都是错的。)

标签: java fileoutputstream filechannel


【解决方案1】:

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

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

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

如果你的字符都是 ascii 格式,你可以简单地通过转换将它们写成单个字节。 buf.put((byte)ch) 应该给你你所期望的。

【讨论】:

  • 其实我写的是 Unicode 文本。 :
  • @LocketGoma 不,您没有在原始示例中编写 Unicode。通过使用FileWriter(File, boolean),运行您的程序的人在启动程序时使用他们的默认字符集和编码。
  • @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[]) 方法。使用您想要的字符集执行put(menu.getBytes(CHAR_SET));(例如private static final CHAR_SET = Charset.forName("UTF-8");
猜你喜欢
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2020-03-07
  • 2019-10-18
  • 1970-01-01
  • 2021-10-06
相关资源
最近更新 更多