2015-02-14 3 views
0

Я пытаюсь изучить Java, и я столкнулся с этой практической проблемой, в которой я должен создать экстрактор URL. Я могу передавать данные и печатать их. Однако я не очень хорошо знаком с буферизованным читателем, поэтому мне нужна помощь в создании буфера в 100 байт, копировании 100 байтов данных из потока в этот массив байтов, затем обрабатываем эту часть, а затем берем следующий фрагмент из 100 байт из поток и т. д.хранить фиксированные байты в массив байтов из потока ввода

Следующий мой код и любая помощь будут очень признательны.

Я знаю, что то, что я хочу, должно выполняться внутри цикла while. Я думаю, мне нужно создать массив байтов, а затем сохранить в нем данные. Это то, как меня больше интересует.

EDIT: Мне не нужен образец кода ни для чего, потому что я пытаюсь учиться. Только описания того, как я могу это сделать, будет достаточно. Заранее большое спасибо.

+0

Если вы хотите обработать байты, то почему вы используете Reader? (Читатель для символов, InputStream для байтов) – immibis

+0

@immibis Я не уверен, как мне нужно решить эту проблему. Но то, что я действительно хочу сделать, это прочитать символы из потока, сохранить их в массив байтов, пока не будет достигнуто 100 байт данных. Затем сделайте все, что я хочу сделать с этим массивом, и снова заполните массив следующим набором символов, пока в байтовый массив не будет заполнено 100 байт данных. Вы понимаете? –

ответ

0
  1. Создайте массив байтов (нужного размера) вне своего цикла while (вы можете повторно использовать его таким образом, чтобы он был быстрее).
  2. Вы можете использовать BufferedInputStream, обернутый вокруг вашего оригинала InputStream вместо Reader (так как читатели могут преобразовывать байты в строки, но нам это не нужно).
  3. Затем вы можете использовать метод read(byte[])BufferedInputStream для копирования следующей серии байтов в массив. Затем вы можете обрабатывать извлеченные байты так, как вы хотите.

См. the API documentation в качестве ссылки того, что read(byte[]).

+0

Можете ли вы объяснить шаг 2 немного больше, пожалуйста? Как я могу реализовать BufferedInputStream вместо BufferedReader в моем коде? –

0

Как указано в комментариях, Reader (и его подкласс BufferedReader) используется для чтения символов, а не байтов. Вместо этого вы должны использовать BufferedInputStream для чтения в байтовый массив заданного размера:

public static void main(String[] args) throws IOException { 
    String website = "thecakestory.com"; 
    Socket client = new Socket(InetAddress.getByName(website), 80); 

    PrintWriter pw = new PrintWriter(client.getOutputStream()); 

    pw.println("GET /index.php/HTTP/1.1\r\n"); 
    pw.println("Host: " + website); 
    pw.flush(); 

    BufferedInputStream input = new BufferedInputStream(client.getInputStream()); 

    String x; 
    int bytesRead; 
    byte[] contents = new byte[100]; 
    while ((bytesRead = input.read(contents)) != -1) { 
     x = new String(contents, 0, bytesRead); 
     System.out.print(x); 
    } 

    client.close(); 
    pw.close(); 

} 

Некоторые полезные ссылки:

Введение в Java IO связанные вещи можно найти в учебнике страницу Java http://docs.oracle.com/javase/tutorial/essential/io/. Это должно быть отправной точкой для изучения потоков, считыватели и т.д.

Для документирования BufferedInputStream и BufferedReader, видеть их ссылки API:

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

+0

Как настроить BufferedInputStream из приведенного выше кода? Вы можете объяснить это немного больше? Извините, но я ноб для Java, поэтому не могу понять, как это работает? –

+0

Обновлено.Вы можете создать его, указав входной поток сокета 'client.getInputStream()', немного похожий на то, как вы делали с «BufferedReader». – manouti

+0

Это работает! Большое спасибо. Можете ли вы дать мне несколько ссылок, где я могу прочитать, как они работают? Я все еще не понимаю, что на самом деле делает BufferedReader или BufferedInputStream. –

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