Java 将文件读取到具有固定缓冲区大小的字节[]会生成重复输出

Java 将文件读取到具有固定缓冲区大小的字节[]会生成重复输出,java,io,Java,Io,如果我通过 package net.example; import java.io.FileInputStream; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { byte[] buffer = new byte[1024]; FileInputStream in = new FileInputStream

如果我通过

package net.example;

import java.io.FileInputStream;
import java.io.IOException;

public class Test {

public static void main(String[] args) throws IOException {
    byte[] buffer = new byte[1024];
    FileInputStream in = new FileInputStream("test.txt");
    int rc = in.read(buffer);
    while (rc != -1) {
        System.out.print(new String(buffer));
        rc = in.read(buffer);
    }
}
}
一个文本文件,它不会输出正确的内容。输出大于输入

例如:

我知道这是因为缓冲区的大小。但我如何告诉它在文件结束后停止读取

编辑:

现在它工作了,这里是完整的源代码。谢谢!如果有人有什么改进:告诉我

package net.example;

import java.io.FileInputStream;
import java.io.IOException;

import fr.cryptohash.Digest;
import fr.cryptohash.MD5;

public class Test {

public static void main(String[] args) throws IOException {
    Digest dig = new MD5();
    byte[] srcBuffer = new byte[102400];
    byte[] buffer = null;

    FileInputStream in = new FileInputStream("text.txt");

    int rc = -1;
    while ((rc = in.read(srcBuffer)) != -1) {
        buffer = new byte[rc];

        System.arraycopy(srcBuffer, 0, buffer, 0, rc);
        dig.update(buffer);
    }
    System.out.println(toHex(dig.digest()));
}

private static String toHex(byte[] hash) {
    char[] HEX_CHARS = "0123456789abcdef".toCharArray();

    StringBuilder sb = new StringBuilder(hash.length * 2);
    for (byte b : hash) {
        sb.append(HEX_CHARS[(b & 0xF0) >> 4]);
        sb.append(HEX_CHARS[b & 0x0F]);
    }
    String hex = sb.toString();

    return hex;
}
}
使用构造函数怎么样

byte[] buffer = new byte[1024];
FileInputStream in = new FileInputStream("input.txt");
int rc = -1;
while ((rc = in.read(buffer)) != -1) {
    System.out.print(new String(buffer, 0, rc));
}
使用构造函数怎么样

byte[] buffer = new byte[1024];
FileInputStream in = new FileInputStream("input.txt");
int rc = -1;
while ((rc = in.read(buffer)) != -1) {
    System.out.print(new String(buffer, 0, rc));
}
使用构造函数怎么样

byte[] buffer = new byte[1024];
FileInputStream in = new FileInputStream("input.txt");
int rc = -1;
while ((rc = in.read(buffer)) != -1) {
    System.out.print(new String(buffer, 0, rc));
}
使用构造函数怎么样

byte[] buffer = new byte[1024];
FileInputStream in = new FileInputStream("input.txt");
int rc = -1;
while ((rc = in.read(buffer)) != -1) {
    System.out.print(new String(buffer, 0, rc));
}


如果需要将文件内容读取到字节[],可以使用ByteArrayOutputStream或使用具有“读取到字节[]”util方法的commons io。

如果需要将文件内容读取到字节[],可以使用ByteArrayOutputStream或具有“读取到字节[]”的commons ioutil方法。

如果需要将文件内容读取到字节[],可以使用ByteArrayOutputStream或使用具有“读取到字节[]”util方法的commons io。

如果需要将文件内容读取到字节[],可以使用ByteArrayOutputStream或具有“读取到字节[]”util方法的commons io。

谢谢!这太棒了!但是现在我需要纯字节[],有没有办法截断它自己的字节[]?它可以用
新字符串(缓冲区,0,rc).getBytes()
来实现,但我不确定这是否非常有效:(我不确定在没有
rc
的情况下这是否可行。也许其他一些答案会有更多信息。@user2765509无论如何,您需要在哪里使用
getBytes()的结果)
?如果您希望它作为标准Java方法中的某个参数,那么还应该有一个可以传递
rc
的版本,就像每个OutputStream都有
write(b,off,len)
方法一样。我需要它来生成它的散列。通过sphlib()。我需要使用它,因为如果文件太大。我的内存不足。它的更新方法只接受一个字节数组。您可以使用System.arrayCopy()将一个字节[]复制到另一个字节,但无论如何,您应该在代码中使用rc谢谢!这很好!但目前我需要纯字节[]有办法截断字节[]吗它本身?它可以使用
新字符串(缓冲区,0,rc).getBytes()
来实现,但我不确定这是否非常有效:(我不确定没有
rc
是否可以实现。也许其他一些答案会有更多信息。@user2765509不管怎样,您需要在哪里使用
getBytes()的结果)
?如果您希望它作为标准Java方法中的某个参数,那么还应该有一个可以传递
rc
的版本,就像每个OutputStream都有
write(b,off,len)
方法一样。我需要它来生成它的散列。通过sphlib()。我需要使用它,因为如果文件太大。我的内存不足。它的更新方法只接受一个字节数组。您可以使用System.arrayCopy()将一个字节[]复制到另一个字节,但无论如何,您应该在代码中使用rc谢谢!这很好!但目前我需要纯字节[]有办法截断字节[]吗它本身?它可以使用
新字符串(缓冲区,0,rc).getBytes()
来实现,但我不确定这是否非常有效:(我不确定没有
rc
是否可以实现。也许其他一些答案会有更多信息。@user2765509不管怎样,您需要在哪里使用
getBytes()的结果)
?如果您希望它作为标准Java方法中的某个参数,那么还应该有一个可以传递
rc
的版本,就像每个OutputStream都有
write(b,off,len)
方法一样。我需要它来生成它的散列。通过sphlib()。我需要使用它,因为如果文件太大。我的内存不足。它的更新方法只接受一个字节数组。您可以使用System.arrayCopy()将一个字节[]复制到另一个字节,但无论如何,您应该在代码中使用rc谢谢!这很好!但目前我需要纯字节[]有办法截断字节[]吗它本身?它可以使用
新字符串(缓冲区,0,rc).getBytes()
来实现,但我不确定这是否非常有效:(我不确定没有
rc
是否可以实现。也许其他一些答案会有更多信息。@user2765509不管怎样,您需要在哪里使用
getBytes()的结果)
?如果您希望它作为标准Java方法中的某个参数,那么还应该有一个可以传递
rc
的版本,就像每个OutputStream都有
write(b,off,len)
方法一样。我需要它来生成它的散列。通过sphlib()。我需要使用它,因为如果文件太大。我的内存不足。它的更新方法只接受字节数组。您可以使用System.arrayCopy()将一个字节[]复制到另一个字节,但无论如何,您应该在代码中使用rc。一个可能的改进是,如果rc==srcBuffer.length,您可以避免创建数组的副本,而直接使用srcBuffer。这可能会大大加快速度,因为分配和复制需要相当多的时间,对于一个大文件,rc将多次等于srcBuffer.length(在最后一次迭代中)它很短。@Jules谢谢!在一个100GB的文件上可以节省大约20秒:)。一个可能的改进是,如果rc==srcBuffer.length,则可以避免创建数组的副本,而直接使用srcBuffer。这可能会大大加快速度,因为分配和复制需要相当长的时间,并且对于大文件,rc将在之前多次等于srcBuffer.length(在最终迭代中)它很短。@Jules谢谢!在一个100GB的文件上可以节省大约20秒:)。一个可能的改进是,如果rc==srcBuffer.length,则可以避免创建数组的副本,而直接使用srcBuffer。这可能会大大加快速度,因为分配和复制需要相当长的时间,并且对于大文件,rc将在之前多次等于srcBuffer.length(在最终迭代中)它很短。@Jules谢谢!在100GB文件上可以节省大约20秒:)。一个可能的改进是,如果rc==srcBuffer.length,可以避免复制数组和