2016-09-28 34 views
0

我有一個字符串對象,現在是因爲它來自包含不同文件類型的文件夾的差異,而不是其中的所有內容都編碼在相同的字符集中。在Groovy中寫入一個沒有任何字符轉換的磁盤字符串

正確的代碼在字符串中,但每當我嘗試訪問字符串時,groovy都會嘗試幫助並解碼字符串,從而導致混亂。

下面的配置似乎做什麼,我需要

String decoded_diff = "String that contains codes from different character encodings" 
patch_file_name = 'changes.patch' 
patch_file = new File(pwd(), patch_file_name) 
patch_file.delete() 
max_block_size = 1024 * 1024 
char[] char_buffer = new char[max_block_size] 
block_start = 0 
patch_length = decoded_diff.length() 
while (true) { 
    block_size = Math.min(patch_length - block_start, max_block_size) 
    decoded_diff.getChars(block_start, block_start + block_size, char_buffer, 0) 
    block_start += block_size 
    byte[] byte_buffer = new byte[block_size] 
    for (int i = 0; i < block_size; i++) { 
     byte_buffer[i] = (int) char_buffer[i] 
    } 
    patch_file.append(byte_buffer) 
    if (block_start == patch_length) break 
} 

然而,sloooow

是否有快速的方式來達到同樣的事情?最終的補丁文件必須與原始的差異文件相同。不幸的是,我不能發送文件本身(jenkins目前不支持管道作業中的文件參數),所以我必須將其轉義並作爲json參數列表的一部分發送,因此在接收端會出現這種令人痛苦的結果。

+1

爲什麼不能讀取文件的字節?而不是閱讀字符串? –

+0

我沒有閱讀文件。當我說我沒有發送文件時,或許我不夠清楚。這段代碼位於接收端,所以String對象實際上來自POST請求中表單的json對象。 –

+0

哦,當我說這很慢時,我的意思是。它現在正在研究一個400k文件,時間和10分鐘,這對我來說絕對沒有意義。這是否與jenkins內部運行有關? –

回答

0

爲什麼不:

String decoded_diff = "String that contains codes from different character encodings" 
patch_file_name = 'changes.patch' 
patch_file = new File(pwd(), patch_file_name) 
patch_file.delete() 

patchFile.withOutputStream { os -> 
    os << decoded_diff.bytes 
} 
+0

不幸的是,這是崩潰。發生錯誤java.io.NotSerializableException:java.io.BufferedOutputStream [管道]管道 java.io.NotSerializableException結束:java.io.BufferedOutputStream \t在org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller。 java:860) \t at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) –

+0

@JonHodgson Ahhh,它可能試圖序列化腳本的返回值...嘗試添加'null'作爲'}' –

+0

之後的最後一行我並不真正理解這個目的,但它沒有幫助。我發現使用Jenkins內部的Groovy,有些事情並不像預期的那樣工作,這使得Groovy的新手生活變得更加困難 –

相關問題