2014-01-03 2 views
1

Я работаю над написанием отдельных байтов в DataOutputStream в java для HTTP-запроса. Сообщение структурировано, как, например:Java пишет отдельные байты в DataOutputStream

/* 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]) он получает индекс из Границы ошибок. Я не могу понять, почему.

Любые разъяснения или помощь приветствуются. Спасибо.

+0

Я не могу видеть свой код, но я думаю, что 'PostDate' имеет только 0 или 1 в нем, поэтому 'PostDate [1]' будет за пределами границ. – CodeChimp

+0

Вы получаете доступ к массиву с именем 'BuyData', а не' PostData' ...? Я не вижу нигде в этом коде, где обращается «PostData». – Vulcan

+0

Почему вы пишете байты, а не просто записываете все 'PostData' /' BuyData'? Также зачем использовать 'DataOutputStream', если вы пишете сырые байты? – millimoose

ответ

2

Посмотрите на свой код:

byte[] TemporaryByteArray = new byte[]{PostData[CurrentPostByte]}; 
The_Post_Request_Write_Stream.write(TemporaryByteArray, CurrentPostByte, TemporaryByteArray.length); 

Вы передаете массив TemporaryByteArray который имеет длину 1 (один) к методу записи, но использовать индексы действительные только для 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); 

Но, конечно же, лучшим решением было бы удаление петли нонсенса a nd записывать весь массив сразу, The_Post_Request_Write_Stream.write(PostData); вместо байта байтом.

+0

Это, казалось, исправить это спасибо. У меня создалось впечатление, что там, где он называется смещением, мне нужно было указать, где в выходном потоке писать байт. Спасибо. – SpencerD

0

Вы не сказали, какая линия бросает исключение, но я предполагаю, что это

byte[] TemporaryByteArray = new byte[]{BuyData[CurrentPostByte]}; 

Похоже, вы имели в виду, чтобы ссылаться на PostData здесь.

+0

Код был исправлен, прежде чем вы отправили свой ответ. Я переименовал некоторые переменные и пропустил это. Anywho, это, кажется, не проблема, но спасибо за ваш вклад и мои извинения за отсутствие переименования этой переменной. – SpencerD

1

Моей образованная догадка, что проблема здесь:

The_Post_Request_Write_Stream.write(TemporaryByteArray, CurrentPostByte, TemporaryByteArray.length); 

Параметров write(byte[], int, int) являются:

  • byte[]буфера, который содержит данные, которые будут написаны
  • intсмещение, которое сообщает, где в буфере данные Вы хотите начинается
  • intдлина который показывает, сколько байтов вы хотите написать

Проблема заключается в том, какое значение вы передаете параметр смещения. Это CurrentPostByte, поэтому на второй итерации вы скажете, чтобы начать читать TemporaryByteArray из индекса 1. Однако TemporaryByteArray всегда является одноэлементным массивом, он имеет только один элемент int в индексе 0.

Вы должны исправить, что:

The_Post_Request_Write_Stream.write(TemporaryByteArray, 0, TemporaryByteArray.length); 

Или, проще говоря,:

The_Post_Request_Write_Stream.write(TemporaryByteArray); 
+0

Это тоже сработало, но я принял ответ Хольгера, потому что он опубликовал первый. Я поддержал ваши, хотя, потому что это правильно. – SpencerD

Смежные вопросы