使用FileChannel和FileInput / OutputStream-Java进行读/写

时间:2015-11-09 03:05:52

标签: java io filechannel

我是文件处理的新手。我尝试使用fileinputstream和文件通道读取文件。我无法在以下代码中找到该错误。它运行成功但文件尚未传输。使用零字节创建新文件。请查看代码并检查出现了什么问题

public class FileTest
{
    public static void main(String[] args)
    {   
        try {
            File file = new File("sss.jpg");
            FileChannel inChannel=new FileInputStream(file).getChannel();
            //FileChannel inChannel = in.getChannel();
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while(inChannel.read(buffer) > 0) {
                FileChannel outChannel=new FileOutputStream("sss1.jpg",true).getChannel();
                outChannel.write(buffer);
            }
        }
        catch(IOException ex) {}
    }
}

3 个答案:

答案 0 :(得分:1)

我做这样的事情,

import java.io.IOException;
import java.nio.channels.FileChannel;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Test_Stuff {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        String thisFile = "Test.java";
        FileInputStream source = new FileInputStream(thisFile);
        FileOutputStream destination = new FileOutputStream("Output.java");
        FileChannel sourceFileChannel = source.getChannel();
        FileChannel destinationFileChannel = destination.getChannel();
        long size = sourceFileChannel.size();
        sourceFileChannel.transferTo(0, size, destinationFileChannel);
    }
}

答案 1 :(得分:1)

while(inChannel.read(buffer) > 0) {
    FileChannel outChannel=new FileOutputStream("sss1.jpg",true).getChannel();
    outChannel.write(buffer);
}
  1. 您每次在循环中创建新文件。好的,你可以追加,但效率不高,而且你永远不会关闭它。
  2. 你忘了翻转并压缩缓冲区。

    FileChannel outChannel = new FileOutputStream("sss1.jpg").getChannel();
    while(inChannel.read(buffer) > 0) {
        buffer.flip();
        outChannel.write(buffer);
        buffer.compact();
    }
    outChannel.close();
    inChannel.close();
    

答案 2 :(得分:0)

您应该完全按照EJP'sAchintha Gunasekara's回答。你正在做很多不好的事情(例如,创建许多输出通道,而不是使用FileChannel::open等)。但我认为基本问题不是致电flip。来自javadoc

  

翻转此缓冲区。限制设置为当前位置然后   位置设置为零。如果定义了标记,那么它就是   丢弃。在一系列通道读取或放置操作之后,调用   这种方法准备一系列的通道写入或相对获取   操作。例如:

 buf.put(magic);    // Prepend header
 in.read(buf);      // Read data into rest of buffer
 buf.flip();        // Flip buffer
 out.write(buf);    // Write header + data to channel
     

此方法通常与紧凑方法结合使用时   将数据从一个地方传输到另一个地方。