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

标签 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("test.txt");
    int rc = in.read(buffer);
    while (rc != -1) {
        System.out.print(new String(buffer));
        rc = in.read(buffer);
    }
}
}

一个文本文件,它没有输出正确的内容。输出大于输入。

示例:http://pastebin.com/r5uGfYgD

我知道这是因为缓冲区大小。但我怎样才能告诉它在文件结束后停止读取呢?

编辑:

现在它可以工作了,这里有完整的源代码。多谢!如果有人有一些改进:告诉我!

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;
}
}

最佳答案

使用 String(bytes[], offset, length) 怎么样?构造函数?

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));
}

关于java - 将文件读取到具有固定缓冲区大小的 byte[] 会生成重复的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19349782/

相关文章:

caching - 如何在 Haskell 中进行复杂的 IO 处理和隐式缓存?

Java 打印流问题

c - 了解具有内存分配的 C 代码示例

Java EE - DAO DVO

java - Android IntentReceiver 泄露

java - Vaadin 中当前 UI 的访问方法

java - MongoDB : how to get all elements that contain an array using Java Driver?

c# - 从 C# 中的文件字段流式传输

java gui swing 操作用户输入

java - VBO Java LWJGL 带鼠标+键盘