Используйте эту функцию:
static func returnFloatValue(data: NSMutableData) -> Float {
let bytes = [UInt8](data as Data)
var f: Float = 0
memcpy(&f, bytes, 4)
return f
}
И вы можете увидеть ее в действии здесь:
var initialValue: Float = 19.200
let data = NSMutableData(bytes: &initialValue, length: 4)
func returnFloatValue(data: NSMutableData) -> Float {
let bytes = [UInt8](data as Data)
var f: Float = 0
memcpy(&f, bytes, 4)
return f
}
var result:Float = returnFloatValue(data: data)
print("f=\(result)")// f=19.2
Оберните ваш InputStream фильтрующим:
class QuotedNewLineFilterInputStream extends FilterInputStream {
private boolean insideQuotes;
public QuotedNewLineFilterInputStream(InputStream in) {
super(in);
}
@Override
public int read() throws IOException {
int c = super.read();
if (c == '\"') {
insideQuotes = !insideQuotes;
}
if (insideQuotes && (c == '\n' || c == '\r')) {
c = read();
}
return c;
}
}
Это удалит LF и CR внутри двойных кавычек. Поскольку все они являются ASCII, а XML вероятен в UTF-8, можно работать на байтовом уровне (InputStream).
Кстати, замена на \t
может лучше сохранить макет (c =
\ t 'i.o. c = read()
).
Не очень умный, но простое решение.
Если чтение файла размером 174 МБ с Files.readAllBytes(Paths.get(path));
вызывает OutOfMemoryError
, то вам не удалось увеличить предел памяти с -Xmx8g
. При использовании кучи памяти объемом 8 ГБ не должно быть проблем с выделением 174 МБ непрерывной памяти для byte[]
Дважды проверьте, как вы прошли флаг -Xmx
. Вы можете проверить параметры времени выполнения JVM, подключившись к работающему JVM-серверу с помощью JConsole, JVisualVM или другого инструмента. Взгляните на Использование JConsole , в котором показано, как проверить параметры времени выполнения JVM, например, Вкладка «Память».