gpt4 book ai didi

Java:文件到字符串,使用缓冲区的问题,字节数组不干净

转载 作者:行者123 更新时间:2023-12-02 00:00:31 27 4
gpt4 key购买 nike

采用以下静态方法:

public static String fileToString(String filename) throws Exception {
FileInputStream fis = new FileInputStream(filename);
byte[] buffer = new byte[8192];
StringBuffer sb = new StringBuffer();
int bytesRead; // unused? weird compiler messages...
while((bytesRead = fis.read(buffer)) != -1) { // InputStream.read() returns -1 at EOF
sb.append(new String(buffer));
}
return new String(sb);
}

正如您所看到的,一切看起来都不错,并且非常适合小文本文件。但是,一旦您处理包含数千行的大文件,您就会遇到重复文本的问题。根据我的直觉,我认为 byte[] buffer 可以说是“不干净的”。所以我在方法中添加了以下行:

缓冲区=新字节[8192];

现在就是这样:

public static String fileToString(String filename) throws Exception {
FileInputStream fis = new FileInputStream(filename);
byte[] buffer = new byte[8192];
StringBuffer sb = new StringBuffer();
int bytesRead; // unused? weird compiler messages...
while((bytesRead = fis.read(buffer)) != -1) { // InputStream.read() returns -1 at EOF
sb.append(new String(buffer));
buffer = new byte[8192]; // added new line here
}
return new String(sb);
}

它是完美的,除了在静态方法返回的字符串末尾,我得到很多空字符(取决于缓冲区大小)。这是怎么回事?

最佳答案

实际上:// unused? weird compiler messages...

并不奇怪。你从来没有读过这篇文章。

怎么可能sb.append(new String(buffer));知道有多少字节写入缓冲区。

确切地说,这就是 bytesRead 发挥作用的地方。

所以你需要new String(bytes, offset, length)

public static String fileToString(String filename) throws Exception {
FileInputStream fis = new FileInputStream(filename);
byte[] buffer = new byte[8192];
StringBuffer sb = new StringBuffer();
int bytesRead; // unused? weird compiler messages...
while((bytesRead = fis.read(buffer)) != -1) { // InputStream.read() returns -1 at EOF
sb.append(new String(buffer,0,bytesRead));
buffer = new byte[8192];
bytesRead=0;
}
return new String(sb);
}

可能有效

关于Java:文件到字符串,使用缓冲区的问题,字节数组不干净,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14928349/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com