я хочу потоковый канал java, такой как filewriter

я просто хочу, чтобы 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' (и раздавлен)

как можно написать так «2017-06-08#ABCD#», используя fos и filechannel?


person LocketGoma    schedule 07.06.2017    source источник


Ответы (1)


Документация для ByteBuffer.putChar() объясняет проблему, с которой вы столкнулись.

Записывает два байта, содержащие заданное значение char, в текущем порядке байтов, в этот буфер в текущей позиции, а затем увеличивает позицию на два.

Другими словами, putChar() записывает символ UTF-16 (чтобы его можно было прочитать с помощью getChar()). Это, вероятно, не то, что вы хотите.

Если ваши символы все в ascii, вы можете записать их как одиночные байты, просто приведя их. buf.put((byte)ch) должен дать вам то, что вы ожидали.

person David Narum    schedule 07.06.2017
comment
на самом деле я пишу текст Unicode. : ‹ (поскольку строка записи не является алфавитом) - person LocketGoma; 07.06.2017
comment
@LocketGoma Нет, в исходном примере вы не пишете Unicode. Используя FileWriter(File, boolean), человек, который запускает вашу программу, использует свой набор символов и кодировку по умолчанию во время запуска программы. - person Tom Blodget; 07.06.2017
comment
@Tom Blodget, это моя ошибка ... Строка положения 'ABCD' - это строка, установленная в юникоде. мне жаль. - person LocketGoma; 07.06.2017
comment
Также Unicode может быть UTF-8, UTF-16, UTF-32 и т. д., вам нужно знать, какой именно. Если у вас есть выбор, выберите UTF-8, но внутри java используется UTF-16. Это важно, потому что UTF-8 обычно составляет 1 байт, а UTF-16 обычно составляет 2 байта. - person Novaterata; 07.06.2017
comment
Если вы хотите записать текст Unicode с помощью ByteBuffer, вам придется использовать метод put(byte[]). Сделайте put(menu.getBytes(CHAR_SET));, используя нужный набор символов (например, private static final CHAR_SET = Charset.forName("UTF-8");) - person David Narum; 09.06.2017