2012-03-12 207 views
6

我已經創建了CSVReader,並且我正在嘗試從資產中讀取csv文件,因此我應該使用InputStream。但我下面的代碼沒有inputstream構造函數。任何人都可以告訴我如何在代碼中添加或更改某些內容,所以我可以使用inputstream。CSVReader和InputStream

public class CSVReader { 

    private BufferedReader br; 

    private boolean hasNext = true; 

    private char separator; 

    private char quotechar; 

    private int skipLines; 

    private boolean linesSkiped; 

    public int linesCount = 0; 

    public static final char DEFAULT_SEPARATOR = '|'; 
    public static final char DEFAULT_QUOTE_CHARACTER = '"'; 
    public static final int DEFAULT_SKIP_LINES = 0; 

    public CSVReader(Reader reader) { 
     this(reader, DEFAULT_SEPARATOR, DEFAULT_QUOTE_CHARACTER, 
      DEFAULT_SKIP_LINES); 
    } 

    public CSVReader(Reader reader, char separator, char quotechar, int line) { 
     this.br = new BufferedReader(reader); 
     this.separator = separator; 
     this.quotechar = quotechar; 
     this.skipLines = line; 
    } 
    public String[] readNext() throws IOException { 

     String nextLine = getNextLine(); 
     return hasNext ? parseLine(nextLine) : null; 
    } 

    public String getNextLine() throws IOException { 
     if (!this.linesSkiped) { 
      for (int i = 0; i < skipLines; i++) { 
       br.readLine(); 
      } 
      this.linesSkiped = true; 
     } 
     String nextLine = br.readLine(); 
     if (nextLine == null) { 
      hasNext = false; 
     } 
     return hasNext ? nextLine : null; 
    } 


    public List<String[]> readAll() throws IOException { 

     List<String[]> allElements = new ArrayList<String[]>(); 
     while (hasNext) { 
      String[] nextLineAsTokens = readNext(); 
      if (nextLineAsTokens != null) 
       allElements.add(nextLineAsTokens); 
     } 
     return allElements; 

    } 

    private String[] parseLine(String nextLine) throws IOException { 

     if (nextLine == null) { 
      return null; 
     } 

     List<String> tokensOnThisLine = new ArrayList<String>(); 
     StringBuffer sb = new StringBuffer(); 
     boolean inQuotes = false; 
     do { 
      if (inQuotes) { 
       // continuing a quoted section, reappend newline 
       sb.append("\n"); 
       nextLine = getNextLine(); 
       linesCount++; 
       if (nextLine == null) 

        break; 
      } 
      for (int i = 0; i < nextLine.length(); i++) { 

       char c = nextLine.charAt(i); 
       if (c == quotechar) { 
        if(inQuotes 
         && nextLine.length() > (i+1) 
         && nextLine.charAt(i+1) == quotechar){ 
         sb.append(nextLine.charAt(i+1)); 
         i++; 
        }else{ 
         inQuotes = !inQuotes; 
         if(i>2 
           && nextLine.charAt(i-1) != this.separator 
           && nextLine.length()>(i+1) && 
           nextLine.charAt(i+1) != this.separator 
         ){ 
          sb.append(c); 
         } 
        } 
       } else if (c == separator && !inQuotes) { 
        tokensOnThisLine.add(sb.toString()); 
        sb = new StringBuffer(); 
       } else { 
        sb.append(c); 
       } 
      } 
     } while (inQuotes); 
     tokensOnThisLine.add(sb.toString()); 
     return (String[]) tokensOnThisLine.toArray(new String[0]); 

    } 

    public void close() throws IOException{ 
     br.close(); 
    } 

} 

回答

15

您可以從InputStream的

new InputStreamReader(myInputStream, encoding) 

哪裏myInputStream是您InputStreamencoding構建InputStreamReaderString定義你的數據源使用的編碼。

你可以叫你的CSVReader這樣的:

new CSVReader(new InputStreamReader(myInputStream, encoding)); 
+1

*您真的應該*使用適當[兩個參數的構造(https://developer.android.com指定要用於讀取編碼/reference/java/io/InputStreamReader.html#InputStreamReader(java.io.InputStream,%20java.lang.String))。 – 2012-03-12 08:03:34

+0

我不明白如何做到這一點。你能否更具體地告訴我一下。 – fish40 2012-03-12 08:05:47

+0

@JoachimSauer你是對的,更新了答案 – oers 2012-03-12 08:06:58