在 java 中 Files IO 的最佳方式是什么

What is the best way for Files IO in java

提问人:aga 提问时间:5/19/2016 更新时间:11/15/2023 访问量:475

问:

我需要在java中对图像文件进行一些基本操作。我的要求是这样的:
- 打开一个文件。 - 按某种顺序读取字节。 - 在特定偏移量处写入更新的字节 - 在文件中寻找一些偏移量。

文件可以是任何大小,例如 2 GB 图像文件。

我想知道,考虑到 java 中的 IO 很慢,java 中的哪个类可以让我灵活地轻松完成所有这些操作并提高性能效率。

目前我正在考虑 FileChannel,但我不知道它在处理 GB 等较大文件时的性能。它还用于读取 ByteBuffer 中的文件字节,但如果文件足够大,是否适合同时读取所有字节或应该分块读取。如果我以块形式读取数据,块的合适大小是多少?

请指导我。

谢谢

java io 大文件 文件通道

评论

0赞 user207421 11/15/2023
“考虑到 Java 中的 I/O 很慢”:你从哪里得到这个动作。I/O 是 I/O。它受到多种因素的影响,但语言是其中最少的。

答:

2赞 hgrey 5/19/2016 #1

您可能应该使用 RandomAccessFile,它支持按位置搜索和写入。此外,我认为将 Java 中的 IO 描述为缓慢是不准确的,如果您正确使用 java.io,通常您可以实现类似 C 的性能。

-1赞 mubeen 5/19/2016 #2

您可以使用 Java 8 Stream 功能部件

Stream<String> lines = Files.lines(Paths.get(args[1]));

但是,如果您没有使用 Java-8。您使用包java.nio

如果我以块形式读取数据,块的合适大小是多少?

只能使用 1 KB 的缓冲区大小。

评论

0赞 user207421 11/15/2023
图像没有线条,问题陈述需要随机访问。
-1赞 smgcuv587 11/15/2023 #3

试试这个:

//readfile(byte stream)
    InputStream in = new FileInputStream("d:\\1.txt");
    //output file
    OutputStream out = new FileOutputStream("d:\\2.txt");
    //read data
    //how many bytes read in once
    byte[] bytes = new byte[2048];
    //receive data (n represents relative data,in this case, it's numeric )
    int n = -1;
    //loop get data
    while ((n = in.read(bytes,0,bytes.length)) != -1) {
        //transform to string
        String str = new String(bytes,0,n,"GBK"); # byte->string
        System.out.println(str);
        //write data
        out.write(bytes, 0, n);
    }
    //close stream
    in.close();
    out.close();

评论

1赞 user207421 11/15/2023
没有回答问题。