gpt4 book ai didi

java - 为什么在使用 String.valueOf 或 Float.toString 时此循环会变成无限循环?

转载 作者:行者123 更新时间:2023-11-30 11:20:08 25 4
gpt4 key购买 nike

我正在使用 FileInputStream 从文件中读取字节。代码(正确形式)如下:

String s = "";
try {
File file = new File(...);
FileInputStream file_input = new FileInputStream(file);
DataInputStream data_in = new DataInputStream(file_input );

while (true) {
try {
for (int index = 0; index < 4; index++) {
byteArray[index] = data_in.readByte();
}
} catch (EOFException eof) {
break;
}

float f = readFloatLittleEndian(byteArray); // transforms 4 bytes into a float
//s += Float.toString(f); <- here's the problem
}
data_in.close();
} catch (IOException e) {
System.err.println(e.toString());
}
}
System.out.print(s);

如果我按原样运行此代码,则在读取所有文件并将每组 4 个 bytes 转换为 float 时循环结束。

但是,如果我取消对该行的注释,该文件将永远不会完成,并且似乎一遍又一遍地循环遍历该文件。此外,打印 f(不使用 Float.toStringString.valueOf)不会将其变成无限循环。

最佳答案

循环不会变得无限——只是效率极低。 java.lang.String 上的 += 的问题是它会生成一个新的不可变对象(immutable对象),丢弃它之前持有的对象。每次它制作副本时,就文件中的条目数而言,该过程的复杂度为 O(n2)。

修复很简单 - 将 String s 替换为 StringBuilder s,并使用 append 代替 +=.

StringBuilder s = new StringBuilder();
try {
File file = new File(...);
FileInputStream file_input = new FileInputStream(file);
DataInputStream data_in = new DataInputStream(file_input );
while (true) {
try {
for (int index = 0; index < 4; index++) {
byteArray[index] = data_in.readByte();
}
} catch (EOFException eof) {
break;
}
float f = readFloatLittleEndian(byteArray); // transforms 4 bytes into a float
s.append(f);
}
data_in.close();
} catch (IOException e) {
System.err.println(e.toString());
}
System.out.print(s);

关于java - 为什么在使用 String.valueOf 或 Float.toString 时此循环会变成无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22900587/

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