![](/img/trans.png)
[英]Write String with array as bytes to a file using DataOutputStream
[英]Java write individual bytes to DataOutputStream
我正在努力將單個字節寫入java中的DataOutputStream以獲取HTTP post請求。 帖子的結構如下:
/* Init Post */
URL PostToLink = new URL(GeneralArguments.get("PostLink_String"));
byte[] PostData = PutKeyedPostArgs.get("PostBody").getBytes("UTF-8");
HttpURLConnection Post_Request_Connection = (HttpURLConnection) PostToLink.openConnection();
Post_Request_Connection.setDoOutput(true);
Post_Request_Connection.setDoInput(false);
Post_Request_Connection.setRequestMethod("POST");
//Post_Request_Connection.setRequestProperty("charset", "utf-8");
Post_Request_Connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
Post_Request_Connection.setRequestProperty("Content-Length", Integer.toString(PostData.length));
Post_Request_Connection.setRequestProperty("Connection", "Keep-Alive");
Post_Request_Connection.setRequestProperty("User-Agent", UserAgent); // Defined earlier
Post_Request_Connection.setRequestProperty("Cookie", CookieVal); // Defined earlier
Post_Request_Connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
Post_Request_Connection.setRequestProperty("Accept-Encoding", "gzip,deflate,sdch");
Post_Request_Connection.setRequestProperty("Accept-Language", "en-US,en;q=0.8");
Post_Request_Connection.setInstanceFollowRedirects(false);
Post_Request_Connection.setUseCaches(false);
/* Obtain Write Stream */
DataOutputStream The_Post_Request_Write_Stream = new DataOutputStream(Post_Request_Connection.getOutputStream());
JOptionPane.showMessageDialog(null, PostData.length); // For Debugging
JOptionPane.showMessageDialog(null, "before for"); // For Debugging
/* Begin writing byte-by-byte to output stream */
for(int CurrentPostByte = 0; CurrentPostByte < PostData.length; CurrentPostByte++){
JOptionPane.showMessageDialog(null, CurrentPostByte); // For Debugging
byte[] TemporaryByteArray = new byte[]{PostData[CurrentPostByte]};
The_Post_Request_Write_Stream.write(TemporaryByteArray, CurrentPostByte, TemporaryByteArray.length);
/* Length should always be 1 */
}
由於某種原因,它在寫入第二個字節(PostData [1]中的一個字節)之后,它得到一個索引越界錯誤。 我似乎無法找出原因。
任何澄清或幫助表示贊賞。 謝謝。
看看你的代碼:
byte[] TemporaryByteArray = new byte[]{PostData[CurrentPostByte]};
The_Post_Request_Write_Stream.write(TemporaryByteArray, CurrentPostByte, TemporaryByteArray.length);
您將具有長度1
(一)的數組TemporaryByteArray
傳遞給write方法,但僅使用對PostData
數組有效的索引。
您可以通過將代碼更改為:
byte[] TemporaryByteArray = new byte[]{PostData[CurrentPostByte]};
The_Post_Request_Write_Stream.write(TemporaryByteArray, 0, TemporaryByteArray.length);
或者,更簡單
byte[] TemporaryByteArray = new byte[]{PostData[CurrentPostByte]};
The_Post_Request_Write_Stream.write(TemporaryByteArray, 0, 1);
或者,甚至更簡單
The_Post_Request_Write_Stream.write(PostData, CurrentPostByte, 1);
但是,當然,最好的解決方案是刪除無意義循環並立即寫入整個數組, The_Post_Request_Write_Stream.write(PostData);
而不是逐字節。
我受過良好教育的猜測是問題在於:
The_Post_Request_Write_Stream.write(TemporaryByteArray, CurrentPostByte, TemporaryByteArray.length);
write(byte[], int, int)
的參數write(byte[], int, int)
是:
byte[]
緩沖區 ,包含要寫入的數據 int
偏移量 ,它告訴緩沖區中您想要的數據從何處開始 int
長度 ,表示要寫入的字節數 問題在於傳遞給offset參數的值。 它是CurrentPostByte
,所以在第二次迭代中,你告訴它開始從索引1
讀取TemporaryByteArray
。 但是, TemporaryByteArray
始終是一個單元素數組,它在索引0
處只有一個int項。
你應該糾正這個:
The_Post_Request_Write_Stream.write(TemporaryByteArray, 0, TemporaryByteArray.length);
或者,更簡單地說,:
The_Post_Request_Write_Stream.write(TemporaryByteArray);
你沒有說哪一行拋出異常,但我猜它是
byte[] TemporaryByteArray = new byte[]{BuyData[CurrentPostByte]};
看起來你想在這里引用PostData。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.