读取大量数据

时间:2019-08-06 15:43:54

标签: java eclipse urlconnection

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

1 个答案:

答案 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是您读取的字节数。 并继续读取这些块,直到流式传输结束。