Java 8 - 程序没有读取文件,但似乎在写

时间:2015-06-29 06:19:16

标签: java file-io

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.Files;
import java.nio.file.OpenOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.HashSet;
import java.util.Set;

public class RAFRead {

    public static void main(String[] args) {
        create();
        read();
    }

    public static void create() {
        // Create the set of options for appending to the file.
        Set<OpenOption> options = new HashSet<OpenOption>();
        options.add(StandardOpenOption.APPEND);
        options.add(StandardOpenOption.CREATE);
        // Create the custom permissions attribute.
        Set<PosixFilePermission> perms = PosixFilePermissions
                .fromString("rw-r-----");
        FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions
                .asFileAttribute(perms);
        Path file = Paths.get("./outfile.log");
        ByteBuffer buffer = ByteBuffer.allocate(4);
        try {
            SeekableByteChannel sbc = Files.newByteChannel(file, options, attr);
            for (int i = 9; i >= 0; --i) {
                sbc = sbc.position(i * 4);
                buffer.clear();
                buffer.put(new Integer(i).byteValue());
                buffer.flip();
                sbc.write(buffer);
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    public static void read() {     
        // Create the set of options for appending to the file.
        Set<OpenOption> options = new HashSet<OpenOption>();
        options.add(StandardOpenOption.READ);
        Path file = Paths.get("./outfile.log");
        ByteBuffer buffer = ByteBuffer.allocate(4);
        try {
            SeekableByteChannel sbc = Files.newByteChannel(file, options);
            int nread;
            do {
                nread = sbc.read(buffer);
                if(nread!= -1) {
                    buffer.flip();
                    System.out.println(buffer.getInt());
                }
            } while(nread != -1 && buffer.hasRemaining());
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
}

我首先创建文件 我试图将9,然后8,然后7等等放在文件中 但我试图使用随机访问以相反的顺序添加到文件 文件的输出实际上是按升序排列的数字 我只是以相反的顺序写入文件来尝试随机访问写作 之后我尝试读取文件并打印数据(数字) 它只打印0.我希望它打印1-9 我无法弄清楚原因。任何帮助表示赞赏

我在Oracle网站上点了这个链接:https://docs.oracle.com/javase/tutorial/essential/io/file.html

我运行这个程序后文件的大小,所以程序似乎正在编写 由于它是缓冲区读取,我无法通过vi或cat查看数据。

1 个答案:

答案 0 :(得分:0)

在致电flip()write()(以及朋友)之前,您需要get()缓冲区,然后再调用compact()