2015-11-01 81 views
1

我正在處理與Android的藍牙連接,我想讀取InputStream緩衝區,直到我得到某些特定字符(如'\ n'(換行)或任何其他字符並將緩衝區保留爲它是,然後再讀取以下字節,直到讀取相同的字符,以便將它們放在單獨的字符串中。我嘗試了幾種方法,但沒有成功,有人能幫助我嗎?Android InputStream。讀緩衝區,直到特定字符

我使用來獲取數據的代碼如下

public String getData() { 
    try { 
     inStream = btSocket.getInputStream(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    try { 
     inStream.read(inString); 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 

    String str= new String(inString, StandardCharsets.UTF_8); 

    return str; 
} 
+0

讀者classses的谷歌一行readline()和你完成了。 – greenapps

+0

謝謝。我看到這是專門爲'\ n'。但是其他特定字符怎麼樣? – mialver

+0

然後製作你自己的readline()。這很簡單。建立一個循環,逐個讀取字節並檢查字節是否包含該字符。將字節添加到您返回的緩衝區。 – greenapps

回答

1

如果你想讀的,直到你找到一個特定的char, 一個解決辦法是這樣的:

public static String readUntilChar(InputStream stream, char target) { 
    StringBuilder sb = new StringBuilder(); 

    try { 
     BufferedReader buffer=new BufferedReader(new InputStreamReader(stream)); 

     int r; 
     while ((r = buffer.read()) != -1) { 
      char c = (char) r; 

      if (c == target) 
       break; 

      sb.append(c); 
     } 

     System.out.println(sb.toString()); 
    } catch(IOException e) { 
     // Error handling 
    } 

    return sb.toString(); 
} 
+0

但是,您希望「再次讀取以下字節,直到讀取相同的字符以便將它們放入單獨的字符串中」,聽起來更像是需要 [String.split](https://docs.oracle.com)。 com/javase/7/docs/api/java/lang/String.html)後讀取完整緩衝區(?)。也許我只是瘋了:] 或者你的目標是閱讀一個流,說'here&combinetext&somemore',並從'&'讀直到'&'給你'bringtext'? –

0

最後,我得到了一個解決方案。我不知道它是否最適合,但它工作正常。我發佈代碼以防其他人使用。感謝您的迴應。

功能由焦炭得到輸入流字符:

public char getData() { 
    try { 
     inStream = btSocket.getInputStream(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    try { 
     inStream.read(inString,0,1); 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 

    String str= new String(inString, StandardCharsets.UTF_8); 

    inChar=str.charAt(0); 

    return inChar; 
    } 

功能以獲得所需的字符串時,字符「&」出現:

public void procesChar(char inChar){ 
     if(inChar=='&'){ 
      String str=new String(charBuffer); 
      countBytes=0; 
      Arrays.fill(charBuffer,(char)-1); 
     } 
     else { 
      charBuffer[countBytes] = inChar; 
      countBytes++; 
     } 
    } 
+0

'inStream.read(inString,0,1);'。什麼是inString?爲什麼不在本地聲明?如果它是一個字符串,那麼你是在問問題。 'String str = new String(inString,StandardCharsets.UTF_8);'。不要將一個字節或字符轉換爲字符串。當然不是utf-8,這是不可能的。你在問問題。也許代碼適合你。但它是非常糟糕的代碼。在接收字節時,使用Array類和char類也很糟糕。 – greenapps

+0

inString是一個字節[],是的,我應該在本地聲明它(已經改變了它)。使用定義的字符集創建字符串是我在輸入流數據的示例中看到的,它也可以在沒有它的情況下使用。 – mialver