使用NIO编写文件时缺少新行

时间:2013-06-03 11:56:13

标签: java

我正在尝试将一个文件的内容复制到新文件中,并且在新文件中以某种方式丢失新行并将其创建为一行,我猜它与缓冲区位置有关。 按照我正在使用的代码..

List<String> lines;
        FileChannel destination = null;
        try
        {
            lines = Files.readAllLines(Paths.get(sourceFile.getAbsolutePath()), Charset.defaultCharset());
            destination = new FileOutputStream(destFile).getChannel();
            ByteBuffer buf = ByteBuffer.allocate(1024);
            for (String line : lines)
            {
                System.out.println(line);
                buf.clear();
                buf.put(line.getBytes());
                buf.flip();
                while (buf.hasRemaining())
                {
                    destination.write(buf);
                }
            }
        }
        finally
        {
            if (destination != null)
            {
                destination.close();
            }

        }

5 个答案:

答案 0 :(得分:4)

buff.put(System.getProperty("line.separator").toString());

之前buf.put(line.getBytes());

答案 1 :(得分:1)

您写入字节的行:

buf.put(line.getBytes());

...不包括换行符,你只是写每行的字节。您需要在每个实例之后单独编写新行字符。

答案 2 :(得分:1)

您可能更喜欢使用Java 7的Files.copy:

Files.copy(sourceFile.toPath(), destinationFile.toPath(),
        StandardCopyOption.REPLACE_EXISTING);

一个人应该自己写一个文件副本。 但是,您当前的版本使用默认平台编码将文件作为文本读取。这在UTF-8(一些非法的多字节序列)上出错,在\u0000 nul char上,将行结尾转换为默认平台。

答案 3 :(得分:0)

这将包括新行:

   ByteBuffer bf = null;
   final String newLine = System.getProperty("line.separator");
   bf = ByteBuffer.wrap((yourString+newLine).getBytes(Charset.forName("UTF-8" )));

答案 4 :(得分:0)

您可以直接使用由System.lineSeparator()安装的System.getProperty("line.separator")

buff.put(System.lineSeparator().toString());