在Java程序(PC上的Eclipse ISE)中,我想从网站读取大量数据(大约1640188字节)。使用Wireshark,我可以看到这些数据以许多1460字节的块的形式出现。 当我使用下面的代码时,我只读取高层看到的第一个块(大小约为18000字节)。我该如何做其他方块?
@IBAction func addVariance(_ sender: Any) {
let csvString = "08-06-2019,10:00 AM,10:23 AM,23,Offline,Test"
let directoryURL = URL(string: "/Users/username/Desktop/CSVtest")
let fileURL = directoryURL!.appendingPathComponent("/variances.csv")
let data = NSData(data: csvString.data(using: String.Encoding.utf8, allowLossyConversion: false)!)
if FileManager.default.fileExists(atPath: fileURL.path) {
var err:NSError?
if let fileHandle = try? FileHandle(forUpdating: fileURL) {
fileHandle.seekToEndOfFile()
fileHandle.write(data as Data)
fileHandle.closeFile()
}
else {
print("Can't open fileHandle \(String(describing: err))")
}
}
else {
var err:NSError?
do {
try data.write(to: URL(fileURLWithPath: fileURL.path), options: .atomic)
} catch {
print(error)
}
}
}
答案 0 :(得分:3)
第一: 不要
int n = input.available();
byte[] mydataTab = new byte[n];
因为:
请注意,虽然InputStream的某些实现将返回 流中的字节总数,很多不会。从来没有 正确使用此方法的返回值分配缓冲区 打算将所有数据保存在此流中。
Java InputStream Documentation
第二: 尝试使用一些预定义的块大小进行阅读,这样就可以做到:
int chuncksize = 1024;
int sizeRead = input.read(mydataTab, 0, n);
其中sizeRead
是您读取的字节数。
并继续读取这些块,直到流式传输结束。